@clay-design-system/kb 0.0.0-stage → 0.14.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/dist/contract.d.ts +227 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +134 -0
- package/dist/contract.js.map +1 -0
- package/dist/core/memory.d.ts +20 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +23 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/model.d.ts +47 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +21 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/prose.d.ts +40 -0
- package/dist/core/prose.d.ts.map +1 -0
- package/dist/core/prose.js +106 -0
- package/dist/core/prose.js.map +1 -0
- package/dist/core/query.d.ts +87 -0
- package/dist/core/query.d.ts.map +1 -0
- package/dist/core/query.js +637 -0
- package/dist/core/query.js.map +1 -0
- package/dist/core/rank.d.ts +123 -0
- package/dist/core/rank.d.ts.map +1 -0
- package/dist/core/rank.js +429 -0
- package/dist/core/rank.js.map +1 -0
- package/dist/core/route-email.d.ts +48 -0
- package/dist/core/route-email.d.ts.map +1 -0
- package/dist/core/route-email.js +172 -0
- package/dist/core/route-email.js.map +1 -0
- package/dist/core/route.d.ts +431 -0
- package/dist/core/route.d.ts.map +1 -0
- package/dist/core/route.js +1769 -0
- package/dist/core/route.js.map +1 -0
- package/dist/core/search.d.ts +64 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +123 -0
- package/dist/core/search.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/snapshot-email.json +1 -0
- package/dist/snapshot-foundations.json +1 -0
- package/dist/snapshot-web.json +1 -0
- package/package.json +28 -3
- package/README.md +0 -3
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prose utilities for the general `kb:lint` claim checks (K3 retry 2): split a unit into sentences,
|
|
3
|
+
* reduce a sentence to its significant tokens, and weigh tokens by rarity (IDF) over the corpus.
|
|
4
|
+
*
|
|
5
|
+
* Normalisation is deliberately simple and symmetric (both sides of every comparison go through it):
|
|
6
|
+
* - unit-id citations (`policy.x.y`) are removed (a citation is a link, not content);
|
|
7
|
+
* - Markdown punctuation is dropped; `gray` → `grey`; "back to back" / "next to each other" /
|
|
8
|
+
* "adjacent" / "consecutive" / "in a row" → `adjacent`;
|
|
9
|
+
* - numbers keep their unit (`64 px` → `64px`) and ranges become one token (`4–6` → `4to6`);
|
|
10
|
+
* - identifiers are split on `-` / `_` / camelCase is kept whole (`tabs-background` → tabs, background;
|
|
11
|
+
* `FeaturesSection` → featuressection);
|
|
12
|
+
* - English stop words and normative words (never/always/must/only/…) are not significant: the
|
|
13
|
+
* normative words mark a *rule* sentence but never count as shared content;
|
|
14
|
+
* - a light stemmer folds plurals and -ing/-ed.
|
|
15
|
+
*/
|
|
16
|
+
import { stem } from './rank.js';
|
|
17
|
+
export const UNIT_ID_RE = /`?\b(?:rule|policy|procedure|section|layout|component|item|limit|token|breakpoint|asset|recipe|gotcha|brand|stat|background|page|skill)\.[A-Za-z0-9][A-Za-z0-9_.+-]*[A-Za-z0-9]`?/g;
|
|
18
|
+
/** A sentence carries a rule when it says what to always / never / only do. */
|
|
19
|
+
export const NORMATIVE_RE = /\b(?:never|always|must|should|don'?t|do not|does not|doesn'?t|only|at most|at least|no more than|max(?:imum)?|min(?:imum)?|avoid|required?|not|cannot|can'?t|no)\b|≤|≥/i;
|
|
20
|
+
/**
|
|
21
|
+
* A sentence gives an instruction without a normative word: it opens with a base verb, optionally after a leading
|
|
22
|
+
* "When/Whenever/If …," clause ("Whenever a MediaSlot is a placeholder, give it a placeholderLabel …"). K4: candidate
|
|
23
|
+
* restatements are normative OR imperative sentences.
|
|
24
|
+
*/
|
|
25
|
+
export const IMPERATIVE_RE = /^(?:[-*]\s*)?(?:\*\*)?(?:(?:when|whenever|if|for|on|in)\b[^,]{3,80},\s*)?(?:add|avoid|choose|give|keep|label|make|name|pair|pass|pick|place|prefer|put|render|set|show|state|use|write|cap|limit|mark|wrap|split|stack|lead|open|close|end|start|ship)\b/i;
|
|
26
|
+
const STOP = new Set(('a an and are as at be been being but by can could did do does doing for from had has have having he her here hers his how i if in into is it its ' +
|
|
27
|
+
'itself just me more most my of off on once or other our out over own same she so some such than that the their them then there these they this ' +
|
|
28
|
+
'those through to too under until up very was we were what when where which while who whom why will with would you your yours each both few ' +
|
|
29
|
+
'any all also via per e g eg ie etc one use used using get gets set sets like make makes made way thing things whose instead').split(' '));
|
|
30
|
+
const NORMATIVE_WORDS = new Set('never always must should dont don do not doesnt does only most least no more than max maximum min minimum avoid require required cannot cant'.split(' '));
|
|
31
|
+
/** The light stemmer (folds plurals, -ing/-ed) lives with the search analyzer so lint and search stem alike. */
|
|
32
|
+
export { stem };
|
|
33
|
+
/** Text with citations, Markdown and phrasing variants normalised (still human-readable). */
|
|
34
|
+
export function normaliseText(s) {
|
|
35
|
+
return s
|
|
36
|
+
.replace(UNIT_ID_RE, ' ')
|
|
37
|
+
.replace(/\bgray\b/gi, 'grey')
|
|
38
|
+
.replace(/\b(?:back[\s-]to[\s-]back|next to each other|side by side with each other|adjacent(?:ly)?|consecutive(?:ly)?|in a row)\b/gi, ' adjacent ')
|
|
39
|
+
.replace(/(\d+)\s?px\b/gi, '$1px')
|
|
40
|
+
.replace(/(?<![\d.])(\d+)\s?[–—-]\s?(\d+)(?![\d.])/g, '$1to$2');
|
|
41
|
+
}
|
|
42
|
+
/** Significant, stemmed tokens of a sentence (a set). */
|
|
43
|
+
export function sigTokens(s) {
|
|
44
|
+
const out = new Set();
|
|
45
|
+
const t = normaliseText(s)
|
|
46
|
+
.replace(/[*_`>#|"'“”‘’()[\]{}]/g, ' ')
|
|
47
|
+
.toLowerCase();
|
|
48
|
+
for (const raw of t.split(/[^a-z0-9%]+/)) {
|
|
49
|
+
if (!raw)
|
|
50
|
+
continue;
|
|
51
|
+
if (raw.length < 2 && !/^\d$/.test(raw))
|
|
52
|
+
continue;
|
|
53
|
+
if (STOP.has(raw) || NORMATIVE_WORDS.has(raw))
|
|
54
|
+
continue;
|
|
55
|
+
out.add(stem(raw));
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
export const isNumericToken = (t) => /^\d/.test(t);
|
|
60
|
+
/** Sentences of a Markdown body: one per table row / list item / line, lines split on `. ` + capital and (unless `keepSemicolons`) on `; `. Code fences are skipped. */
|
|
61
|
+
export function sentences(text, opts = {}) {
|
|
62
|
+
const out = [];
|
|
63
|
+
let fence = false;
|
|
64
|
+
for (const line of text.split('\n')) {
|
|
65
|
+
if (/^\s*```/.test(line)) {
|
|
66
|
+
fence = !fence;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (fence)
|
|
70
|
+
continue;
|
|
71
|
+
const l = line.trim();
|
|
72
|
+
if (!l || /^\|?\s*:?-{3,}/.test(l))
|
|
73
|
+
continue;
|
|
74
|
+
if (l.startsWith('|')) {
|
|
75
|
+
out.push(l);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const parts = opts.keepSemicolons
|
|
79
|
+
? l.split(/(?<=[.!?])\s+(?=[A-Z`*(“"])/)
|
|
80
|
+
: l.split(/(?<=[.;!?])\s+(?=[A-Z`*(“"])|(?<=;)\s+/);
|
|
81
|
+
for (const part of parts)
|
|
82
|
+
if (part.trim().length > 2)
|
|
83
|
+
out.push(part.trim());
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
/** Inverse document frequency over a corpus of token sets: rare tokens weigh more. */
|
|
88
|
+
export function idfOf(docs) {
|
|
89
|
+
const df = new Map();
|
|
90
|
+
let n = 0;
|
|
91
|
+
for (const d of docs) {
|
|
92
|
+
n++;
|
|
93
|
+
for (const t of d)
|
|
94
|
+
df.set(t, (df.get(t) ?? 0) + 1);
|
|
95
|
+
}
|
|
96
|
+
return (t) => Math.log((n + 1) / ((df.get(t) ?? 0) + 1)) + 1;
|
|
97
|
+
}
|
|
98
|
+
export function intersect(a, b) {
|
|
99
|
+
const out = [];
|
|
100
|
+
const [small, big] = a.size <= b.size ? [a, b] : [b, a];
|
|
101
|
+
for (const x of small)
|
|
102
|
+
if (big.has(x))
|
|
103
|
+
out.push(x);
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=prose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/core/prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,MAAM,UAAU,GACrB,oLAAoL,CAAA;AAEtL,+EAA+E;AAC/E,MAAM,CAAC,MAAM,YAAY,GACvB,yKAAyK,CAAA;AAE3K;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,2PAA2P,CAAA;AAE7P,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,CACE,mJAAmJ;IACnJ,iJAAiJ;IACjJ,6IAA6I;IAC7I,6HAA6H,CAC9H,CAAC,KAAK,CAAC,GAAG,CAAC,CACb,CAAA;AACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,8IAA8I,CAAC,KAAK,CAClJ,GAAG,CACJ,CACF,CAAA;AAED,gHAAgH;AAChH,OAAO,EAAE,IAAI,EAAE,CAAA;AAEf,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC;SACL,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;SAC7B,OAAO,CACN,4HAA4H,EAC5H,YAAY,CACb;SACA,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;SACjC,OAAO,CAAC,2CAA2C,EAAE,QAAQ,CAAC,CAAA;AACnE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;SACvB,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC;SACtC,WAAW,EAAE,CAAA;IAChB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QACvD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAE1D,wKAAwK;AACxK,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAqC,EAAE;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,GAAG,CAAC,KAAK,CAAA;YACd,SAAQ;QACV,CAAC;QACD,IAAI,KAAK;YAAE,SAAQ;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAQ;QAC5C,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACX,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;YAC/B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;YACxC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;QACrD,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,KAAK,CAAC,IAA2B;IAC/C,MAAM,EAAE,GAAG,IAAI,GAAG,EAAkB,CAAA;IACpC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,CAAC,EAAE,CAAA;QACH,KAAK,MAAM,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAc,EAAE,CAAc;IACtD,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACvD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAClD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answer formatters for search, get, section, rules, and route.
|
|
3
|
+
* Same `{ text, data }` the CLI and MCP return. No filesystem: a caller that has a brief
|
|
4
|
+
* file reads it and passes `brief`.
|
|
5
|
+
*/
|
|
6
|
+
import type { MemorySession as Session } from './memory.js';
|
|
7
|
+
import type { Kb, KbUnit, Stage } from './model.js';
|
|
8
|
+
import { estimateTokens } from './model.js';
|
|
9
|
+
import type { RouteOptions } from './route.js';
|
|
10
|
+
import type { SearchHit, SearchOptions, SearchSource } from './search.js';
|
|
11
|
+
export interface Out<T> {
|
|
12
|
+
text: string;
|
|
13
|
+
data: T;
|
|
14
|
+
}
|
|
15
|
+
export interface QueryCtx {
|
|
16
|
+
kb: Kb;
|
|
17
|
+
/** What `search` and `route` rank with: an in-memory index (a snapshot, the files) or a searcher (the registry). */
|
|
18
|
+
index: SearchSource;
|
|
19
|
+
byId: Map<string, KbUnit>;
|
|
20
|
+
}
|
|
21
|
+
type Ctx = QueryCtx;
|
|
22
|
+
export declare const tokensOf: typeof estimateTokens;
|
|
23
|
+
export declare const tight: (body: string) => string;
|
|
24
|
+
/** Full units. An id ending in `*` expands to every id with that prefix (max 25). */
|
|
25
|
+
export declare function get(ctx: Ctx, ids: string[], opts?: {
|
|
26
|
+
session?: Session;
|
|
27
|
+
full?: boolean;
|
|
28
|
+
}): Out<{
|
|
29
|
+
units: KbUnit[];
|
|
30
|
+
missing: string[];
|
|
31
|
+
repeated: string[];
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* K11: a long string-literal union in a code span (`'activity' \| 'airplay' \| …`, 597 icon names) is clipped to its
|
|
35
|
+
* first few members plus the count; `get --full` prints it whole. When the values are icon names, the line says how
|
|
36
|
+
* to look one up instead.
|
|
37
|
+
*/
|
|
38
|
+
export declare function clipUnions(ctx: Ctx, body: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* `clay search --each a,b,c` (K11): one search per term, the best hit(s) for each — resolves several brand / icon /
|
|
41
|
+
* section names in one call (`--limit n` per term, default 1).
|
|
42
|
+
*/
|
|
43
|
+
export declare function searchEach(ctx: Ctx, termsList: string[], opts?: SearchOptions): Out<{
|
|
44
|
+
results: {
|
|
45
|
+
term: string;
|
|
46
|
+
hits: SearchHit[];
|
|
47
|
+
}[];
|
|
48
|
+
}>;
|
|
49
|
+
export declare function search(ctx: Ctx, query: string, opts?: SearchOptions): Out<{
|
|
50
|
+
hits: SearchHit[];
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* `--session` (K8): units this build was already served are named, not repeated; Watch drops lines it saw and units
|
|
54
|
+
* about sections it never looked at. `--since <stage>`: the same dedupe without a session file — the routes of
|
|
55
|
+
* `<stage>` up to the stage before this one (same skill and mode) count as served.
|
|
56
|
+
*/
|
|
57
|
+
export declare function route(ctx: Ctx, opts: RouteOptions & {
|
|
58
|
+
briefPath?: string;
|
|
59
|
+
session?: Session;
|
|
60
|
+
since?: Stage;
|
|
61
|
+
}): {
|
|
62
|
+
text: string;
|
|
63
|
+
data: import("./route.js").RouteResult;
|
|
64
|
+
};
|
|
65
|
+
/** `clay section` with no name (K8): every web section with its layouts and use, plus the atoms `clay section` also takes. */
|
|
66
|
+
export declare function sectionList(ctx: Ctx, opts?: {
|
|
67
|
+
scope?: 'email';
|
|
68
|
+
}): Out<{
|
|
69
|
+
sections: string[];
|
|
70
|
+
}>;
|
|
71
|
+
export declare function section(ctx: Ctx, name: string, layout?: string, opts?: {
|
|
72
|
+
session?: Session;
|
|
73
|
+
compact?: boolean;
|
|
74
|
+
}): Out<{
|
|
75
|
+
section: string;
|
|
76
|
+
layout?: string;
|
|
77
|
+
units: string[];
|
|
78
|
+
}>;
|
|
79
|
+
export declare function rules(ctx: Ctx, opts?: {
|
|
80
|
+
stage?: Stage;
|
|
81
|
+
mode?: 'A' | 'B';
|
|
82
|
+
scope?: 'email' | 'web';
|
|
83
|
+
}): Out<{
|
|
84
|
+
units: string[];
|
|
85
|
+
}>;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/core/query.ts"],"names":[],"mappings":"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"}
|