@domandigital/craft 0.14.0 → 0.16.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 +25 -0
- package/CHARACTER.md +247 -28
- package/README.md +19 -1
- package/art-direction.schema.json +428 -25
- package/dist/{audit-6WHR7ZTV.js → audit-UJCUWORL.js} +2 -2
- package/dist/audit.cjs +5 -0
- package/dist/audit.js +5 -0
- package/dist/{chunk-GQVEYTBY.js → chunk-B2MJLGF6.js} +14 -3
- package/dist/{chunk-PBK6SYH5.js → chunk-CVG5GSMN.js} +46 -11
- package/dist/{chunk-XVBR2UPH.js → chunk-LWVGIJ5A.js} +175 -37
- package/dist/{chunk-3OTKMKJQ.js → chunk-LXDNIJFG.js} +36 -15
- package/dist/{cli-WG3UJNUF.js → chunk-NTIPJ5U7.js} +12 -172
- package/dist/chunk-OQXTQQAU.js +27 -0
- package/dist/{chunk-7T5WR74C.js → chunk-TQKDCA4V.js} +4 -4
- package/dist/chunk-WAV6AKR4.js +711 -0
- package/dist/{chunk-Q7ILL2HV.js → chunk-YK2FFL6Z.js} +1 -1
- package/dist/cli-3GQROFCB.js +241 -0
- package/dist/{cli-WSHPSWVU.js → cli-52M62QBN.js} +6 -5
- package/dist/{cli-Z2IQG3LC.js → cli-AVYNHBFJ.js} +12 -5
- package/dist/cli-CWORJYOU.js +190 -0
- package/dist/{cli-O3CDSONO.js → cli-K4LSRYBE.js} +86 -20
- package/dist/{cli-3CGUKXY4.js → cli-PEATEW57.js} +6 -4
- package/dist/cli.js +2 -2
- package/dist/generate.js +6 -0
- package/dist/index.cjs +1142 -208
- package/dist/index.d.cts +603 -57
- package/dist/index.d.ts +603 -57
- package/dist/index.js +1084 -208
- package/package.json +1 -1
- package/dist/chunk-OOZOEWGD.js +0 -295
package/dist/index.d.cts
CHANGED
|
@@ -1448,6 +1448,158 @@ 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
|
+
|
|
1549
|
+
/**
|
|
1550
|
+
* Lexical and specificity features for a short block of copy.
|
|
1551
|
+
*
|
|
1552
|
+
* The sentence-shape features (shape.ts) did not separate model copy from
|
|
1553
|
+
* people's at blurb length. These measure what a block says and which words it
|
|
1554
|
+
* reaches for: how many of the tell words and phrases craft already lists, how
|
|
1555
|
+
* many words with published excess-use evidence, and how particular the block
|
|
1556
|
+
* is (names, places, figures, the nouns of the trade).
|
|
1557
|
+
*
|
|
1558
|
+
* Pure and zero-dependency, and used both by the calibration scripts and by
|
|
1559
|
+
* any tell that ships on the result.
|
|
1560
|
+
*
|
|
1561
|
+
* Every word in STUDY_WORDS carries its source. Models change what they
|
|
1562
|
+
* over-use between generations (Juzek and Ward found "boasts" gone and
|
|
1563
|
+
* "underscore" up sharply from GPT-3.5 to GPT-4o-mini), so a listed word is a
|
|
1564
|
+
* measurement with a date, not a fact about models.
|
|
1565
|
+
*/
|
|
1566
|
+
interface StudyWord {
|
|
1567
|
+
word: string;
|
|
1568
|
+
source: string;
|
|
1569
|
+
}
|
|
1570
|
+
/**
|
|
1571
|
+
* Words with published excess-use evidence. Academic register, so a word here
|
|
1572
|
+
* is a candidate to measure in marketing copy, not a tell.
|
|
1573
|
+
*/
|
|
1574
|
+
declare const STUDY_WORDS: readonly StudyWord[];
|
|
1575
|
+
/** Every word or phrase the features look for, with where it came from. */
|
|
1576
|
+
declare function vocabulary(): {
|
|
1577
|
+
word: string;
|
|
1578
|
+
source: string;
|
|
1579
|
+
}[];
|
|
1580
|
+
/** Occurrences per vocabulary word in the text. */
|
|
1581
|
+
declare function vocabularyCounts(text: string): Map<string, number>;
|
|
1582
|
+
interface LexicalFeatures {
|
|
1583
|
+
/** Hits from craft's own tell lists, per 100 words. */
|
|
1584
|
+
listRate: number;
|
|
1585
|
+
/** Hits from the published excess-use words, per 100 words. */
|
|
1586
|
+
studyRate: number;
|
|
1587
|
+
/** Distinct specifics (names, places, figures, dates, contact details, brief terms) per 100 words. */
|
|
1588
|
+
hardPer100: number;
|
|
1589
|
+
/** Distinct trade nouns per 100 words. */
|
|
1590
|
+
tradePer100: number;
|
|
1591
|
+
/** All specifics per 100 words. */
|
|
1592
|
+
specificsPer100: number;
|
|
1593
|
+
/** 1 when there is no hard specific and fewer than two trade nouns. */
|
|
1594
|
+
generic: number;
|
|
1595
|
+
/** Distinct money, date, time and number specifics. */
|
|
1596
|
+
figures: number;
|
|
1597
|
+
/** Distinct names and brief terms. */
|
|
1598
|
+
names: number;
|
|
1599
|
+
}
|
|
1600
|
+
declare const LEXICAL_FEATURES: readonly (keyof LexicalFeatures)[];
|
|
1601
|
+
declare function lexicalOf(text: string, brief?: string): LexicalFeatures;
|
|
1602
|
+
|
|
1451
1603
|
/**
|
|
1452
1604
|
* Specificity tells: a page that could belong to anyone.
|
|
1453
1605
|
*
|
|
@@ -1910,6 +2062,16 @@ declare const DISTANCE_WEIGHTS: {
|
|
|
1910
2062
|
};
|
|
1911
2063
|
/** Layout distance, 0 to 1: by role and geometry when both have them, else by kind as in version 1. */
|
|
1912
2064
|
declare function layoutDistance(a: Fingerprint, b: Fingerprint): number;
|
|
2065
|
+
/** ΔE in OKLab. 0.02 is barely visible; by 0.3 two accents read as different colours. */
|
|
2066
|
+
declare const ACCENT_SCALE = 0.3;
|
|
2067
|
+
/** Grounds sit near white, where a smaller step already reads as a different paper. */
|
|
2068
|
+
declare const GROUND_SCALE = 0.15;
|
|
2069
|
+
/** A part at or below this distance counts as shared between two sites. */
|
|
2070
|
+
declare const SHARED_PART = 0.2;
|
|
2071
|
+
/** Two accents within this ΔE_OK read as the same colour family: about 6 on the familiar ΔE scale. */
|
|
2072
|
+
declare const ACCENT_SHARED: number;
|
|
2073
|
+
/** Two grounds within this ΔE_OK read as the same paper. */
|
|
2074
|
+
declare const GROUND_SHARED: number;
|
|
1913
2075
|
declare function fingerprintDistance(a: Fingerprint, b: Fingerprint): FingerprintDistance;
|
|
1914
2076
|
/**
|
|
1915
2077
|
* The nearest neighbours of a fingerprint in a set, closest first. Typicality
|
|
@@ -1923,6 +2085,209 @@ declare function nearest<T>(target: Fingerprint, set: {
|
|
|
1923
2085
|
distance: FingerprintDistance;
|
|
1924
2086
|
}[];
|
|
1925
2087
|
|
|
2088
|
+
/**
|
|
2089
|
+
* `art-direction.json`: what a site decided about how it looks, and why.
|
|
2090
|
+
*
|
|
2091
|
+
* CHARACTER.md's reason rule lives here. Every expressive choice records a
|
|
2092
|
+
* `because` drawn from the client's real world (the shopfront, the van, the
|
|
2093
|
+
* trade's own lettering, the place, the materials) and points at a source
|
|
2094
|
+
* that shows it. A choice with no reason is a default, however good it looks.
|
|
2095
|
+
*
|
|
2096
|
+
* The file also carries the tell exceptions craft has read since phase A, in
|
|
2097
|
+
* the same shape, so an existing file stays valid.
|
|
2098
|
+
*/
|
|
2099
|
+
|
|
2100
|
+
/** What `craft direction init` writes. Version 1 files still validate, with a warning. */
|
|
2101
|
+
declare const DIRECTION_VERSION = 2;
|
|
2102
|
+
declare const DIRECTION_VERSIONS: readonly [1, 2];
|
|
2103
|
+
/** The customer's own words: evidence for the job map, never for a token. */
|
|
2104
|
+
declare const CUSTOMER_KINDS: readonly ["review", "enquiry", "conversation", "search"];
|
|
2105
|
+
type CustomerKind = (typeof CUSTOMER_KINDS)[number];
|
|
2106
|
+
/**
|
|
2107
|
+
* Where a reason comes from. Deliberately physical: a mood board is not a
|
|
2108
|
+
* source. Customer-voice kinds back the job map. A `reference` is visual
|
|
2109
|
+
* inspiration from outside the client's category, and says where it is from.
|
|
2110
|
+
*/
|
|
2111
|
+
declare const SOURCE_KINDS: readonly ["livery", "shopfront", "signage", "packaging", "product", "uniform", "interior", "place", "material", "trade", "print", "photo", "founder", "review", "enquiry", "conversation", "search", "reference"];
|
|
2112
|
+
type SourceKind = (typeof SOURCE_KINDS)[number];
|
|
2113
|
+
interface DirectionSource {
|
|
2114
|
+
/** Short id a choice refers to: "van", "fascia", "price-list". */
|
|
2115
|
+
id: string;
|
|
2116
|
+
kind: SourceKind;
|
|
2117
|
+
/** What it is and where, in a sentence. */
|
|
2118
|
+
note: string;
|
|
2119
|
+
/** A photo or file in the repo, or a URL. */
|
|
2120
|
+
path?: string;
|
|
2121
|
+
/** Colours read off it by a person or by `craft direction propose`, as hex. */
|
|
2122
|
+
colours?: string[];
|
|
2123
|
+
/** Lettering seen on it: "hand-painted sign-writing", "stencilled capitals". */
|
|
2124
|
+
lettering?: string;
|
|
2125
|
+
/** Where a `reference` comes from: "letterpress print", "a railway station", "a bakery". Never the client's own trade. */
|
|
2126
|
+
category?: string;
|
|
2127
|
+
}
|
|
2128
|
+
/** The expressive choices. Structure is the hierarchy layer, decided from the job. */
|
|
2129
|
+
declare const CHOICE_KEYS: readonly ["accent", "ground", "display", "body", "shape", "motif", "signature"];
|
|
2130
|
+
type ChoiceKey = (typeof CHOICE_KEYS)[number];
|
|
2131
|
+
interface DirectionChoice {
|
|
2132
|
+
/** A colour as hex for accent and ground, a family name for display and body, words otherwise. */
|
|
2133
|
+
value: string;
|
|
2134
|
+
because: string;
|
|
2135
|
+
/** Source ids this reason rests on. */
|
|
2136
|
+
evidence: string[];
|
|
2137
|
+
}
|
|
2138
|
+
/** One part of the job: what it is, and the customer's words that show it. */
|
|
2139
|
+
interface JobPart {
|
|
2140
|
+
value: string;
|
|
2141
|
+
evidence: string[];
|
|
2142
|
+
}
|
|
2143
|
+
declare const CONSIDERATION: readonly ["low", "considered", "high"];
|
|
2144
|
+
type Consideration = (typeof CONSIDERATION)[number];
|
|
2145
|
+
/**
|
|
2146
|
+
* What the visitor is trying to get done, from their side. Every hierarchy
|
|
2147
|
+
* reason is checked against it, so it replaces "what do other sites in the
|
|
2148
|
+
* trade do" as the starting point.
|
|
2149
|
+
*/
|
|
2150
|
+
interface JobMap {
|
|
2151
|
+
/** Verb + object + context: "find" / "an electrician they can trust with a dangerous fault" / "today, without being overcharged". */
|
|
2152
|
+
statement: {
|
|
2153
|
+
verb: string;
|
|
2154
|
+
object: string;
|
|
2155
|
+
context: string;
|
|
2156
|
+
};
|
|
2157
|
+
functional: JobPart;
|
|
2158
|
+
emotional: JobPart;
|
|
2159
|
+
social: JobPart;
|
|
2160
|
+
/** How long and how carefully they decide: an emergency call-out is low, a retained plan is high. */
|
|
2161
|
+
consideration: {
|
|
2162
|
+
value: Consideration;
|
|
2163
|
+
because: string;
|
|
2164
|
+
evidence: string[];
|
|
2165
|
+
};
|
|
2166
|
+
objections: string[];
|
|
2167
|
+
/** Their own words, quoted from a cited source. */
|
|
2168
|
+
language: string[];
|
|
2169
|
+
/** The customer-voice sources the language is quoted from. */
|
|
2170
|
+
evidence: string[];
|
|
2171
|
+
}
|
|
2172
|
+
/** Page types a hierarchy is declared for. Each page has its own job on the site. */
|
|
2173
|
+
declare const PAGE_TYPES: readonly ["home", "service", "about", "pricing", "booking", "contact", "article", "landing"];
|
|
2174
|
+
type PageType = (typeof PAGE_TYPES)[number];
|
|
2175
|
+
/** Where a call to action can sit: a section role, or the header, or pinned while scrolling. */
|
|
2176
|
+
type ActionPosition = SectionRole | "header" | "sticky";
|
|
2177
|
+
interface PageHierarchy {
|
|
2178
|
+
primaryAction: {
|
|
2179
|
+
value: string;
|
|
2180
|
+
positions: ActionPosition[];
|
|
2181
|
+
because: string;
|
|
2182
|
+
evidence?: string[];
|
|
2183
|
+
};
|
|
2184
|
+
order: {
|
|
2185
|
+
role: SectionRole;
|
|
2186
|
+
because: string;
|
|
2187
|
+
}[];
|
|
2188
|
+
lead: {
|
|
2189
|
+
value: string;
|
|
2190
|
+
subordinate?: string[];
|
|
2191
|
+
because: string;
|
|
2192
|
+
};
|
|
2193
|
+
journey: {
|
|
2194
|
+
stage: string;
|
|
2195
|
+
because: string;
|
|
2196
|
+
}[];
|
|
2197
|
+
}
|
|
2198
|
+
declare const HIERARCHY_FIELDS: readonly ["primaryAction", "order", "lead", "journey"];
|
|
2199
|
+
interface ArtDirection {
|
|
2200
|
+
$schema?: string;
|
|
2201
|
+
version: (typeof DIRECTION_VERSIONS)[number];
|
|
2202
|
+
client: string;
|
|
2203
|
+
/** Who, where, and what they do, in a sentence or two. The brief a model would have been given. */
|
|
2204
|
+
brief: string;
|
|
2205
|
+
/** Version 2. */
|
|
2206
|
+
job?: JobMap;
|
|
2207
|
+
/** Version 2. Keyed by page type. */
|
|
2208
|
+
hierarchy?: Partial<Record<PageType, PageHierarchy>>;
|
|
2209
|
+
sources: DirectionSource[];
|
|
2210
|
+
choices: Partial<Record<ChoiceKey, DirectionChoice>>;
|
|
2211
|
+
exceptions?: TellException[];
|
|
2212
|
+
}
|
|
2213
|
+
type DirectionSeverity = "error" | "warn";
|
|
2214
|
+
interface DirectionProblem {
|
|
2215
|
+
severity: DirectionSeverity;
|
|
2216
|
+
/** Where in the file: "choices.accent.because", "sources[2].kind". */
|
|
2217
|
+
at: string;
|
|
2218
|
+
message: string;
|
|
2219
|
+
}
|
|
2220
|
+
interface DirectionReport {
|
|
2221
|
+
valid: boolean;
|
|
2222
|
+
problems: DirectionProblem[];
|
|
2223
|
+
/** How many of the seven choices carry an accepted reason. */
|
|
2224
|
+
decided: number;
|
|
2225
|
+
/** Each layer on its own. A site is only decided when all three are. */
|
|
2226
|
+
layers: {
|
|
2227
|
+
job: boolean;
|
|
2228
|
+
hierarchy: {
|
|
2229
|
+
page: PageType;
|
|
2230
|
+
decided: number;
|
|
2231
|
+
total: number;
|
|
2232
|
+
}[];
|
|
2233
|
+
tokens: {
|
|
2234
|
+
decided: number;
|
|
2235
|
+
total: number;
|
|
2236
|
+
};
|
|
2237
|
+
/** Job decided, at least a home page hierarchy with every field decided, and five of seven tokens. */
|
|
2238
|
+
complete: boolean;
|
|
2239
|
+
};
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
/**
|
|
2243
|
+
* The estate check before anything is built: declared art directions compared
|
|
2244
|
+
* with each other, not rendered pages.
|
|
2245
|
+
*
|
|
2246
|
+
* `compareToEstate` catches two clients converging after both sites ship. By
|
|
2247
|
+
* then the fix is a retrofit. This compares what each `art-direction.json`
|
|
2248
|
+
* says it will be, so the convergence is caught while it is still a decision.
|
|
2249
|
+
*
|
|
2250
|
+
* The colour thresholds are the rendered check's own (`ACCENT_SHARED`,
|
|
2251
|
+
* `GROUND_SHARED`), so the two checks agree on what "the same accent" means.
|
|
2252
|
+
* It ranks and names what is shared; there is no sibling line until declared
|
|
2253
|
+
* directions have been calibrated against the rendered estate.
|
|
2254
|
+
*
|
|
2255
|
+
* Pure.
|
|
2256
|
+
*/
|
|
2257
|
+
|
|
2258
|
+
/** What an art direction commits to, as the estate register stores it. */
|
|
2259
|
+
interface DirectionSummary {
|
|
2260
|
+
accent?: string;
|
|
2261
|
+
ground?: string;
|
|
2262
|
+
display?: string;
|
|
2263
|
+
body?: string;
|
|
2264
|
+
shape?: string;
|
|
2265
|
+
/** The home page's running order. */
|
|
2266
|
+
order?: SectionRole[];
|
|
2267
|
+
primaryAction?: string;
|
|
2268
|
+
positions?: string[];
|
|
2269
|
+
}
|
|
2270
|
+
declare function summariseDirection(d: Partial<ArtDirection>): DirectionSummary;
|
|
2271
|
+
interface DirectionComparison {
|
|
2272
|
+
shared: string[];
|
|
2273
|
+
accentDelta: number | null;
|
|
2274
|
+
groundDelta: number | null;
|
|
2275
|
+
/** Edit distance over the longer order, 0 to 1; null without both orders. */
|
|
2276
|
+
orderDistance: number | null;
|
|
2277
|
+
/** Worth a look before either is built. */
|
|
2278
|
+
flagged: boolean;
|
|
2279
|
+
}
|
|
2280
|
+
declare function compareDirections(a: DirectionSummary, b: DirectionSummary): DirectionComparison;
|
|
2281
|
+
interface DirectionMatch extends DirectionComparison {
|
|
2282
|
+
id: string;
|
|
2283
|
+
}
|
|
2284
|
+
/** Every site in the register with a declared direction, most shared first. */
|
|
2285
|
+
declare function compareToDeclared(target: DirectionSummary, sites: {
|
|
2286
|
+
id: string;
|
|
2287
|
+
direction?: DirectionSummary;
|
|
2288
|
+
}[], exclude?: string): DirectionMatch[];
|
|
2289
|
+
declare function formatDirectionMatches(label: string, matches: DirectionMatch[]): string;
|
|
2290
|
+
|
|
1926
2291
|
/**
|
|
1927
2292
|
* The estate register: every site the agency has shipped, fingerprinted, so a
|
|
1928
2293
|
* new one can be checked against its siblings. Signal 3 of CHARACTER.md.
|
|
@@ -1955,10 +2320,13 @@ interface EstateSite {
|
|
|
1955
2320
|
url: string;
|
|
1956
2321
|
/** Where the site's source lives, if known: "rmp474/RMP-Electrical". */
|
|
1957
2322
|
repo?: string;
|
|
1958
|
-
|
|
2323
|
+
/** Absent for a direction registered before the site is built. */
|
|
2324
|
+
fingerprint?: Fingerprint;
|
|
1959
2325
|
/** Rendered tells found when it was added, for the record. */
|
|
1960
2326
|
tells: string[];
|
|
1961
2327
|
addedAt: string;
|
|
2328
|
+
/** What its art-direction.json declares, so a new direction is checked before anything is built. */
|
|
2329
|
+
direction?: DirectionSummary;
|
|
1962
2330
|
}
|
|
1963
2331
|
interface EstateRegister {
|
|
1964
2332
|
version: typeof ESTATE_VERSION;
|
|
@@ -1970,7 +2338,7 @@ declare function addSite(register: EstateRegister, site: EstateSite): EstateRegi
|
|
|
1970
2338
|
/**
|
|
1971
2339
|
* What two fingerprints effectively share, named the way a person would see
|
|
1972
2340
|
* it: "Fraunces headline", "no accent", "pill buttons". A part counts when its
|
|
1973
|
-
* distance is
|
|
2341
|
+
* distance is `SHARED_PART` or less.
|
|
1974
2342
|
*/
|
|
1975
2343
|
declare function sharedParts(a: Fingerprint, b: Fingerprint, d?: FingerprintDistance): string[];
|
|
1976
2344
|
interface EstateMatch {
|
|
@@ -2035,9 +2403,18 @@ interface NullRun {
|
|
|
2035
2403
|
interface NullModel {
|
|
2036
2404
|
version: typeof NULL_VERSION;
|
|
2037
2405
|
brief: string;
|
|
2406
|
+
/**
|
|
2407
|
+
* The prompt each page was built from. For imported pages, the prompt the
|
|
2408
|
+
* person was asked to give the builder: `craft null prompt` prints it.
|
|
2409
|
+
*/
|
|
2038
2410
|
prompt: string;
|
|
2039
|
-
/** What was asked for with --model, or "default". */
|
|
2411
|
+
/** What was asked for with --model, or "default"; "unknown" for imported pages unless given. */
|
|
2040
2412
|
model: string;
|
|
2413
|
+
/**
|
|
2414
|
+
* The tool that built the pages, when they were imported rather than
|
|
2415
|
+
* generated here: "v0", "lovable". Absent for `craft null build`.
|
|
2416
|
+
*/
|
|
2417
|
+
builder?: string;
|
|
2041
2418
|
catalogueVersion: string;
|
|
2042
2419
|
builtAt: string;
|
|
2043
2420
|
runs: NullRun[];
|
|
@@ -2293,67 +2670,132 @@ declare const VAGUE_WORDS: readonly ["innovative", "scalable", "end-to-end", "st
|
|
|
2293
2670
|
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
2671
|
|
|
2295
2672
|
/**
|
|
2296
|
-
*
|
|
2673
|
+
* The reason rule, one standard for every layer of an art direction.
|
|
2297
2674
|
*
|
|
2298
|
-
*
|
|
2299
|
-
*
|
|
2300
|
-
*
|
|
2301
|
-
*
|
|
2675
|
+
* A reason has to be specific enough that whoever reads the file next (a
|
|
2676
|
+
* person, Claude, a future tool) cannot drift back to the category default
|
|
2677
|
+
* while following it. "Freight Display, because MMM's photography needs to be
|
|
2678
|
+
* the hero and the type needs to recede" passes. "Freight Display" does not,
|
|
2679
|
+
* and neither does "a familiar structure so visitors feel comfortable".
|
|
2302
2680
|
*
|
|
2303
|
-
*
|
|
2304
|
-
*
|
|
2681
|
+
* Wording rules catch the common ways a default gets dressed up as a reason.
|
|
2682
|
+
* They are lexical, so they can be rephrased around; the tie is the real
|
|
2683
|
+
* guard. A token's reason must mention what its evidence shows. A hierarchy
|
|
2684
|
+
* reason must use this client's job: pasted onto another client's file, it
|
|
2685
|
+
* has to fail.
|
|
2686
|
+
*
|
|
2687
|
+
* Pure.
|
|
2305
2688
|
*/
|
|
2306
2689
|
|
|
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;
|
|
2690
|
+
declare const PROPOSED = "PROPOSED:";
|
|
2691
|
+
/**
|
|
2692
|
+
* Reasons that are preferences, not evidence. "The client likes it" may be
|
|
2693
|
+
* true and still say nothing about why this site should look this way.
|
|
2694
|
+
*/
|
|
2695
|
+
declare const PREFERENCE: RegExp;
|
|
2696
|
+
/** Adjectives that describe a mood rather than a source. Two or more and the reason is a mood board. */
|
|
2697
|
+
declare const MOOD: RegExp;
|
|
2698
|
+
/**
|
|
2699
|
+
* A default stated as a reason. Three families: authority ("best practice"),
|
|
2700
|
+
* the crowd ("what competitors do", "most salon sites") and familiarity
|
|
2701
|
+
* ("a familiar layout", "what visitors are used to"). Each is the category
|
|
2702
|
+
* average speaking, which is what the art direction exists to replace.
|
|
2703
|
+
*/
|
|
2704
|
+
declare const CONVENTION: RegExp;
|
|
2705
|
+
/** Content words, lower-case, with a possessive stripped and short words dropped. */
|
|
2706
|
+
declare function contentWords(text: string): Set<string>;
|
|
2707
|
+
/** Every word of the job a hierarchy reason may tie to. */
|
|
2708
|
+
declare function jobWords(job: JobMap): Set<string>;
|
|
2709
|
+
interface ReasonInput {
|
|
2710
|
+
/** Where in the file: "choices.accent", "hierarchy.home.order[2]". Problems land at `${at}.because` and `${at}.evidence`. */
|
|
2711
|
+
at: string;
|
|
2712
|
+
because: unknown;
|
|
2713
|
+
evidence?: unknown;
|
|
2340
2714
|
sources: DirectionSource[];
|
|
2341
|
-
|
|
2342
|
-
|
|
2715
|
+
/**
|
|
2716
|
+
* What the reason must be about.
|
|
2717
|
+
* source mentions what its cited evidence shows (tokens)
|
|
2718
|
+
* customer the same, and every cited source is the customer's own words (the job map)
|
|
2719
|
+
* job uses this client's job (hierarchy); evidence optional
|
|
2720
|
+
*/
|
|
2721
|
+
tie: "source" | "customer" | "job";
|
|
2722
|
+
job?: JobMap;
|
|
2343
2723
|
}
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2724
|
+
/** Problems with one reason. None means it counts as decided. */
|
|
2725
|
+
declare function checkReason(input: ReasonInput): DirectionProblem[];
|
|
2726
|
+
|
|
2727
|
+
/**
|
|
2728
|
+
* The job map: what the visitor is trying to get done, in their words.
|
|
2729
|
+
*
|
|
2730
|
+
* It replaces "what do other sites in the trade do" as the starting point.
|
|
2731
|
+
* Hierarchy reasons are checked against it, so it has to describe this
|
|
2732
|
+
* client's customer, not the category: "find an electrician they can trust
|
|
2733
|
+
* with a dangerous fault, today" is a job; "electrician website" is a label.
|
|
2734
|
+
*
|
|
2735
|
+
* Pure. Quotes are checked against source text the caller can read.
|
|
2736
|
+
*/
|
|
2737
|
+
|
|
2738
|
+
/** An object that is only trade nouns and website words: "electrician website", "a local salon site". */
|
|
2739
|
+
declare function isCategoryLabel(object: string, brief?: string): boolean;
|
|
2740
|
+
interface JobContext {
|
|
2741
|
+
brief?: string;
|
|
2742
|
+
/** Text of a cited source's file, when the caller can read it. */
|
|
2743
|
+
readSource?: (source: DirectionSource) => string | undefined;
|
|
2350
2744
|
}
|
|
2351
|
-
|
|
2352
|
-
valid: boolean;
|
|
2745
|
+
declare function validateJob(job: unknown, sources: DirectionSource[], ctx?: JobContext): {
|
|
2353
2746
|
problems: DirectionProblem[];
|
|
2354
|
-
|
|
2747
|
+
decided: boolean;
|
|
2748
|
+
};
|
|
2749
|
+
|
|
2750
|
+
/**
|
|
2751
|
+
* The hierarchy layer: what each page puts first, where it asks, and why.
|
|
2752
|
+
*
|
|
2753
|
+
* A conventional order is allowed and never penalised. What fails is an
|
|
2754
|
+
* order nobody chose: every field needs a reason that uses this client's job.
|
|
2755
|
+
* The primary action's reason must also say how the job's consideration (a
|
|
2756
|
+
* two-minute emergency call against a months-long decision) or one of its
|
|
2757
|
+
* objections leads to where the ask sits. The evidence on placement is mixed,
|
|
2758
|
+
* so craft encodes no default position; it requires the reason.
|
|
2759
|
+
*
|
|
2760
|
+
* Pure. The declared order is checked against a version 2 snapshot's section
|
|
2761
|
+
* roles when one is given.
|
|
2762
|
+
*/
|
|
2763
|
+
|
|
2764
|
+
declare const SECTION_ROLES: readonly SectionRole[];
|
|
2765
|
+
interface PageResult {
|
|
2766
|
+
page: PageType;
|
|
2355
2767
|
decided: number;
|
|
2768
|
+
total: number;
|
|
2356
2769
|
}
|
|
2770
|
+
declare function validateHierarchy(hierarchy: unknown, job: JobMap | undefined, sources: DirectionSource[]): {
|
|
2771
|
+
problems: DirectionProblem[];
|
|
2772
|
+
pages: PageResult[];
|
|
2773
|
+
};
|
|
2774
|
+
/** Roles a snapshot shows, in running order, without the unclassified ones. */
|
|
2775
|
+
declare function renderedOrder(snapshot: Snapshot): SectionRole[] | null;
|
|
2776
|
+
/** The declared order against the page that ships. Drift warns; `strict` makes it an error. */
|
|
2777
|
+
declare function checkOrder(declared: PageHierarchy | undefined, page: PageType, snapshot: Snapshot, strict?: boolean): DirectionProblem[];
|
|
2778
|
+
|
|
2779
|
+
/**
|
|
2780
|
+
* The research prompt for a new client: job material only.
|
|
2781
|
+
*
|
|
2782
|
+
* A research model asked "what do good electrician websites look like"
|
|
2783
|
+
* returns the category average, because that is what it was trained on. So
|
|
2784
|
+
* the prompt craft hands over asks only about the customer (their situation,
|
|
2785
|
+
* objections, words, where they look) and forbids describing the category's
|
|
2786
|
+
* sites. Visual references, when wanted, come from outside the category.
|
|
2787
|
+
*
|
|
2788
|
+
* Pure text. Nothing here calls a model.
|
|
2789
|
+
*/
|
|
2790
|
+
interface ResearchInput {
|
|
2791
|
+
brief: string;
|
|
2792
|
+
client?: string;
|
|
2793
|
+
/** Add prompts for visual references from outside the category. */
|
|
2794
|
+
visual?: boolean;
|
|
2795
|
+
}
|
|
2796
|
+
/** The trade words in a brief, for naming what not to research. */
|
|
2797
|
+
declare function tradeOf(brief: string): string[];
|
|
2798
|
+
declare function researchPrompt(input: ResearchInput): string;
|
|
2357
2799
|
|
|
2358
2800
|
/**
|
|
2359
2801
|
* Checking an art direction: the file's shape, the reason rule, and whether
|
|
@@ -2365,14 +2807,30 @@ interface DirectionReport {
|
|
|
2365
2807
|
interface ValidateContext {
|
|
2366
2808
|
/** The fingerprint of the rendered site, to check the file against what ships. */
|
|
2367
2809
|
fingerprint?: Fingerprint;
|
|
2810
|
+
/** The rendered page itself, to check the declared order against its section roles. */
|
|
2811
|
+
snapshot?: Snapshot;
|
|
2812
|
+
/** Which page the snapshot is. Default home. */
|
|
2813
|
+
page?: PageType;
|
|
2814
|
+
/** Drift between the file and the page is an error, for a pre-launch gate. */
|
|
2815
|
+
strict?: boolean;
|
|
2368
2816
|
/** Which cited paths exist, when the caller can look. */
|
|
2369
2817
|
pathExists?: (path: string) => boolean;
|
|
2818
|
+
/** Text of a cited source's file, for checking quoted customer language. */
|
|
2819
|
+
readSource?: (source: DirectionSource) => string | undefined;
|
|
2820
|
+
/** Declared directions of the other sites in the estate, to catch convergence before build. */
|
|
2821
|
+
estate?: {
|
|
2822
|
+
id: string;
|
|
2823
|
+
direction?: DirectionSummary;
|
|
2824
|
+
}[];
|
|
2825
|
+
/** This site's id in the estate, left out of the comparison. */
|
|
2826
|
+
estateId?: string;
|
|
2370
2827
|
}
|
|
2371
2828
|
declare function validateDirection(input: unknown, ctx?: ValidateContext): DirectionReport;
|
|
2372
2829
|
|
|
2373
2830
|
/**
|
|
2374
2831
|
* A first art-direction.json for a site that exists: what it does today,
|
|
2375
|
-
* written down,
|
|
2832
|
+
* written down (its tokens and, from a version 2 snapshot, its running order),
|
|
2833
|
+
* with every reason and the whole job map left empty.
|
|
2376
2834
|
*
|
|
2377
2835
|
* Empty on purpose. `validateDirection` fails the file until each choice has
|
|
2378
2836
|
* a source and a reason, so the first thing init produces is the list of
|
|
@@ -2439,7 +2897,6 @@ declare function licencesJson(): string;
|
|
|
2439
2897
|
* Pure. Pixels come in as numbers; the CLI decodes the images.
|
|
2440
2898
|
*/
|
|
2441
2899
|
|
|
2442
|
-
declare const PROPOSED = "PROPOSED:";
|
|
2443
2900
|
interface PaletteColour {
|
|
2444
2901
|
hex: string;
|
|
2445
2902
|
/** Share of sampled pixels, 0 to 1. */
|
|
@@ -2463,6 +2920,11 @@ interface ProposeInput {
|
|
|
2463
2920
|
id: string;
|
|
2464
2921
|
fingerprint: Fingerprint;
|
|
2465
2922
|
}[];
|
|
2923
|
+
/** Accents other sites have declared but not yet shipped: a sibling can happen before either is built. */
|
|
2924
|
+
declared?: {
|
|
2925
|
+
id: string;
|
|
2926
|
+
accent: string;
|
|
2927
|
+
}[];
|
|
2466
2928
|
}
|
|
2467
2929
|
interface Proposal {
|
|
2468
2930
|
key: ChoiceKey;
|
|
@@ -2477,6 +2939,90 @@ declare function propose(input: ProposeInput): {
|
|
|
2477
2939
|
direction: ArtDirection;
|
|
2478
2940
|
};
|
|
2479
2941
|
|
|
2942
|
+
/**
|
|
2943
|
+
* Calibration: how well the catalogue separates pages a person has labelled.
|
|
2944
|
+
*
|
|
2945
|
+
* A labelled set holds three kinds of page. `ai` pages were generated. `human`
|
|
2946
|
+
* pages were made by people. `ai-looking` pages were made by people and still
|
|
2947
|
+
* read as generated to someone who looks at many sites: they are what the
|
|
2948
|
+
* tells are for, since a tell detects a look, not a maker. So a tell's hit on
|
|
2949
|
+
* an `ai` or an `ai-looking` page counts for it, and a hit on a `human` page
|
|
2950
|
+
* counts against it.
|
|
2951
|
+
*
|
|
2952
|
+
* The verdict is the one CHARACTER.md fixed before any result was read: a page
|
|
2953
|
+
* is flagged when it is typical against the null models, or tell-heavy (three
|
|
2954
|
+
* or more distinct design tells). With no null models, tell-heavy decides.
|
|
2955
|
+
*
|
|
2956
|
+
* The targets are CHARACTER.md's first three. Target 4 (no siblings in the
|
|
2957
|
+
* estate) is `craft estate compare`; target 5 (people cannot tell) is the blind
|
|
2958
|
+
* test in docs/blind-test.md, which no tool here can run.
|
|
2959
|
+
*
|
|
2960
|
+
* Pure. Taking snapshots and reading files lives in the CLI.
|
|
2961
|
+
*/
|
|
2962
|
+
declare const LABELS: readonly ["ai", "ai-looking", "human"];
|
|
2963
|
+
type Label = (typeof LABELS)[number];
|
|
2964
|
+
/** Targets 1 and 3: this share of the set flagged, or more. */
|
|
2965
|
+
declare const FLAGGED_TARGET = 0.9;
|
|
2966
|
+
/** Target 2: this share of the human set typical, or less. */
|
|
2967
|
+
declare const HUMAN_TYPICAL_TARGET = 0.1;
|
|
2968
|
+
interface MeasuredPage {
|
|
2969
|
+
id: string;
|
|
2970
|
+
label: Label;
|
|
2971
|
+
/** Every catalogue tell found on the page, each once. */
|
|
2972
|
+
tells: string[];
|
|
2973
|
+
/** Findings in the blocking tier. */
|
|
2974
|
+
blocking: number;
|
|
2975
|
+
/** Against the pooled null models; absent when none were given. */
|
|
2976
|
+
typicality?: {
|
|
2977
|
+
score: number;
|
|
2978
|
+
typical: boolean;
|
|
2979
|
+
};
|
|
2980
|
+
}
|
|
2981
|
+
interface UnmeasuredPage {
|
|
2982
|
+
id: string;
|
|
2983
|
+
label: Label;
|
|
2984
|
+
reason: string;
|
|
2985
|
+
}
|
|
2986
|
+
interface LabelSummary {
|
|
2987
|
+
label: Label;
|
|
2988
|
+
pages: number;
|
|
2989
|
+
flagged: number;
|
|
2990
|
+
typical: number | null;
|
|
2991
|
+
tellHeavy: number;
|
|
2992
|
+
blocking: number;
|
|
2993
|
+
}
|
|
2994
|
+
interface TellRate {
|
|
2995
|
+
tell: string;
|
|
2996
|
+
hits: Record<Label, number>;
|
|
2997
|
+
/** Hits on `ai` and `ai-looking` pages over all hits. */
|
|
2998
|
+
precision: number;
|
|
2999
|
+
/** `ai` and `ai-looking` pages hit, over all of them measured. Null when there are none. */
|
|
3000
|
+
recall: number | null;
|
|
3001
|
+
}
|
|
3002
|
+
interface TargetCheck {
|
|
3003
|
+
target: string;
|
|
3004
|
+
/** Null when no page with that label was measured. */
|
|
3005
|
+
met: boolean | null;
|
|
3006
|
+
detail: string;
|
|
3007
|
+
}
|
|
3008
|
+
interface Calibration {
|
|
3009
|
+
pages: number;
|
|
3010
|
+
/** Whether typicality was measured, or tell-heavy alone decided. */
|
|
3011
|
+
typicality: boolean;
|
|
3012
|
+
labels: LabelSummary[];
|
|
3013
|
+
tells: TellRate[];
|
|
3014
|
+
/** Catalogue tells that fired on no page. */
|
|
3015
|
+
silent: string[];
|
|
3016
|
+
targets: TargetCheck[];
|
|
3017
|
+
unmeasured: UnmeasuredPage[];
|
|
3018
|
+
}
|
|
3019
|
+
/** Tells about the look, not the words: what "tell-heavy" counts. */
|
|
3020
|
+
declare function designTells(tells: string[]): string[];
|
|
3021
|
+
declare function isFlagged(page: MeasuredPage): boolean;
|
|
3022
|
+
declare function calibrate(pages: MeasuredPage[], unmeasured?: UnmeasuredPage[]): Calibration;
|
|
3023
|
+
/** `notes` are lines the caller knows and the numbers do not show, printed under the heading. */
|
|
3024
|
+
declare function formatCalibration(c: Calibration, notes?: string[]): string;
|
|
3025
|
+
|
|
2480
3026
|
/**
|
|
2481
3027
|
* The character report: the three signals and the reason rule, read together.
|
|
2482
3028
|
*
|
|
@@ -2552,4 +3098,4 @@ declare function characterReport(input: CharacterInputs, copyTells?: Set<string>
|
|
|
2552
3098
|
|
|
2553
3099
|
declare function retrofitPlan(report: CharacterReport, direction?: ArtDirection | null): string;
|
|
2554
3100
|
|
|
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 };
|
|
3101
|
+
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 Calibration, 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, FLAGGED_TARGET, 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, HUMAN_TYPICAL_TARGET, 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, LABELS, LEXICAL_FEATURES, LICENCES, LIGHTNESS_CURVE, type Label, type LabelSummary, type LexicalFeatures, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_RUNS, MOOD, type MeasuredPage, 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, STUDY_WORDS, 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 StudyWord, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type TargetCheck, type Tell, type TellException, type TellRate, type Tricolon, type TypeStep, type Typicality, type UnmeasuredPage, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, calibrate, 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, designTells, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatCalibration, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, globToRegExp, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, isFlagged, jobWords, layoutDistance, lexicalOf, 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, vocabulary, vocabularyCounts, wcagContrast, wordListsJson };
|