@domandigital/craft 0.14.0 → 0.15.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/CHANGELOG.md +18 -0
- package/CHARACTER.md +213 -28
- package/README.md +19 -1
- package/art-direction.schema.json +428 -25
- package/dist/{audit-6WHR7ZTV.js → audit-MTUC24XU.js} +2 -2
- package/dist/audit.cjs +5 -0
- package/dist/audit.js +5 -0
- package/dist/{chunk-7T5WR74C.js → chunk-2IQ5OXFR.js} +4 -4
- package/dist/{chunk-GQVEYTBY.js → chunk-LFNSB6W7.js} +13 -3
- package/dist/{chunk-3OTKMKJQ.js → chunk-MUVFECFC.js} +19 -15
- package/dist/chunk-OQXTQQAU.js +27 -0
- package/dist/{chunk-Q7ILL2HV.js → chunk-OUQ25LY2.js} +1 -1
- package/dist/{chunk-PBK6SYH5.js → chunk-QU6Q2QZZ.js} +46 -11
- package/dist/{chunk-XVBR2UPH.js → chunk-RXXRXV3V.js} +7 -24
- package/dist/chunk-YDURAOYR.js +711 -0
- package/dist/{cli-3CGUKXY4.js → cli-22TSWAX6.js} +6 -4
- package/dist/{cli-WSHPSWVU.js → cli-5ACKICBO.js} +6 -5
- package/dist/{cli-O3CDSONO.js → cli-7OZCYOQY.js} +86 -20
- package/dist/{cli-WG3UJNUF.js → cli-FCKHYAVZ.js} +36 -13
- package/dist/{cli-Z2IQG3LC.js → cli-FLG3ZCAF.js} +4 -3
- package/dist/cli.js +2 -2
- package/dist/generate.js +6 -0
- package/dist/index.cjs +850 -115
- package/dist/index.d.cts +455 -56
- package/dist/index.d.ts +455 -56
- package/dist/index.js +804 -115
- package/package.json +1 -1
- package/dist/chunk-OOZOEWGD.js +0 -295
package/dist/index.d.ts
CHANGED
|
@@ -1448,6 +1448,104 @@ interface CompetitorComparison {
|
|
|
1448
1448
|
declare function compareCompetitor(ours: PageCopy, competitor: PageCopy, brief?: string): CompetitorComparison;
|
|
1449
1449
|
declare function formatCompetitor(result: CompetitorComparison): string;
|
|
1450
1450
|
|
|
1451
|
+
/**
|
|
1452
|
+
* Shape features: how a short block of copy is built, not which words it uses.
|
|
1453
|
+
*
|
|
1454
|
+
* A three-sentence blurb can pass every vocabulary tell and still read as
|
|
1455
|
+
* generated, because the tell is the construction: a parallel triad, a
|
|
1456
|
+
* conditional stacked between commas, a close that hedges. The density tier
|
|
1457
|
+
* cannot see this; it skips anything under 400 words.
|
|
1458
|
+
*
|
|
1459
|
+
* Pure and zero-dependency. The calibration scripts under `scripts/shape/`
|
|
1460
|
+
* and any future calibrated tells call the same functions, so a published
|
|
1461
|
+
* effect size describes the detector that ships.
|
|
1462
|
+
*
|
|
1463
|
+
* Several features stand in for part-of-speech measures (phrasal
|
|
1464
|
+
* coordination, template skeletons) with word lists. They are approximate by
|
|
1465
|
+
* design, and measured, not assumed, before anything ships on them.
|
|
1466
|
+
*/
|
|
1467
|
+
/** Sentences in a block. Abbreviations and decimals do not end one. */
|
|
1468
|
+
declare function splitSentences(text: string): string[];
|
|
1469
|
+
declare function words(text: string): string[];
|
|
1470
|
+
/** Words that carry grammar rather than content. Also the skeleton's kept set. */
|
|
1471
|
+
declare const FUNCTION_WORDS: Set<string>;
|
|
1472
|
+
/**
|
|
1473
|
+
* "A, B and C" with short items. `parallel` when the items share their first
|
|
1474
|
+
* word ("your business, your website and your systems"), the construction a
|
|
1475
|
+
* model reaches for to sound complete.
|
|
1476
|
+
*/
|
|
1477
|
+
interface Tricolon {
|
|
1478
|
+
text: string;
|
|
1479
|
+
parallel: boolean;
|
|
1480
|
+
}
|
|
1481
|
+
declare function tricolons(sentence: string): Tricolon[];
|
|
1482
|
+
declare function stackedConditional(sentence: string): boolean;
|
|
1483
|
+
/** Commas plus subordinators: how many clauses a sentence stacks. */
|
|
1484
|
+
declare function clauseDepth(sentence: string): number;
|
|
1485
|
+
declare function hedgeCount(text: string): number;
|
|
1486
|
+
/** The last sentence ends the block on a qualifier or a condition. */
|
|
1487
|
+
declare function hedgedClose(sentences: string[]): boolean;
|
|
1488
|
+
declare function nominalisations(text: string): number;
|
|
1489
|
+
/**
|
|
1490
|
+
* Present participial clauses: ", making it easy to..." after a comma, or a
|
|
1491
|
+
* sentence that opens on a participle ("Building on this, ..."). Reported at
|
|
1492
|
+
* 5.3 times the human rate in GPT-4o text (PMC11874169). `ing-tail` is a narrow
|
|
1493
|
+
* form of this.
|
|
1494
|
+
*/
|
|
1495
|
+
declare function participialClauses(sentence: string): number;
|
|
1496
|
+
/**
|
|
1497
|
+
* "X and Y" where both sides are single content words ("enquiries and admin",
|
|
1498
|
+
* "clear and simple"). A word-list stand-in for phrasal coordination, reported
|
|
1499
|
+
* at 1.9 times the human rate (PMC11874169). Not preceded by a comma, so a
|
|
1500
|
+
* tricolon's last item is not counted twice.
|
|
1501
|
+
*/
|
|
1502
|
+
declare function phrasalCoordinations(sentence: string): number;
|
|
1503
|
+
/**
|
|
1504
|
+
* A sentence reduced to its function words, with one `_` for each run of
|
|
1505
|
+
* content words. Experimental: a stand-in for part-of-speech templates
|
|
1506
|
+
* (Shaib et al., EMNLP 2024), which need a tagger craft does not carry.
|
|
1507
|
+
*/
|
|
1508
|
+
declare function skeleton(sentence: string): string[];
|
|
1509
|
+
/** Share of the block's skeleton 4-grams that occur more than once. */
|
|
1510
|
+
declare function skeletonRepeat(sentences: string[]): number;
|
|
1511
|
+
/** Coefficient of variation; null below `min` items, where it means nothing. */
|
|
1512
|
+
declare function cv(xs: number[], min: number): number | null;
|
|
1513
|
+
interface ShapeFeatures {
|
|
1514
|
+
sentences: number;
|
|
1515
|
+
words: number;
|
|
1516
|
+
tricolons: number;
|
|
1517
|
+
parallelTriads: number;
|
|
1518
|
+
stackedConditionals: number;
|
|
1519
|
+
/** Mean clauses per sentence. */
|
|
1520
|
+
clauseDepth: number;
|
|
1521
|
+
/** Sentence-length CV; null under three sentences. */
|
|
1522
|
+
sentenceCv: number | null;
|
|
1523
|
+
/** Hedges per 100 words. */
|
|
1524
|
+
hedgeRate: number;
|
|
1525
|
+
hedgedClose: boolean;
|
|
1526
|
+
/** Nominalisations per 100 words. */
|
|
1527
|
+
nominalisationRate: number;
|
|
1528
|
+
pronounOpenerShare: number;
|
|
1529
|
+
transitionOpenerShare: number;
|
|
1530
|
+
impersonalOpenerShare: number;
|
|
1531
|
+
commasPerSentence: number;
|
|
1532
|
+
commasPer100: number;
|
|
1533
|
+
/** Participial clauses per sentence. */
|
|
1534
|
+
participialRate: number;
|
|
1535
|
+
/** Phrasal coordinations per 100 words. */
|
|
1536
|
+
coordinationRate: number;
|
|
1537
|
+
/** Experimental. */
|
|
1538
|
+
skeletonRepeat: number;
|
|
1539
|
+
}
|
|
1540
|
+
/** Every feature for one block of copy: a paragraph, a blurb, an email body. */
|
|
1541
|
+
declare function shapeOf(text: string): ShapeFeatures;
|
|
1542
|
+
/** How many distinct shape moves a block makes. What a reader reacts to is the stack. */
|
|
1543
|
+
declare function shapeMoves(f: ShapeFeatures): string[];
|
|
1544
|
+
/** Paragraph-length CV for a document of four or more paragraphs; null below. */
|
|
1545
|
+
declare function paragraphUniformity(paragraphs: string[]): number | null;
|
|
1546
|
+
/** A block the size of a blurb: 2 to 8 sentences, 20 to 160 words. */
|
|
1547
|
+
declare function isBlurb(f: Pick<ShapeFeatures, "sentences" | "words">): boolean;
|
|
1548
|
+
|
|
1451
1549
|
/**
|
|
1452
1550
|
* Specificity tells: a page that could belong to anyone.
|
|
1453
1551
|
*
|
|
@@ -1910,6 +2008,16 @@ declare const DISTANCE_WEIGHTS: {
|
|
|
1910
2008
|
};
|
|
1911
2009
|
/** Layout distance, 0 to 1: by role and geometry when both have them, else by kind as in version 1. */
|
|
1912
2010
|
declare function layoutDistance(a: Fingerprint, b: Fingerprint): number;
|
|
2011
|
+
/** ΔE in OKLab. 0.02 is barely visible; by 0.3 two accents read as different colours. */
|
|
2012
|
+
declare const ACCENT_SCALE = 0.3;
|
|
2013
|
+
/** Grounds sit near white, where a smaller step already reads as a different paper. */
|
|
2014
|
+
declare const GROUND_SCALE = 0.15;
|
|
2015
|
+
/** A part at or below this distance counts as shared between two sites. */
|
|
2016
|
+
declare const SHARED_PART = 0.2;
|
|
2017
|
+
/** Two accents within this ΔE_OK read as the same colour family: about 6 on the familiar ΔE scale. */
|
|
2018
|
+
declare const ACCENT_SHARED: number;
|
|
2019
|
+
/** Two grounds within this ΔE_OK read as the same paper. */
|
|
2020
|
+
declare const GROUND_SHARED: number;
|
|
1913
2021
|
declare function fingerprintDistance(a: Fingerprint, b: Fingerprint): FingerprintDistance;
|
|
1914
2022
|
/**
|
|
1915
2023
|
* The nearest neighbours of a fingerprint in a set, closest first. Typicality
|
|
@@ -1923,6 +2031,209 @@ declare function nearest<T>(target: Fingerprint, set: {
|
|
|
1923
2031
|
distance: FingerprintDistance;
|
|
1924
2032
|
}[];
|
|
1925
2033
|
|
|
2034
|
+
/**
|
|
2035
|
+
* `art-direction.json`: what a site decided about how it looks, and why.
|
|
2036
|
+
*
|
|
2037
|
+
* CHARACTER.md's reason rule lives here. Every expressive choice records a
|
|
2038
|
+
* `because` drawn from the client's real world (the shopfront, the van, the
|
|
2039
|
+
* trade's own lettering, the place, the materials) and points at a source
|
|
2040
|
+
* that shows it. A choice with no reason is a default, however good it looks.
|
|
2041
|
+
*
|
|
2042
|
+
* The file also carries the tell exceptions craft has read since phase A, in
|
|
2043
|
+
* the same shape, so an existing file stays valid.
|
|
2044
|
+
*/
|
|
2045
|
+
|
|
2046
|
+
/** What `craft direction init` writes. Version 1 files still validate, with a warning. */
|
|
2047
|
+
declare const DIRECTION_VERSION = 2;
|
|
2048
|
+
declare const DIRECTION_VERSIONS: readonly [1, 2];
|
|
2049
|
+
/** The customer's own words: evidence for the job map, never for a token. */
|
|
2050
|
+
declare const CUSTOMER_KINDS: readonly ["review", "enquiry", "conversation", "search"];
|
|
2051
|
+
type CustomerKind = (typeof CUSTOMER_KINDS)[number];
|
|
2052
|
+
/**
|
|
2053
|
+
* Where a reason comes from. Deliberately physical: a mood board is not a
|
|
2054
|
+
* source. Customer-voice kinds back the job map. A `reference` is visual
|
|
2055
|
+
* inspiration from outside the client's category, and says where it is from.
|
|
2056
|
+
*/
|
|
2057
|
+
declare const SOURCE_KINDS: readonly ["livery", "shopfront", "signage", "packaging", "product", "uniform", "interior", "place", "material", "trade", "print", "photo", "founder", "review", "enquiry", "conversation", "search", "reference"];
|
|
2058
|
+
type SourceKind = (typeof SOURCE_KINDS)[number];
|
|
2059
|
+
interface DirectionSource {
|
|
2060
|
+
/** Short id a choice refers to: "van", "fascia", "price-list". */
|
|
2061
|
+
id: string;
|
|
2062
|
+
kind: SourceKind;
|
|
2063
|
+
/** What it is and where, in a sentence. */
|
|
2064
|
+
note: string;
|
|
2065
|
+
/** A photo or file in the repo, or a URL. */
|
|
2066
|
+
path?: string;
|
|
2067
|
+
/** Colours read off it by a person or by `craft direction propose`, as hex. */
|
|
2068
|
+
colours?: string[];
|
|
2069
|
+
/** Lettering seen on it: "hand-painted sign-writing", "stencilled capitals". */
|
|
2070
|
+
lettering?: string;
|
|
2071
|
+
/** Where a `reference` comes from: "letterpress print", "a railway station", "a bakery". Never the client's own trade. */
|
|
2072
|
+
category?: string;
|
|
2073
|
+
}
|
|
2074
|
+
/** The expressive choices. Structure is the hierarchy layer, decided from the job. */
|
|
2075
|
+
declare const CHOICE_KEYS: readonly ["accent", "ground", "display", "body", "shape", "motif", "signature"];
|
|
2076
|
+
type ChoiceKey = (typeof CHOICE_KEYS)[number];
|
|
2077
|
+
interface DirectionChoice {
|
|
2078
|
+
/** A colour as hex for accent and ground, a family name for display and body, words otherwise. */
|
|
2079
|
+
value: string;
|
|
2080
|
+
because: string;
|
|
2081
|
+
/** Source ids this reason rests on. */
|
|
2082
|
+
evidence: string[];
|
|
2083
|
+
}
|
|
2084
|
+
/** One part of the job: what it is, and the customer's words that show it. */
|
|
2085
|
+
interface JobPart {
|
|
2086
|
+
value: string;
|
|
2087
|
+
evidence: string[];
|
|
2088
|
+
}
|
|
2089
|
+
declare const CONSIDERATION: readonly ["low", "considered", "high"];
|
|
2090
|
+
type Consideration = (typeof CONSIDERATION)[number];
|
|
2091
|
+
/**
|
|
2092
|
+
* What the visitor is trying to get done, from their side. Every hierarchy
|
|
2093
|
+
* reason is checked against it, so it replaces "what do other sites in the
|
|
2094
|
+
* trade do" as the starting point.
|
|
2095
|
+
*/
|
|
2096
|
+
interface JobMap {
|
|
2097
|
+
/** Verb + object + context: "find" / "an electrician they can trust with a dangerous fault" / "today, without being overcharged". */
|
|
2098
|
+
statement: {
|
|
2099
|
+
verb: string;
|
|
2100
|
+
object: string;
|
|
2101
|
+
context: string;
|
|
2102
|
+
};
|
|
2103
|
+
functional: JobPart;
|
|
2104
|
+
emotional: JobPart;
|
|
2105
|
+
social: JobPart;
|
|
2106
|
+
/** How long and how carefully they decide: an emergency call-out is low, a retained plan is high. */
|
|
2107
|
+
consideration: {
|
|
2108
|
+
value: Consideration;
|
|
2109
|
+
because: string;
|
|
2110
|
+
evidence: string[];
|
|
2111
|
+
};
|
|
2112
|
+
objections: string[];
|
|
2113
|
+
/** Their own words, quoted from a cited source. */
|
|
2114
|
+
language: string[];
|
|
2115
|
+
/** The customer-voice sources the language is quoted from. */
|
|
2116
|
+
evidence: string[];
|
|
2117
|
+
}
|
|
2118
|
+
/** Page types a hierarchy is declared for. Each page has its own job on the site. */
|
|
2119
|
+
declare const PAGE_TYPES: readonly ["home", "service", "about", "pricing", "booking", "contact", "article", "landing"];
|
|
2120
|
+
type PageType = (typeof PAGE_TYPES)[number];
|
|
2121
|
+
/** Where a call to action can sit: a section role, or the header, or pinned while scrolling. */
|
|
2122
|
+
type ActionPosition = SectionRole | "header" | "sticky";
|
|
2123
|
+
interface PageHierarchy {
|
|
2124
|
+
primaryAction: {
|
|
2125
|
+
value: string;
|
|
2126
|
+
positions: ActionPosition[];
|
|
2127
|
+
because: string;
|
|
2128
|
+
evidence?: string[];
|
|
2129
|
+
};
|
|
2130
|
+
order: {
|
|
2131
|
+
role: SectionRole;
|
|
2132
|
+
because: string;
|
|
2133
|
+
}[];
|
|
2134
|
+
lead: {
|
|
2135
|
+
value: string;
|
|
2136
|
+
subordinate?: string[];
|
|
2137
|
+
because: string;
|
|
2138
|
+
};
|
|
2139
|
+
journey: {
|
|
2140
|
+
stage: string;
|
|
2141
|
+
because: string;
|
|
2142
|
+
}[];
|
|
2143
|
+
}
|
|
2144
|
+
declare const HIERARCHY_FIELDS: readonly ["primaryAction", "order", "lead", "journey"];
|
|
2145
|
+
interface ArtDirection {
|
|
2146
|
+
$schema?: string;
|
|
2147
|
+
version: (typeof DIRECTION_VERSIONS)[number];
|
|
2148
|
+
client: string;
|
|
2149
|
+
/** Who, where, and what they do, in a sentence or two. The brief a model would have been given. */
|
|
2150
|
+
brief: string;
|
|
2151
|
+
/** Version 2. */
|
|
2152
|
+
job?: JobMap;
|
|
2153
|
+
/** Version 2. Keyed by page type. */
|
|
2154
|
+
hierarchy?: Partial<Record<PageType, PageHierarchy>>;
|
|
2155
|
+
sources: DirectionSource[];
|
|
2156
|
+
choices: Partial<Record<ChoiceKey, DirectionChoice>>;
|
|
2157
|
+
exceptions?: TellException[];
|
|
2158
|
+
}
|
|
2159
|
+
type DirectionSeverity = "error" | "warn";
|
|
2160
|
+
interface DirectionProblem {
|
|
2161
|
+
severity: DirectionSeverity;
|
|
2162
|
+
/** Where in the file: "choices.accent.because", "sources[2].kind". */
|
|
2163
|
+
at: string;
|
|
2164
|
+
message: string;
|
|
2165
|
+
}
|
|
2166
|
+
interface DirectionReport {
|
|
2167
|
+
valid: boolean;
|
|
2168
|
+
problems: DirectionProblem[];
|
|
2169
|
+
/** How many of the seven choices carry an accepted reason. */
|
|
2170
|
+
decided: number;
|
|
2171
|
+
/** Each layer on its own. A site is only decided when all three are. */
|
|
2172
|
+
layers: {
|
|
2173
|
+
job: boolean;
|
|
2174
|
+
hierarchy: {
|
|
2175
|
+
page: PageType;
|
|
2176
|
+
decided: number;
|
|
2177
|
+
total: number;
|
|
2178
|
+
}[];
|
|
2179
|
+
tokens: {
|
|
2180
|
+
decided: number;
|
|
2181
|
+
total: number;
|
|
2182
|
+
};
|
|
2183
|
+
/** Job decided, at least a home page hierarchy with every field decided, and five of seven tokens. */
|
|
2184
|
+
complete: boolean;
|
|
2185
|
+
};
|
|
2186
|
+
}
|
|
2187
|
+
|
|
2188
|
+
/**
|
|
2189
|
+
* The estate check before anything is built: declared art directions compared
|
|
2190
|
+
* with each other, not rendered pages.
|
|
2191
|
+
*
|
|
2192
|
+
* `compareToEstate` catches two clients converging after both sites ship. By
|
|
2193
|
+
* then the fix is a retrofit. This compares what each `art-direction.json`
|
|
2194
|
+
* says it will be, so the convergence is caught while it is still a decision.
|
|
2195
|
+
*
|
|
2196
|
+
* The colour thresholds are the rendered check's own (`ACCENT_SHARED`,
|
|
2197
|
+
* `GROUND_SHARED`), so the two checks agree on what "the same accent" means.
|
|
2198
|
+
* It ranks and names what is shared; there is no sibling line until declared
|
|
2199
|
+
* directions have been calibrated against the rendered estate.
|
|
2200
|
+
*
|
|
2201
|
+
* Pure.
|
|
2202
|
+
*/
|
|
2203
|
+
|
|
2204
|
+
/** What an art direction commits to, as the estate register stores it. */
|
|
2205
|
+
interface DirectionSummary {
|
|
2206
|
+
accent?: string;
|
|
2207
|
+
ground?: string;
|
|
2208
|
+
display?: string;
|
|
2209
|
+
body?: string;
|
|
2210
|
+
shape?: string;
|
|
2211
|
+
/** The home page's running order. */
|
|
2212
|
+
order?: SectionRole[];
|
|
2213
|
+
primaryAction?: string;
|
|
2214
|
+
positions?: string[];
|
|
2215
|
+
}
|
|
2216
|
+
declare function summariseDirection(d: Partial<ArtDirection>): DirectionSummary;
|
|
2217
|
+
interface DirectionComparison {
|
|
2218
|
+
shared: string[];
|
|
2219
|
+
accentDelta: number | null;
|
|
2220
|
+
groundDelta: number | null;
|
|
2221
|
+
/** Edit distance over the longer order, 0 to 1; null without both orders. */
|
|
2222
|
+
orderDistance: number | null;
|
|
2223
|
+
/** Worth a look before either is built. */
|
|
2224
|
+
flagged: boolean;
|
|
2225
|
+
}
|
|
2226
|
+
declare function compareDirections(a: DirectionSummary, b: DirectionSummary): DirectionComparison;
|
|
2227
|
+
interface DirectionMatch extends DirectionComparison {
|
|
2228
|
+
id: string;
|
|
2229
|
+
}
|
|
2230
|
+
/** Every site in the register with a declared direction, most shared first. */
|
|
2231
|
+
declare function compareToDeclared(target: DirectionSummary, sites: {
|
|
2232
|
+
id: string;
|
|
2233
|
+
direction?: DirectionSummary;
|
|
2234
|
+
}[], exclude?: string): DirectionMatch[];
|
|
2235
|
+
declare function formatDirectionMatches(label: string, matches: DirectionMatch[]): string;
|
|
2236
|
+
|
|
1926
2237
|
/**
|
|
1927
2238
|
* The estate register: every site the agency has shipped, fingerprinted, so a
|
|
1928
2239
|
* new one can be checked against its siblings. Signal 3 of CHARACTER.md.
|
|
@@ -1955,10 +2266,13 @@ interface EstateSite {
|
|
|
1955
2266
|
url: string;
|
|
1956
2267
|
/** Where the site's source lives, if known: "rmp474/RMP-Electrical". */
|
|
1957
2268
|
repo?: string;
|
|
1958
|
-
|
|
2269
|
+
/** Absent for a direction registered before the site is built. */
|
|
2270
|
+
fingerprint?: Fingerprint;
|
|
1959
2271
|
/** Rendered tells found when it was added, for the record. */
|
|
1960
2272
|
tells: string[];
|
|
1961
2273
|
addedAt: string;
|
|
2274
|
+
/** What its art-direction.json declares, so a new direction is checked before anything is built. */
|
|
2275
|
+
direction?: DirectionSummary;
|
|
1962
2276
|
}
|
|
1963
2277
|
interface EstateRegister {
|
|
1964
2278
|
version: typeof ESTATE_VERSION;
|
|
@@ -1970,7 +2284,7 @@ declare function addSite(register: EstateRegister, site: EstateSite): EstateRegi
|
|
|
1970
2284
|
/**
|
|
1971
2285
|
* What two fingerprints effectively share, named the way a person would see
|
|
1972
2286
|
* it: "Fraunces headline", "no accent", "pill buttons". A part counts when its
|
|
1973
|
-
* distance is
|
|
2287
|
+
* distance is `SHARED_PART` or less.
|
|
1974
2288
|
*/
|
|
1975
2289
|
declare function sharedParts(a: Fingerprint, b: Fingerprint, d?: FingerprintDistance): string[];
|
|
1976
2290
|
interface EstateMatch {
|
|
@@ -2293,67 +2607,132 @@ declare const VAGUE_WORDS: readonly ["innovative", "scalable", "end-to-end", "st
|
|
|
2293
2607
|
declare const REVIEW_PHRASES: readonly ["great question", "of course!", "absolutely!", "absolutely,", "truly", "genuinely", "deeply", "ultimately", "one-size-fits-all", "one size fits all", "let me know if you'd", "the single most", "by far the most", "hands down the", "arguably the best", "bar none"];
|
|
2294
2608
|
|
|
2295
2609
|
/**
|
|
2296
|
-
*
|
|
2610
|
+
* The reason rule, one standard for every layer of an art direction.
|
|
2297
2611
|
*
|
|
2298
|
-
*
|
|
2299
|
-
*
|
|
2300
|
-
*
|
|
2301
|
-
*
|
|
2612
|
+
* A reason has to be specific enough that whoever reads the file next (a
|
|
2613
|
+
* person, Claude, a future tool) cannot drift back to the category default
|
|
2614
|
+
* while following it. "Freight Display, because MMM's photography needs to be
|
|
2615
|
+
* the hero and the type needs to recede" passes. "Freight Display" does not,
|
|
2616
|
+
* and neither does "a familiar structure so visitors feel comfortable".
|
|
2302
2617
|
*
|
|
2303
|
-
*
|
|
2304
|
-
*
|
|
2618
|
+
* Wording rules catch the common ways a default gets dressed up as a reason.
|
|
2619
|
+
* They are lexical, so they can be rephrased around; the tie is the real
|
|
2620
|
+
* guard. A token's reason must mention what its evidence shows. A hierarchy
|
|
2621
|
+
* reason must use this client's job: pasted onto another client's file, it
|
|
2622
|
+
* has to fail.
|
|
2623
|
+
*
|
|
2624
|
+
* Pure.
|
|
2305
2625
|
*/
|
|
2306
2626
|
|
|
2307
|
-
declare const
|
|
2308
|
-
/**
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
/**
|
|
2325
|
-
declare
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
/** Source ids this reason rests on. */
|
|
2332
|
-
evidence: string[];
|
|
2333
|
-
}
|
|
2334
|
-
interface ArtDirection {
|
|
2335
|
-
$schema?: string;
|
|
2336
|
-
version: typeof DIRECTION_VERSION;
|
|
2337
|
-
client: string;
|
|
2338
|
-
/** Who, where, and what they do, in a sentence or two. The brief a model would have been given. */
|
|
2339
|
-
brief: string;
|
|
2627
|
+
declare const PROPOSED = "PROPOSED:";
|
|
2628
|
+
/**
|
|
2629
|
+
* Reasons that are preferences, not evidence. "The client likes it" may be
|
|
2630
|
+
* true and still say nothing about why this site should look this way.
|
|
2631
|
+
*/
|
|
2632
|
+
declare const PREFERENCE: RegExp;
|
|
2633
|
+
/** Adjectives that describe a mood rather than a source. Two or more and the reason is a mood board. */
|
|
2634
|
+
declare const MOOD: RegExp;
|
|
2635
|
+
/**
|
|
2636
|
+
* A default stated as a reason. Three families: authority ("best practice"),
|
|
2637
|
+
* the crowd ("what competitors do", "most salon sites") and familiarity
|
|
2638
|
+
* ("a familiar layout", "what visitors are used to"). Each is the category
|
|
2639
|
+
* average speaking, which is what the art direction exists to replace.
|
|
2640
|
+
*/
|
|
2641
|
+
declare const CONVENTION: RegExp;
|
|
2642
|
+
/** Content words, lower-case, with a possessive stripped and short words dropped. */
|
|
2643
|
+
declare function contentWords(text: string): Set<string>;
|
|
2644
|
+
/** Every word of the job a hierarchy reason may tie to. */
|
|
2645
|
+
declare function jobWords(job: JobMap): Set<string>;
|
|
2646
|
+
interface ReasonInput {
|
|
2647
|
+
/** Where in the file: "choices.accent", "hierarchy.home.order[2]". Problems land at `${at}.because` and `${at}.evidence`. */
|
|
2648
|
+
at: string;
|
|
2649
|
+
because: unknown;
|
|
2650
|
+
evidence?: unknown;
|
|
2340
2651
|
sources: DirectionSource[];
|
|
2341
|
-
|
|
2342
|
-
|
|
2652
|
+
/**
|
|
2653
|
+
* What the reason must be about.
|
|
2654
|
+
* source mentions what its cited evidence shows (tokens)
|
|
2655
|
+
* customer the same, and every cited source is the customer's own words (the job map)
|
|
2656
|
+
* job uses this client's job (hierarchy); evidence optional
|
|
2657
|
+
*/
|
|
2658
|
+
tie: "source" | "customer" | "job";
|
|
2659
|
+
job?: JobMap;
|
|
2343
2660
|
}
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2661
|
+
/** Problems with one reason. None means it counts as decided. */
|
|
2662
|
+
declare function checkReason(input: ReasonInput): DirectionProblem[];
|
|
2663
|
+
|
|
2664
|
+
/**
|
|
2665
|
+
* The job map: what the visitor is trying to get done, in their words.
|
|
2666
|
+
*
|
|
2667
|
+
* It replaces "what do other sites in the trade do" as the starting point.
|
|
2668
|
+
* Hierarchy reasons are checked against it, so it has to describe this
|
|
2669
|
+
* client's customer, not the category: "find an electrician they can trust
|
|
2670
|
+
* with a dangerous fault, today" is a job; "electrician website" is a label.
|
|
2671
|
+
*
|
|
2672
|
+
* Pure. Quotes are checked against source text the caller can read.
|
|
2673
|
+
*/
|
|
2674
|
+
|
|
2675
|
+
/** An object that is only trade nouns and website words: "electrician website", "a local salon site". */
|
|
2676
|
+
declare function isCategoryLabel(object: string, brief?: string): boolean;
|
|
2677
|
+
interface JobContext {
|
|
2678
|
+
brief?: string;
|
|
2679
|
+
/** Text of a cited source's file, when the caller can read it. */
|
|
2680
|
+
readSource?: (source: DirectionSource) => string | undefined;
|
|
2350
2681
|
}
|
|
2351
|
-
|
|
2352
|
-
valid: boolean;
|
|
2682
|
+
declare function validateJob(job: unknown, sources: DirectionSource[], ctx?: JobContext): {
|
|
2353
2683
|
problems: DirectionProblem[];
|
|
2354
|
-
|
|
2684
|
+
decided: boolean;
|
|
2685
|
+
};
|
|
2686
|
+
|
|
2687
|
+
/**
|
|
2688
|
+
* The hierarchy layer: what each page puts first, where it asks, and why.
|
|
2689
|
+
*
|
|
2690
|
+
* A conventional order is allowed and never penalised. What fails is an
|
|
2691
|
+
* order nobody chose: every field needs a reason that uses this client's job.
|
|
2692
|
+
* The primary action's reason must also say how the job's consideration (a
|
|
2693
|
+
* two-minute emergency call against a months-long decision) or one of its
|
|
2694
|
+
* objections leads to where the ask sits. The evidence on placement is mixed,
|
|
2695
|
+
* so craft encodes no default position; it requires the reason.
|
|
2696
|
+
*
|
|
2697
|
+
* Pure. The declared order is checked against a version 2 snapshot's section
|
|
2698
|
+
* roles when one is given.
|
|
2699
|
+
*/
|
|
2700
|
+
|
|
2701
|
+
declare const SECTION_ROLES: readonly SectionRole[];
|
|
2702
|
+
interface PageResult {
|
|
2703
|
+
page: PageType;
|
|
2355
2704
|
decided: number;
|
|
2705
|
+
total: number;
|
|
2706
|
+
}
|
|
2707
|
+
declare function validateHierarchy(hierarchy: unknown, job: JobMap | undefined, sources: DirectionSource[]): {
|
|
2708
|
+
problems: DirectionProblem[];
|
|
2709
|
+
pages: PageResult[];
|
|
2710
|
+
};
|
|
2711
|
+
/** Roles a snapshot shows, in running order, without the unclassified ones. */
|
|
2712
|
+
declare function renderedOrder(snapshot: Snapshot): SectionRole[] | null;
|
|
2713
|
+
/** The declared order against the page that ships. Drift warns; `strict` makes it an error. */
|
|
2714
|
+
declare function checkOrder(declared: PageHierarchy | undefined, page: PageType, snapshot: Snapshot, strict?: boolean): DirectionProblem[];
|
|
2715
|
+
|
|
2716
|
+
/**
|
|
2717
|
+
* The research prompt for a new client: job material only.
|
|
2718
|
+
*
|
|
2719
|
+
* A research model asked "what do good electrician websites look like"
|
|
2720
|
+
* returns the category average, because that is what it was trained on. So
|
|
2721
|
+
* the prompt craft hands over asks only about the customer (their situation,
|
|
2722
|
+
* objections, words, where they look) and forbids describing the category's
|
|
2723
|
+
* sites. Visual references, when wanted, come from outside the category.
|
|
2724
|
+
*
|
|
2725
|
+
* Pure text. Nothing here calls a model.
|
|
2726
|
+
*/
|
|
2727
|
+
interface ResearchInput {
|
|
2728
|
+
brief: string;
|
|
2729
|
+
client?: string;
|
|
2730
|
+
/** Add prompts for visual references from outside the category. */
|
|
2731
|
+
visual?: boolean;
|
|
2356
2732
|
}
|
|
2733
|
+
/** The trade words in a brief, for naming what not to research. */
|
|
2734
|
+
declare function tradeOf(brief: string): string[];
|
|
2735
|
+
declare function researchPrompt(input: ResearchInput): string;
|
|
2357
2736
|
|
|
2358
2737
|
/**
|
|
2359
2738
|
* Checking an art direction: the file's shape, the reason rule, and whether
|
|
@@ -2365,14 +2744,30 @@ interface DirectionReport {
|
|
|
2365
2744
|
interface ValidateContext {
|
|
2366
2745
|
/** The fingerprint of the rendered site, to check the file against what ships. */
|
|
2367
2746
|
fingerprint?: Fingerprint;
|
|
2747
|
+
/** The rendered page itself, to check the declared order against its section roles. */
|
|
2748
|
+
snapshot?: Snapshot;
|
|
2749
|
+
/** Which page the snapshot is. Default home. */
|
|
2750
|
+
page?: PageType;
|
|
2751
|
+
/** Drift between the file and the page is an error, for a pre-launch gate. */
|
|
2752
|
+
strict?: boolean;
|
|
2368
2753
|
/** Which cited paths exist, when the caller can look. */
|
|
2369
2754
|
pathExists?: (path: string) => boolean;
|
|
2755
|
+
/** Text of a cited source's file, for checking quoted customer language. */
|
|
2756
|
+
readSource?: (source: DirectionSource) => string | undefined;
|
|
2757
|
+
/** Declared directions of the other sites in the estate, to catch convergence before build. */
|
|
2758
|
+
estate?: {
|
|
2759
|
+
id: string;
|
|
2760
|
+
direction?: DirectionSummary;
|
|
2761
|
+
}[];
|
|
2762
|
+
/** This site's id in the estate, left out of the comparison. */
|
|
2763
|
+
estateId?: string;
|
|
2370
2764
|
}
|
|
2371
2765
|
declare function validateDirection(input: unknown, ctx?: ValidateContext): DirectionReport;
|
|
2372
2766
|
|
|
2373
2767
|
/**
|
|
2374
2768
|
* A first art-direction.json for a site that exists: what it does today,
|
|
2375
|
-
* written down,
|
|
2769
|
+
* written down (its tokens and, from a version 2 snapshot, its running order),
|
|
2770
|
+
* with every reason and the whole job map left empty.
|
|
2376
2771
|
*
|
|
2377
2772
|
* Empty on purpose. `validateDirection` fails the file until each choice has
|
|
2378
2773
|
* a source and a reason, so the first thing init produces is the list of
|
|
@@ -2439,7 +2834,6 @@ declare function licencesJson(): string;
|
|
|
2439
2834
|
* Pure. Pixels come in as numbers; the CLI decodes the images.
|
|
2440
2835
|
*/
|
|
2441
2836
|
|
|
2442
|
-
declare const PROPOSED = "PROPOSED:";
|
|
2443
2837
|
interface PaletteColour {
|
|
2444
2838
|
hex: string;
|
|
2445
2839
|
/** Share of sampled pixels, 0 to 1. */
|
|
@@ -2463,6 +2857,11 @@ interface ProposeInput {
|
|
|
2463
2857
|
id: string;
|
|
2464
2858
|
fingerprint: Fingerprint;
|
|
2465
2859
|
}[];
|
|
2860
|
+
/** Accents other sites have declared but not yet shipped: a sibling can happen before either is built. */
|
|
2861
|
+
declared?: {
|
|
2862
|
+
id: string;
|
|
2863
|
+
accent: string;
|
|
2864
|
+
}[];
|
|
2466
2865
|
}
|
|
2467
2866
|
interface Proposal {
|
|
2468
2867
|
key: ChoiceKey;
|
|
@@ -2552,4 +2951,4 @@ declare function characterReport(input: CharacterInputs, copyTells?: Set<string>
|
|
|
2552
2951
|
|
|
2553
2952
|
declare function retrofitPlan(report: CharacterReport, direction?: ArtDirection | null): string;
|
|
2554
2953
|
|
|
2555
|
-
export { AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionProblem, type DirectionReport, type DirectionSource, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, type Gamut, type Generation, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, LICENCES, LIGHTNESS_CURVE, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_RUNS, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PILL_LIMIT, PLAINER_WORDS, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PaletteColour, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type RenderedTell, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SCALE, SHADCN_LIMIT, SHADCN_PRIMITIVES, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type Tell, type TellException, type TypeStep, type Typicality, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, catalogueTable, characterReport, checkCopy, checkPair, checkRestraint, choicesOf, closestComponents, compareCompetitor, compareFacts, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, countWords, craftTokens, createBaseline, deltaEOk, deltaEOkHex, densityCss, densityTokens, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatClaims, formatComparison, formatCompetitor, formatHex, formatReport, globToRegExp, groundName, harvest, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isCream, layoutDistance, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, parseBaseline, parseColour, parseCraftConfig, parseHex, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeName, sharedParts, shouldAnimate, siblingLine, specificity, specifics, stockAvatarSource, stockSource, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, typeFeatureTokens, typicality, unprovenClaims, validateDirection, visibleText, visualMeasures, wcagContrast, wordListsJson };
|
|
2954
|
+
export { ACCENT_SCALE, ACCENT_SHARED, AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type ActionPosition, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, CONSIDERATION, CONVENTION, CUSTOMER_KINDS, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type Consideration, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, type CustomerKind, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DIRECTION_VERSIONS, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionComparison, type DirectionMatch, type DirectionProblem, type DirectionReport, type DirectionSource, type DirectionSummary, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, FUNCTION_WORDS, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, GROUND_SCALE, GROUND_SHARED, type Gamut, type Generation, HIERARCHY_FIELDS, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, type JobContext, type JobMap, type JobPart, LICENCES, LIGHTNESS_CURVE, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_RUNS, MOOD, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PAGE_TYPES, PILL_LIMIT, PLAINER_WORDS, PREFERENCE, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PageHierarchy, type PageResult, type PageType, type PaletteColour, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type ReasonInput, type RenderedTell, type ResearchInput, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SCALE, SECTION_ROLES, SHADCN_LIMIT, SHADCN_PRIMITIVES, SHARED_PART, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShapeFeatures, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type Tell, type TellException, type Tricolon, type TypeStep, type Typicality, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, catalogueTable, characterReport, checkCopy, checkOrder, checkPair, checkReason, checkRestraint, choicesOf, clauseDepth, closestComponents, compareCompetitor, compareDirections, compareFacts, compareToDeclared, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, contentWords, countWords, craftTokens, createBaseline, cv, deltaEOk, deltaEOkHex, densityCss, densityTokens, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, globToRegExp, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, jobWords, layoutDistance, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, nominalisations, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, paragraphUniformity, parseBaseline, parseColour, parseCraftConfig, parseHex, participialClauses, phrasalCoordinations, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, renderedOrder, researchPrompt, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeMoves, shapeName, shapeOf, words as shapeWords, sharedParts, shouldAnimate, siblingLine, skeleton, skeletonRepeat, specificity, specifics, splitSentences, stackedConditional, stockAvatarSource, stockSource, summariseDirection, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, tradeOf, tricolons, typeFeatureTokens, typicality, unprovenClaims, validateDirection, validateHierarchy, validateJob, visibleText, visualMeasures, wcagContrast, wordListsJson };
|