@domandigital/craft 0.23.2 → 0.24.1
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 +17 -5
- package/CHARACTER.md +98 -98
- package/COPY.md +2 -2
- package/PRINCIPLES.md +5 -5
- package/README.md +8 -8
- package/REGISTERS.md +3 -3
- package/design-review.schema.json +1 -1
- package/dist/{audit-SWLTAEDO.js → audit-Q73WGKMS.js} +3 -3
- package/dist/audit.cjs +22 -22
- package/dist/audit.js +22 -22
- package/dist/{chunk-A5M4AOMY.js → chunk-2CCL5CO7.js} +14 -14
- package/dist/{chunk-FBGXUVZU.js → chunk-4HPAMB52.js} +4 -4
- package/dist/{chunk-A5OYA2BG.js → chunk-6TOY3FAT.js} +5 -5
- package/dist/{chunk-E2ZYFBQX.js → chunk-GJZ4Y5PT.js} +5 -5
- package/dist/{chunk-NK6AAY7O.js → chunk-OA2MBUJJ.js} +1 -1
- package/dist/{chunk-CB4QDMH2.js → chunk-OOT4QLO3.js} +14 -14
- package/dist/{chunk-QNX7CROK.js → chunk-PXJKYMXF.js} +2 -2
- package/dist/{chunk-ZTHVOXZF.js → chunk-R4KPE4G5.js} +9 -9
- package/dist/{cli-BA3IVSMR.js → cli-766R2BUR.js} +5 -5
- package/dist/{cli-T5L55IWF.js → cli-CE7ENNNG.js} +6 -6
- package/dist/{cli-UPO4PR3Z.js → cli-DTJOOTNM.js} +3 -3
- package/dist/{cli-O2IEHB5Q.js → cli-EQJITFVE.js} +4 -4
- package/dist/{cli-ATLKYXPU.js → cli-SD2BJSGP.js} +6 -6
- package/dist/{cli-ZMLKL2NT.js → cli-TBBXUECM.js} +5 -5
- package/dist/{cli-BP4JLNAU.js → cli-TV2IJ5TV.js} +2 -3
- package/dist/{cli-7IAFZ6CV.js → cli-U3SPFILJ.js} +9 -9
- package/dist/cli.js +3 -3
- package/dist/index.cjs +23 -24
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +23 -24
- package/dist/{viewports-cli-Y4HPKZLI.js → viewports-cli-SOOHAD5D.js} +3 -3
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
holdHouseBlocks,
|
|
11
11
|
houseRule,
|
|
12
12
|
scanSource
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-2CCL5CO7.js";
|
|
14
14
|
import {
|
|
15
15
|
compareCompetitor,
|
|
16
16
|
compareFacts,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
pageCopy,
|
|
22
22
|
protectedFacts,
|
|
23
23
|
visibleText
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-R4KPE4G5.js";
|
|
25
25
|
|
|
26
26
|
// src/character/config.ts
|
|
27
27
|
var DEFAULT_IGNORE = [".claude", ".agents", ".cursor"];
|
|
@@ -622,7 +622,7 @@ async function pageSnapshot(target, cwd) {
|
|
|
622
622
|
return readSnapshot(JSON.parse(readFileSync(local, "utf8")), target);
|
|
623
623
|
}
|
|
624
624
|
if (!/^https?:\/\//.test(target)) throw new Error(`${target} is neither a URL nor a snapshot file`);
|
|
625
|
-
const { snapshotUrl } = await import("./audit-
|
|
625
|
+
const { snapshotUrl } = await import("./audit-Q73WGKMS.js");
|
|
626
626
|
return snapshotUrl(target);
|
|
627
627
|
}
|
|
628
628
|
async function briefFor(flags, cwd) {
|
|
@@ -633,7 +633,7 @@ async function briefFor(flags, cwd) {
|
|
|
633
633
|
if (typeof brief === "string" && brief.trim()) return brief;
|
|
634
634
|
} else if (flags.direction) throw new Error(`no such file: ${flags.direction}`);
|
|
635
635
|
if (flags.null) {
|
|
636
|
-
const { loadNull } = await import("./cli-
|
|
636
|
+
const { loadNull } = await import("./cli-EQJITFVE.js");
|
|
637
637
|
return loadNull(flags.null, cwd).brief;
|
|
638
638
|
}
|
|
639
639
|
return void 0;
|
|
@@ -659,37 +659,37 @@ async function compareWithCompetitor(flags, io) {
|
|
|
659
659
|
function run(argv, io) {
|
|
660
660
|
const [command, ...rest] = argv;
|
|
661
661
|
if (command === "direction") {
|
|
662
|
-
return import("./cli-
|
|
662
|
+
return import("./cli-TBBXUECM.js").then((m) => m.runDirection(rest, io));
|
|
663
663
|
}
|
|
664
664
|
if (command === "report" || command === "retrofit") {
|
|
665
|
-
return import("./cli-
|
|
665
|
+
return import("./cli-U3SPFILJ.js").then((m) => m.runReport(command, rest, io));
|
|
666
666
|
}
|
|
667
667
|
if (command === "register") {
|
|
668
|
-
return import("./cli-
|
|
668
|
+
return import("./cli-TV2IJ5TV.js").then((m) => m.runRegister(rest, io));
|
|
669
669
|
}
|
|
670
670
|
if (command === "estate") {
|
|
671
|
-
return import("./cli-
|
|
671
|
+
return import("./cli-SD2BJSGP.js").then((m) => m.runEstate(rest, io));
|
|
672
672
|
}
|
|
673
673
|
if (command === "null") {
|
|
674
|
-
return import("./cli-
|
|
674
|
+
return import("./cli-EQJITFVE.js").then((m) => m.runNull(rest, io));
|
|
675
675
|
}
|
|
676
676
|
if (command === "calibrate") {
|
|
677
|
-
return import("./cli-
|
|
677
|
+
return import("./cli-766R2BUR.js").then((m) => m.runCalibrate(rest, io));
|
|
678
678
|
}
|
|
679
679
|
if (command === "tells" && rest[0] === "harvest") {
|
|
680
|
-
return import("./cli-
|
|
680
|
+
return import("./cli-EQJITFVE.js").then((m) => m.runHarvest(rest, io)).catch((error) => {
|
|
681
681
|
io.err(`craft: ${error.message}`);
|
|
682
682
|
return 2;
|
|
683
683
|
});
|
|
684
684
|
}
|
|
685
685
|
if (command === "phone-first") {
|
|
686
|
-
return import("./cli-
|
|
686
|
+
return import("./cli-DTJOOTNM.js").then((m) => m.runPhoneFirst(rest, io));
|
|
687
687
|
}
|
|
688
688
|
if (command === "viewports") {
|
|
689
|
-
return import("./viewports-cli-
|
|
689
|
+
return import("./viewports-cli-SOOHAD5D.js").then((m) => m.runViewports(rest, io));
|
|
690
690
|
}
|
|
691
691
|
if (command === "snapshot" || command === "audit") {
|
|
692
|
-
return import("./cli-
|
|
692
|
+
return import("./cli-CE7ENNNG.js").then((m) => m.runAudit(command, rest, io));
|
|
693
693
|
}
|
|
694
694
|
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
695
695
|
io.out(HELP);
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
levenshtein,
|
|
11
11
|
normaliseFamily,
|
|
12
12
|
parseColour
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-2CCL5CO7.js";
|
|
14
14
|
import {
|
|
15
15
|
TRADE_NOUNS
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-R4KPE4G5.js";
|
|
17
17
|
|
|
18
18
|
// src/direction/types.ts
|
|
19
19
|
var DIRECTION_VERSION = 2;
|
|
@@ -895,7 +895,7 @@ var COPY_TELLS = [
|
|
|
895
895
|
fixtures: {
|
|
896
896
|
flag: [
|
|
897
897
|
f("content/home.md", "Your options, in plain English."),
|
|
898
|
-
//
|
|
898
|
+
// A reviewer's draft lines, Pastel 986559 #12 and #13 (the diagnosis taken, the wording not).
|
|
899
899
|
f("content/clinics.md", "Tell us what's happening and we'll say plainly what we would take on."),
|
|
900
900
|
f("content/pricing.md", "DD's payment terms, plainly stated."),
|
|
901
901
|
f("content/clinics.md", "We explain our findings in plain terms."),
|
|
@@ -1021,7 +1021,7 @@ var COPY_TELLS = [
|
|
|
1021
1021
|
fixtures: {
|
|
1022
1022
|
flag: [
|
|
1023
1023
|
// From the portal's seeded prospect follow-ups, 2026-10-19.
|
|
1024
|
-
f("emails/followup.md", "Alright Dave, it's
|
|
1024
|
+
f("emails/followup.md", "Alright Dave, it's Sam. No pressure, have a look when you get a min."),
|
|
1025
1025
|
f("emails/followup.md", "All good if you're not fussed mate, I'll leave it there."),
|
|
1026
1026
|
f("emails/followup.md", "Carlo, built the shop a proper site."),
|
|
1027
1027
|
f("content/contact.md", "No worries, we'll get you sorted."),
|
|
@@ -1034,11 +1034,11 @@ var COPY_TELLS = [
|
|
|
1034
1034
|
f("content/home.md", "Proper planning saves a second visit."),
|
|
1035
1035
|
f("content/certificates.md", "Download a sorted list of certificates, sorted by date."),
|
|
1036
1036
|
f("content/directions.md", "At the junction, take the right then left turn."),
|
|
1037
|
-
//
|
|
1037
|
+
// A barber client's own approved line, and "mate" as a noun.
|
|
1038
1038
|
f("content/home.md", "Every cut starts with a proper chat about what you actually want."),
|
|
1039
1039
|
f("content/home.md", "It feels like getting a cut from a mate who knows what he is doing."),
|
|
1040
1040
|
f("emails/quote.md", "Have a look at the quote and ring me if Thursday does not work."),
|
|
1041
|
-
f("content/contact.md", "Give us a ring on
|
|
1041
|
+
f("content/contact.md", "Give us a ring on 01632 960123. We take a look at the fault before quoting."),
|
|
1042
1042
|
f("content/home.md", "Built to last, and made for older houses.")
|
|
1043
1043
|
]
|
|
1044
1044
|
}
|
|
@@ -1050,14 +1050,14 @@ var COPY_TELLS = [
|
|
|
1050
1050
|
severity: "warn",
|
|
1051
1051
|
surface: "copy",
|
|
1052
1052
|
why: "'What this is and is not', 'we have not yet built', 'our experience so far is one practice', 'what we would and wouldn't take on': a model scopes a business by confessing its limits. It reads as small print, and it turns a buyer away before they make contact.",
|
|
1053
|
-
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for
|
|
1053
|
+
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for a children's therapy practice whose clinicians work across several sites.' Keep contractual facts (eligibility, who runs what) and say them as what the buyer gets.",
|
|
1054
1054
|
detect: phrases(CONFESSION, quoted),
|
|
1055
1055
|
fixtures: {
|
|
1056
1056
|
flag: [
|
|
1057
|
-
// Each one from the
|
|
1057
|
+
// Each one from the studio's own site, as a reviewer flagged it (Pastel 986559 #8, #12, #13).
|
|
1058
1058
|
f("content/clinics.md", "What this is and is not: a practice portal we built and run for one practice."),
|
|
1059
1059
|
f("content/clinics.md", "We have not yet built and run the digital systems of a practice with several clinicians."),
|
|
1060
|
-
f("content/home.md", "Including the client portal we run for
|
|
1060
|
+
f("content/home.md", "Including the client portal we run for a therapy practice. Our clinic experience so far is one practice."),
|
|
1061
1061
|
f("content/clinics.md", "Tell us what's happening and we'll say what we would and wouldn't take on."),
|
|
1062
1062
|
f("content/clinics.md", "We will say what carries over from this work and what we would need to learn first."),
|
|
1063
1063
|
f("content/clinics.md", "We will tell you where our experience applies directly and where it is close."),
|
|
@@ -1066,8 +1066,8 @@ var COPY_TELLS = [
|
|
|
1066
1066
|
f("content/mobile.md", "Mobile is our newest line, so we tell you what we have and haven't done.")
|
|
1067
1067
|
],
|
|
1068
1068
|
pass: [
|
|
1069
|
-
f("content/clinics.md", "Built and run by us for
|
|
1070
|
-
f("content/home.md", "The client portal we run for
|
|
1069
|
+
f("content/clinics.md", "Built and run by us for a therapy practice, a growing one whose clinicians work remotely."),
|
|
1070
|
+
f("content/home.md", "The client portal we run for a children's therapy practice."),
|
|
1071
1071
|
// Contractual facts, said as they are.
|
|
1072
1072
|
f("content/pricing.md", "Pay monthly is open to UK residents aged 18 and over, subject to status."),
|
|
1073
1073
|
f("content/pricing.md", "Your monthly payments do not buy the site; the buy-out price does."),
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
expandNullTargets,
|
|
6
6
|
loadNull
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-GJZ4Y5PT.js";
|
|
8
8
|
import "./chunk-OQXTQQAU.js";
|
|
9
9
|
import {
|
|
10
10
|
parseFlags
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OOT4QLO3.js";
|
|
12
12
|
import {
|
|
13
13
|
toJson
|
|
14
14
|
} from "./chunk-QIEDBL4J.js";
|
|
@@ -21,8 +21,8 @@ import {
|
|
|
21
21
|
fingerprint,
|
|
22
22
|
scanSource,
|
|
23
23
|
typicality
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-2CCL5CO7.js";
|
|
25
|
+
import "./chunk-R4KPE4G5.js";
|
|
26
26
|
import {
|
|
27
27
|
SNAPSHOT_VERSION
|
|
28
28
|
} from "./chunk-QYBAVU3P.js";
|
|
@@ -188,7 +188,7 @@ async function runCalibrate(args, io) {
|
|
|
188
188
|
if (toTake.length) {
|
|
189
189
|
io.err(`craft calibrate: taking ${toTake.length} snapshot${toTake.length === 1 ? "" : "s"}`);
|
|
190
190
|
try {
|
|
191
|
-
const { snapshotUrls } = await import("./audit-
|
|
191
|
+
const { snapshotUrls } = await import("./audit-Q73WGKMS.js");
|
|
192
192
|
const results = await snapshotUrls(toTake.map((t) => t.url));
|
|
193
193
|
results.forEach((r, i) => {
|
|
194
194
|
const { entry, keep } = toTake[i];
|
|
@@ -4,16 +4,16 @@ import {
|
|
|
4
4
|
merge,
|
|
5
5
|
resolvePages,
|
|
6
6
|
runAudit
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-4HPAMB52.js";
|
|
8
|
+
import "./chunk-OA2MBUJJ.js";
|
|
9
9
|
import "./chunk-JYNXGCYZ.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-GJZ4Y5PT.js";
|
|
11
11
|
import "./chunk-OQXTQQAU.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-OOT4QLO3.js";
|
|
13
13
|
import "./chunk-QIEDBL4J.js";
|
|
14
14
|
import "./chunk-WUACK2HX.js";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-2CCL5CO7.js";
|
|
16
|
+
import "./chunk-R4KPE4G5.js";
|
|
17
17
|
import "./chunk-QYBAVU3P.js";
|
|
18
18
|
export {
|
|
19
19
|
describeComponents,
|
|
@@ -16,12 +16,12 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
SOURCE_FILE,
|
|
18
18
|
readPaths
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OOT4QLO3.js";
|
|
20
20
|
import {
|
|
21
21
|
toJson
|
|
22
22
|
} from "./chunk-QIEDBL4J.js";
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-2CCL5CO7.js";
|
|
24
|
+
import "./chunk-R4KPE4G5.js";
|
|
25
25
|
import "./chunk-QYBAVU3P.js";
|
|
26
26
|
|
|
27
27
|
// src/phone/cli.ts
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
runHarvest,
|
|
10
10
|
runNull,
|
|
11
11
|
serveDir
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GJZ4Y5PT.js";
|
|
13
13
|
import "./chunk-OQXTQQAU.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-OOT4QLO3.js";
|
|
15
15
|
import "./chunk-QIEDBL4J.js";
|
|
16
16
|
import "./chunk-WUACK2HX.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-2CCL5CO7.js";
|
|
18
|
+
import "./chunk-R4KPE4G5.js";
|
|
19
19
|
import "./chunk-QYBAVU3P.js";
|
|
20
20
|
export {
|
|
21
21
|
describeTypicality,
|
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
formatPairs,
|
|
5
5
|
loadEstate,
|
|
6
6
|
runEstate
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-6TOY3FAT.js";
|
|
8
|
+
import "./chunk-PXJKYMXF.js";
|
|
9
|
+
import "./chunk-GJZ4Y5PT.js";
|
|
10
10
|
import "./chunk-OQXTQQAU.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-OOT4QLO3.js";
|
|
12
12
|
import "./chunk-QIEDBL4J.js";
|
|
13
13
|
import "./chunk-WUACK2HX.js";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-2CCL5CO7.js";
|
|
15
|
+
import "./chunk-R4KPE4G5.js";
|
|
16
16
|
import "./chunk-QYBAVU3P.js";
|
|
17
17
|
export {
|
|
18
18
|
formatComponentPairs,
|
|
@@ -19,10 +19,10 @@ import {
|
|
|
19
19
|
checkReason,
|
|
20
20
|
researchPrompt,
|
|
21
21
|
validateDirection
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-PXJKYMXF.js";
|
|
23
23
|
import {
|
|
24
24
|
parseFlags
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-OOT4QLO3.js";
|
|
26
26
|
import {
|
|
27
27
|
toJson
|
|
28
28
|
} from "./chunk-QIEDBL4J.js";
|
|
@@ -38,8 +38,8 @@ import {
|
|
|
38
38
|
isCream,
|
|
39
39
|
oklchToRgb,
|
|
40
40
|
parseColour
|
|
41
|
-
} from "./chunk-
|
|
42
|
-
import "./chunk-
|
|
41
|
+
} from "./chunk-2CCL5CO7.js";
|
|
42
|
+
import "./chunk-R4KPE4G5.js";
|
|
43
43
|
import "./chunk-QYBAVU3P.js";
|
|
44
44
|
|
|
45
45
|
// src/direction/cli.ts
|
|
@@ -484,7 +484,7 @@ var readJson = (path) => JSON.parse(readFileSync(path, "utf8"));
|
|
|
484
484
|
async function snapshotFrom(target, cwd) {
|
|
485
485
|
if (!target) return void 0;
|
|
486
486
|
if (/^https?:\/\//.test(target)) {
|
|
487
|
-
const { snapshotUrl } = await import("./audit-
|
|
487
|
+
const { snapshotUrl } = await import("./audit-Q73WGKMS.js");
|
|
488
488
|
return snapshotUrl(target);
|
|
489
489
|
}
|
|
490
490
|
return readSnapshot(readJson(resolve(cwd, target)), target);
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
STOCK_PHRASES,
|
|
10
10
|
countWords,
|
|
11
11
|
specificity
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-R4KPE4G5.js";
|
|
13
13
|
|
|
14
14
|
// src/register/cli.ts
|
|
15
15
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -473,8 +473,7 @@ var REGISTERS = [
|
|
|
473
473
|
note: "No public style authority exists for premium-brand prose. These directives are house judgement, to be revised as the estate grows."
|
|
474
474
|
},
|
|
475
475
|
{
|
|
476
|
-
name: "Register separation, 2026-09-29",
|
|
477
|
-
url: "calibration/copy-shape/report-registers.md",
|
|
476
|
+
name: "Register separation, 2026-09-29 (report in the private craft corpus)",
|
|
478
477
|
note: "Literary prose (Gutenberg) carries about twice the comma density of the other human registers, the one feature that separated it from all four. Longer, jointed sentences are normal here."
|
|
479
478
|
}
|
|
480
479
|
]
|
|
@@ -3,21 +3,21 @@ import {
|
|
|
3
3
|
} from "./chunk-OKVHWXYV.js";
|
|
4
4
|
import {
|
|
5
5
|
merge
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-4HPAMB52.js";
|
|
7
|
+
import "./chunk-OA2MBUJJ.js";
|
|
8
8
|
import "./chunk-JYNXGCYZ.js";
|
|
9
9
|
import {
|
|
10
10
|
SIBLING_AT,
|
|
11
11
|
compareToEstate,
|
|
12
12
|
loadEstate
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6TOY3FAT.js";
|
|
14
14
|
import {
|
|
15
15
|
PAGE_TYPES,
|
|
16
16
|
validateDirection
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-PXJKYMXF.js";
|
|
18
18
|
import {
|
|
19
19
|
loadNull
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-GJZ4Y5PT.js";
|
|
21
21
|
import "./chunk-OQXTQQAU.js";
|
|
22
22
|
import {
|
|
23
23
|
COPY_FILE,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
loadExceptions,
|
|
29
29
|
parseFlags,
|
|
30
30
|
readPaths
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-OOT4QLO3.js";
|
|
32
32
|
import {
|
|
33
33
|
toJson
|
|
34
34
|
} from "./chunk-QIEDBL4J.js";
|
|
@@ -42,8 +42,8 @@ import {
|
|
|
42
42
|
fingerprint,
|
|
43
43
|
scanSource,
|
|
44
44
|
typicality
|
|
45
|
-
} from "./chunk-
|
|
46
|
-
import "./chunk-
|
|
45
|
+
} from "./chunk-2CCL5CO7.js";
|
|
46
|
+
import "./chunk-R4KPE4G5.js";
|
|
47
47
|
import "./chunk-QYBAVU3P.js";
|
|
48
48
|
|
|
49
49
|
// src/report/cli.ts
|
|
@@ -126,7 +126,7 @@ async function runReport(command, args, io) {
|
|
|
126
126
|
if (/\.json$/i.test(target2) && existsSync(local)) {
|
|
127
127
|
snap = readSnapshot(JSON.parse(readFileSync(local, "utf8")), target2);
|
|
128
128
|
} else {
|
|
129
|
-
const { snapshotUrl } = await import("./audit-
|
|
129
|
+
const { snapshotUrl } = await import("./audit-Q73WGKMS.js");
|
|
130
130
|
snap = await snapshotUrl(target2);
|
|
131
131
|
}
|
|
132
132
|
const fp = fingerprint(snap);
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
run
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OOT4QLO3.js";
|
|
5
5
|
import "./chunk-QIEDBL4J.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-2CCL5CO7.js";
|
|
7
|
+
import "./chunk-R4KPE4G5.js";
|
|
8
8
|
import "./chunk-QYBAVU3P.js";
|
|
9
9
|
|
|
10
10
|
// src/cli.ts
|
package/dist/index.cjs
CHANGED
|
@@ -2309,7 +2309,7 @@ var COPY_TELLS = [
|
|
|
2309
2309
|
fixtures: {
|
|
2310
2310
|
flag: [
|
|
2311
2311
|
f("content/home.md", "Your options, in plain English."),
|
|
2312
|
-
//
|
|
2312
|
+
// A reviewer's draft lines, Pastel 986559 #12 and #13 (the diagnosis taken, the wording not).
|
|
2313
2313
|
f("content/clinics.md", "Tell us what's happening and we'll say plainly what we would take on."),
|
|
2314
2314
|
f("content/pricing.md", "DD's payment terms, plainly stated."),
|
|
2315
2315
|
f("content/clinics.md", "We explain our findings in plain terms."),
|
|
@@ -2435,7 +2435,7 @@ var COPY_TELLS = [
|
|
|
2435
2435
|
fixtures: {
|
|
2436
2436
|
flag: [
|
|
2437
2437
|
// From the portal's seeded prospect follow-ups, 2026-10-19.
|
|
2438
|
-
f("emails/followup.md", "Alright Dave, it's
|
|
2438
|
+
f("emails/followup.md", "Alright Dave, it's Sam. No pressure, have a look when you get a min."),
|
|
2439
2439
|
f("emails/followup.md", "All good if you're not fussed mate, I'll leave it there."),
|
|
2440
2440
|
f("emails/followup.md", "Carlo, built the shop a proper site."),
|
|
2441
2441
|
f("content/contact.md", "No worries, we'll get you sorted."),
|
|
@@ -2448,11 +2448,11 @@ var COPY_TELLS = [
|
|
|
2448
2448
|
f("content/home.md", "Proper planning saves a second visit."),
|
|
2449
2449
|
f("content/certificates.md", "Download a sorted list of certificates, sorted by date."),
|
|
2450
2450
|
f("content/directions.md", "At the junction, take the right then left turn."),
|
|
2451
|
-
//
|
|
2451
|
+
// A barber client's own approved line, and "mate" as a noun.
|
|
2452
2452
|
f("content/home.md", "Every cut starts with a proper chat about what you actually want."),
|
|
2453
2453
|
f("content/home.md", "It feels like getting a cut from a mate who knows what he is doing."),
|
|
2454
2454
|
f("emails/quote.md", "Have a look at the quote and ring me if Thursday does not work."),
|
|
2455
|
-
f("content/contact.md", "Give us a ring on
|
|
2455
|
+
f("content/contact.md", "Give us a ring on 01632 960123. We take a look at the fault before quoting."),
|
|
2456
2456
|
f("content/home.md", "Built to last, and made for older houses.")
|
|
2457
2457
|
]
|
|
2458
2458
|
}
|
|
@@ -2464,14 +2464,14 @@ var COPY_TELLS = [
|
|
|
2464
2464
|
severity: "warn",
|
|
2465
2465
|
surface: "copy",
|
|
2466
2466
|
why: "'What this is and is not', 'we have not yet built', 'our experience so far is one practice', 'what we would and wouldn't take on': a model scopes a business by confessing its limits. It reads as small print, and it turns a buyer away before they make contact.",
|
|
2467
|
-
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for
|
|
2467
|
+
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for a children's therapy practice whose clinicians work across several sites.' Keep contractual facts (eligibility, who runs what) and say them as what the buyer gets.",
|
|
2468
2468
|
detect: phrases(CONFESSION, quoted),
|
|
2469
2469
|
fixtures: {
|
|
2470
2470
|
flag: [
|
|
2471
|
-
// Each one from the
|
|
2471
|
+
// Each one from the studio's own site, as a reviewer flagged it (Pastel 986559 #8, #12, #13).
|
|
2472
2472
|
f("content/clinics.md", "What this is and is not: a practice portal we built and run for one practice."),
|
|
2473
2473
|
f("content/clinics.md", "We have not yet built and run the digital systems of a practice with several clinicians."),
|
|
2474
|
-
f("content/home.md", "Including the client portal we run for
|
|
2474
|
+
f("content/home.md", "Including the client portal we run for a therapy practice. Our clinic experience so far is one practice."),
|
|
2475
2475
|
f("content/clinics.md", "Tell us what's happening and we'll say what we would and wouldn't take on."),
|
|
2476
2476
|
f("content/clinics.md", "We will say what carries over from this work and what we would need to learn first."),
|
|
2477
2477
|
f("content/clinics.md", "We will tell you where our experience applies directly and where it is close."),
|
|
@@ -2480,8 +2480,8 @@ var COPY_TELLS = [
|
|
|
2480
2480
|
f("content/mobile.md", "Mobile is our newest line, so we tell you what we have and haven't done.")
|
|
2481
2481
|
],
|
|
2482
2482
|
pass: [
|
|
2483
|
-
f("content/clinics.md", "Built and run by us for
|
|
2484
|
-
f("content/home.md", "The client portal we run for
|
|
2483
|
+
f("content/clinics.md", "Built and run by us for a therapy practice, a growing one whose clinicians work remotely."),
|
|
2484
|
+
f("content/home.md", "The client portal we run for a children's therapy practice."),
|
|
2485
2485
|
// Contractual facts, said as they are.
|
|
2486
2486
|
f("content/pricing.md", "Pay monthly is open to UK residents aged 18 and over, subject to status."),
|
|
2487
2487
|
f("content/pricing.md", "Your monthly payments do not buy the site; the buy-out price does."),
|
|
@@ -4271,7 +4271,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4271
4271
|
generation: 1,
|
|
4272
4272
|
severity: "warn",
|
|
4273
4273
|
surface: "source",
|
|
4274
|
-
why: "When every block fades up on scroll, the motion stops meaning anything and the page feels slow.
|
|
4274
|
+
why: "When every block fades up on scroll, the motion stops meaning anything and the page feels slow. One salon client's site had 70, the studio's own 40, a therapy practice's 27.",
|
|
4275
4275
|
fix: `Keep one gated signature moment per page (STANDARD section 7) and let the rest arrive still. The limit here is ${REVEAL_LIMIT} per scan.`,
|
|
4276
4276
|
detect: revealHits,
|
|
4277
4277
|
fixtures: {
|
|
@@ -4287,7 +4287,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4287
4287
|
generation: 1,
|
|
4288
4288
|
severity: "warn",
|
|
4289
4289
|
surface: "source",
|
|
4290
|
-
why: "rounded-full on every button, badge and tag is the framework's friendliest default.
|
|
4290
|
+
why: "rounded-full on every button, badge and tag is the framework's friendliest default. One salon client's site had 162, the studio's own 125. A shape used everywhere is not a shape language.",
|
|
4291
4291
|
fix: `Choose the shape language on purpose (and record it), then use the pill only where it means something. The limit here is ${PILL_LIMIT} per scan.`,
|
|
4292
4292
|
detect: pillHits,
|
|
4293
4293
|
fixtures: {
|
|
@@ -4302,7 +4302,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4302
4302
|
generation: 1,
|
|
4303
4303
|
severity: "warn",
|
|
4304
4304
|
surface: "source",
|
|
4305
|
-
why: "A generator exports the whole shadcn/ui kit whether the site uses it or not.
|
|
4305
|
+
why: "A generator exports the whole shadcn/ui kit whether the site uses it or not. One client's journal site ships a full set under its own book, vine and petal assets.",
|
|
4306
4306
|
fix: "Delete the primitives nothing imports. Restyle the ones that stay so they belong to this site.",
|
|
4307
4307
|
detect: shadcnHits,
|
|
4308
4308
|
fixtures: {
|
|
@@ -4360,7 +4360,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4360
4360
|
f3("components/Hero.tsx", `<span className="font-serif italic">reimagined</span>`),
|
|
4361
4361
|
f3("app/globals.css", `.hero h1 { font-style: italic; }`)
|
|
4362
4362
|
],
|
|
4363
|
-
pass: [f3("components/Hero.tsx", `<h1 className="font-display text-6xl">Nails in
|
|
4363
|
+
pass: [f3("components/Hero.tsx", `<h1 className="font-display text-6xl">Nails in Kettering</h1>
|
|
4364
4364
|
<p><em>Walk-ins</em> welcome.</p>`)]
|
|
4365
4365
|
}
|
|
4366
4366
|
},
|
|
@@ -4376,11 +4376,11 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4376
4376
|
fixtures: {
|
|
4377
4377
|
flag: [
|
|
4378
4378
|
f3("components/Hero.tsx", `<span className="inline-flex rounded-full border px-3 py-1 text-xs">Now booking</span>
|
|
4379
|
-
<h1>Nails in
|
|
4379
|
+
<h1>Nails in Kettering</h1>`),
|
|
4380
4380
|
f3("components/Hero.tsx", `<span className={cn("rounded-full px-3 text-xs", "bg-rose-500/10")}>New</span>
|
|
4381
4381
|
<h1>Nails</h1>`)
|
|
4382
4382
|
],
|
|
4383
|
-
pass: [f3("components/Hero.tsx", `<h1>Nails in
|
|
4383
|
+
pass: [f3("components/Hero.tsx", `<h1>Nails in Kettering</h1>
|
|
4384
4384
|
<span className="inline-flex rounded-full border px-3 py-1 text-xs">Tag</span>`)]
|
|
4385
4385
|
}
|
|
4386
4386
|
},
|
|
@@ -4395,7 +4395,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4395
4395
|
detect: heroCtaPairHits,
|
|
4396
4396
|
fixtures: {
|
|
4397
4397
|
flag: [
|
|
4398
|
-
//
|
|
4398
|
+
// A reviewer's #5 and #36 (Pastel 986559): the studio's own hero and process close.
|
|
4399
4399
|
f3(
|
|
4400
4400
|
"src/components/Hero.astro",
|
|
4401
4401
|
`<section class="hero">
|
|
@@ -4404,20 +4404,20 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4404
4404
|
<a href="/work" class="btn btn-ghost">See our work</a>
|
|
4405
4405
|
</section>`
|
|
4406
4406
|
),
|
|
4407
|
-
// The null build's hero, verbatim in shape (
|
|
4407
|
+
// The null build's hero, verbatim in shape (an electrician brief's null pages, in the private dd-craft-corpus).
|
|
4408
4408
|
f3(
|
|
4409
4409
|
"index.html",
|
|
4410
4410
|
`<nav><a class="btn" href="#contact">Quote</a></nav>
|
|
4411
4411
|
<section id="hero" class="hero">
|
|
4412
|
-
<h1>Electricians in
|
|
4412
|
+
<h1>Electricians in Reading</h1>
|
|
4413
4413
|
<a href="#contact" class="btn btn-primary">Book a Free Quote</a>
|
|
4414
|
-
<a href="tel:+
|
|
4414
|
+
<a href="tel:+441632960210" class="btn btn-outline">Call 01632 960 210</a>
|
|
4415
4415
|
</section>`
|
|
4416
4416
|
),
|
|
4417
4417
|
f3(
|
|
4418
4418
|
"app/page.tsx",
|
|
4419
4419
|
`<section className="relative py-24">
|
|
4420
|
-
<h1 className="text-5xl">Nails in
|
|
4420
|
+
<h1 className="text-5xl">Nails in Kettering</h1>
|
|
4421
4421
|
<div className="flex gap-4">
|
|
4422
4422
|
<Button asChild><a href="/book">Book now</a></Button>
|
|
4423
4423
|
<Button variant="outline">View treatments</Button>
|
|
@@ -4446,7 +4446,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4446
4446
|
</header>`
|
|
4447
4447
|
),
|
|
4448
4448
|
f3("app/page.tsx", `<section className="py-24">
|
|
4449
|
-
<h1 className="text-5xl">Nails in
|
|
4449
|
+
<h1 className="text-5xl">Nails in Kettering</h1>
|
|
4450
4450
|
<a className="rounded bg-ink px-5 py-3" href="/book">Book now</a>
|
|
4451
4451
|
</section>
|
|
4452
4452
|
<section><a className="rounded bg-ink px-5 py-3" href="/prices">Prices</a></section>`)
|
|
@@ -5694,7 +5694,7 @@ var HOUSE = {
|
|
|
5694
5694
|
"stock-email-line": { tier: "review", label: "stock email line, start with the reason for writing and end with the next step" },
|
|
5695
5695
|
// New 2026-10-19 (founder): review first, like every new tell, until estate hits are read.
|
|
5696
5696
|
"matey-register": { tier: "review", label: "matey register, write plain and complete British English" },
|
|
5697
|
-
// New 2026-10-20 (founder, from
|
|
5697
|
+
// New 2026-10-20 (founder, from a reviewer's notes): review first, like every new tell.
|
|
5698
5698
|
"confession-line": { tier: "review", label: "confession line, scope the work by saying precisely what is true" },
|
|
5699
5699
|
// New 2026-10-23 (a 92EL report passed the gate with three): review, because a
|
|
5700
5700
|
// genuine disclaimer has the same shape. The gerund pair joined not-just-but.
|
|
@@ -7729,8 +7729,7 @@ var REGISTERS = [
|
|
|
7729
7729
|
note: "No public style authority exists for premium-brand prose. These directives are house judgement, to be revised as the estate grows."
|
|
7730
7730
|
},
|
|
7731
7731
|
{
|
|
7732
|
-
name: "Register separation, 2026-09-29",
|
|
7733
|
-
url: "calibration/copy-shape/report-registers.md",
|
|
7732
|
+
name: "Register separation, 2026-09-29 (report in the private craft corpus)",
|
|
7734
7733
|
note: "Literary prose (Gutenberg) carries about twice the comma density of the other human registers, the one feature that separated it from all four. Longer, jointed sentences are normal here."
|
|
7735
7734
|
}
|
|
7736
7735
|
]
|
package/dist/index.d.cts
CHANGED
|
@@ -1780,7 +1780,7 @@ declare function registersDoc(): string;
|
|
|
1780
1780
|
* `craft register check`: where a draft sits against the human baselines.
|
|
1781
1781
|
*
|
|
1782
1782
|
* A single short passage cannot be placed: at blurb length the registers
|
|
1783
|
-
* overlap too much (
|
|
1783
|
+
* overlap too much (the register separation report in the private craft corpus). Averaged over
|
|
1784
1784
|
* five paragraphs, every register pair separates on several features. So the
|
|
1785
1785
|
* check reads documents only, measures each blurb-sized paragraph with the
|
|
1786
1786
|
* same functions the baselines used, averages them, and compares the average
|
|
@@ -2307,8 +2307,8 @@ interface Fingerprint {
|
|
|
2307
2307
|
}
|
|
2308
2308
|
declare function fingerprint(s: Snapshot): Fingerprint;
|
|
2309
2309
|
/**
|
|
2310
|
-
* Chroma at which a ground's tint is unmistakable.
|
|
2311
|
-
* and
|
|
2310
|
+
* Chroma at which a ground's tint is unmistakable. An electrician's cream sits at 0.010
|
|
2311
|
+
* and a plumber's stone at 0.007, both warm paper; the plumber's
|
|
2312
2312
|
* porcelain (#F1F3F4) at 0.003 is a cool hint. A page ground is the largest
|
|
2313
2313
|
* area on the page and the eye adapts to it, so a tint far below what reads
|
|
2314
2314
|
* as a difference between two buttons still reads as warm or cool paper.
|
|
@@ -2659,7 +2659,7 @@ type EvidenceKind = (typeof EVIDENCE_KINDS)[number];
|
|
|
2659
2659
|
declare const CHANGE_CLASSES: readonly ["confirmed-correction", "design-hypothesis", "optional-refinement", "no-change"];
|
|
2660
2660
|
type ChangeClass = (typeof CHANGE_CLASSES)[number];
|
|
2661
2661
|
/**
|
|
2662
|
-
* What was done with a note in a reviewer's own record (
|
|
2662
|
+
* What was done with a note in a reviewer's own record (kept in the private craft corpus).
|
|
2663
2663
|
* take-reworded: the diagnosis is taken and the suggested wording rewritten,
|
|
2664
2664
|
* because a reviewer's lines are copy-checked like anyone's. partly: the aim
|
|
2665
2665
|
* is taken by a smaller or different change. known: already tracked.
|
|
@@ -2902,15 +2902,15 @@ declare function formatDirectionMatches(label: string, matches: DirectionMatch[]
|
|
|
2902
2902
|
declare const ESTATE_VERSION = 1;
|
|
2903
2903
|
/**
|
|
2904
2904
|
* Median fingerprint distance between two null pages built from the same
|
|
2905
|
-
* brief, across seven briefs and 1,330 pairs (calibration/null, 2026-09-23).
|
|
2905
|
+
* brief, across seven briefs and 1,330 pairs (the private corpus's calibration/null, 2026-09-23).
|
|
2906
2906
|
*/
|
|
2907
2907
|
declare const SIBLING_AT = 0.31;
|
|
2908
2908
|
interface EstateSite {
|
|
2909
|
-
/** Short kebab-case id: "
|
|
2909
|
+
/** Short kebab-case id: "electrician", "barber-studio". */
|
|
2910
2910
|
id: string;
|
|
2911
2911
|
client: string;
|
|
2912
2912
|
url: string;
|
|
2913
|
-
/** Where the site's source lives, if known: "
|
|
2913
|
+
/** Where the site's source lives, if known: "client-org/site-repo". */
|
|
2914
2914
|
repo?: string;
|
|
2915
2915
|
/** Absent for a direction registered before the site is built. */
|
|
2916
2916
|
fingerprint?: Fingerprint;
|
|
@@ -3060,7 +3060,7 @@ declare function groundName(o: Oklch): string;
|
|
|
3060
3060
|
/**
|
|
3061
3061
|
* The ground as a person would name it, with its temperature: "cream",
|
|
3062
3062
|
* "cool grey", "warm white", "cool dark". Every light neutral page used to be
|
|
3063
|
-
* "grey", which put
|
|
3063
|
+
* "grey", which put an electrician's cream and a plumber's porcelain under one word.
|
|
3064
3064
|
*/
|
|
3065
3065
|
declare function groundLabel(o: Oklch): string;
|
|
3066
3066
|
declare function shapeName(roundness: number | null): string;
|
|
@@ -3278,7 +3278,7 @@ declare const REVIEW_PHRASES: readonly ["great question", "of course!", "absolut
|
|
|
3278
3278
|
*
|
|
3279
3279
|
* A reason has to be specific enough that whoever reads the file next (a
|
|
3280
3280
|
* person, Claude, a future tool) cannot drift back to the category default
|
|
3281
|
-
* while following it. "Freight Display, because
|
|
3281
|
+
* while following it. "Freight Display, because the salon's photography needs to be
|
|
3282
3282
|
* the hero and the type needs to recede" passes. "Freight Display" does not,
|
|
3283
3283
|
* and neither does "a familiar structure so visitors feel comfortable".
|
|
3284
3284
|
*
|