@domandigital/craft 0.22.1 → 0.23.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.
@@ -723,8 +723,35 @@ var NEGATION = [
723
723
  /\b(?:is|are|was|were)(?:n’t|n't)\b[^.;]{2,60},\s*(?:it|they|that|this)(?:’s|'s|’re|'re)\b/i,
724
724
  /\bless\s+about\b[^.;]{2,50}\bmore\s+about\b/i,
725
725
  // parallel participle, no repeated subject: "dispatched from here, not shipped in from Seoul"
726
- /\b\w{3,}ed\b[^,.;:]{0,40},\s*not\s+\w{3,}ed\b/i
726
+ /\b\w{3,}ed\b[^,.;:]{0,40},\s*not\s+\w{3,}ed\b/i,
727
+ // parallel gerund: "renting Microsoft's services, not running servers". The
728
+ // -thing pronouns and the -ing prepositions are not verbs.
729
+ /\b(?!(?:some|no|any|every)thing\b)\w{3,}ing\b[^,.;:]{0,40},\s*not\s+(?!(?:some|no|any|every)thing\b|(?:during|according|including|regarding|morning|evening)\b)\w{3,}ing\b/i
727
730
  ];
731
+ var SOFT_CONTRAST = [
732
+ // ", not registration." closing the sentence. Not when "not" negates what follows.
733
+ /,\s*not\s+(?!(?:yet|least|only|just|merely|simply|to|all|always|even|ever|necessarily|really|quite|exactly|enough|sure|that|because|so|much|many|once|often|every|including|counting|unlike|until|if|when|unless|though|although|or|and|but)\b)(?:(?:a|an|the|your|our|their|its|his|her|my|any)\s+)?[\w'’-]+(?:\s+[\w'’-]+){0,3}(?=\s*(?:[.!?)"”]|$))/im,
734
+ // "the league's own threshold, not a legal one"
735
+ /,\s*not\s+(?:a|an|the)\s+(?:[\w'’-]+\s+)?one\b/i,
736
+ // "renting computing over the internet instead of owning it"
737
+ /\b(?!(?:some|no|any|every)thing\b)\w{3,}ing\b[^.;:!?]{0,60}?\binstead\s+of\s+(?!(?:some|no|any|every)thing\b)\w{3,}ing\b/i
738
+ ];
739
+ var PAIR_TOKEN = String.raw`(?:[£$€]?\d[\d,.]*%?|[\w'’£$€-]+)`;
740
+ var PAIR_NUMBER = String.raw`(?:one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|\d[\d,]*)`;
741
+ var PARALLEL_PAIR = [
742
+ // anaphora: "same site, same £8,000", "per user, per month". "No X, no Y" is no-x-no-y's.
743
+ new RegExp(String.raw`\b(?!no\b)(\w+)[ \t]+${PAIR_TOKEN},[ \t]+\1[ \t]+${PAIR_TOKEN}(?=[ \t]*(?:[.!?]|$))`, "im"),
744
+ // isocolon on its own line: "One form, seven workflows"
745
+ new RegExp(String.raw`^[ \t]*(?:#{1,6}[ \t]+)?${PAIR_NUMBER}[ \t]+[\w'’-]+,[ \t]+${PAIR_NUMBER}[ \t]+[\w'’-]+[.!]?[ \t]*$`, "im"),
746
+ // a verbless list as a tagline: "Service account, match-day reminders, analytics."
747
+ /^[ \t]*(?:#{1,6}[ \t]+)?[A-Z][\w'’-]*(?:[ \t]+(?!(?:and|or)\b)[\w'’-]+){0,2}(?:,[ \t]+(?!(?:and|or)\b)[\w'’-]+(?:[ \t]+(?!(?:and|or)\b)[\w'’-]+){0,2}){2,3}\.[ \t]*$/m
748
+ ];
749
+ var alreadyBlocked = (block, match, index) => {
750
+ const before = block.text.slice(0, index);
751
+ const start = Math.max(before.search(/[^.!?\n]*$/), 0);
752
+ const sentence = block.text.slice(start, index + match.length);
753
+ return NEGATION.some((pattern) => pattern.test(sentence));
754
+ };
728
755
  var DATA_ABSENCE = /\b(?:yet|found|available|configured|selected|assigned|scheduled|recorded|on file|to show|to display|results|match|matches|matching|data|in this period)\b/i;
729
756
  var SIGNED_IN = /(?:^|\/)(?:admin|portal|dashboard|embedded)\//;
730
757
  function lineAround(text, index) {
@@ -1105,7 +1132,7 @@ var COPY_TELLS = [
1105
1132
  generation: 2,
1106
1133
  severity: "warn",
1107
1134
  surface: "copy",
1108
- why: "'It's not just a haircut, it's an experience', 'dispatched from here, not shipped in': the contrast-and-reveal template is the most recognisable construction in generated copy.",
1135
+ why: "'It's not just a haircut, it's an experience', 'dispatched from here, not shipped in': the contrast-and-reveal template (correctio, antithesis: see COPY.md) is the most recognisable construction in generated copy.",
1109
1136
  fix: "Say the positive claim and drop the contrast.",
1110
1137
  detect: phrases(NEGATION, quoted, allText),
1111
1138
  fixtures: {
@@ -1116,12 +1143,56 @@ var COPY_TELLS = [
1116
1143
  f("content/home.md", "Hairdressing isn't a job, it's art."),
1117
1144
  f("content/home.md", "It is less about the tools and more about the eye."),
1118
1145
  f("content/home.md", "Order today and it's dispatched from here, not shipped in from Seoul."),
1119
- f("app/offer.tsx", `export const outcome = "The whole path, not just the ads.";`)
1146
+ f("app/offer.tsx", `export const outcome = "The whole path, not just the ads.";`),
1147
+ // From a 92EL report that passed the gate, October 2026.
1148
+ f("content/report.md", "These are reported, not assumed to pass."),
1149
+ f("content/report.md", "The deletion is proposed, not automated."),
1150
+ f("content/report.md", "For 92EL, that means renting Microsoft's services, not running servers."),
1151
+ f("content/home.md", "Your team should spend time delivering services, not managing bookings.")
1120
1152
  ],
1121
1153
  pass: [
1122
1154
  f("content/home.md", "A haircut, a hot towel and a straight-razor finish."),
1123
1155
  f("content/home.md", "They are cosmetics, not medicines."),
1124
- f("content/home.md", "The box arrived red, not led astray by a dented corner.")
1156
+ f("content/home.md", "The box arrived red, not led astray by a dented corner."),
1157
+ f("content/home.md", "We fix boilers in the morning, not in the evening."),
1158
+ f("content/report.md", "Players never open the lists."),
1159
+ f("content/report.md", "It is not tested at national scale."),
1160
+ f("content/report.md", "Do not invent anything."),
1161
+ f("content/report.md", "Nothing is copied by hand."),
1162
+ f("content/report.md", "Results are checked by a person and not yet automated.")
1163
+ ]
1164
+ }
1165
+ },
1166
+ {
1167
+ id: "trailing-contrast",
1168
+ name: "Trailing contrast",
1169
+ generation: 2,
1170
+ severity: "warn",
1171
+ surface: "copy",
1172
+ why: "'Edge matters for game servers, not registration', 'the league's own threshold, not a legal one', 'renting computing instead of owning it': the contrast template (correctio, antithesis: see COPY.md) in its softer forms. A genuine disclaimer has the same shape, so a person decides.",
1173
+ fix: "Say the positive claim on its own: 'Edge matters for game servers.' Keep the contrast only where the reader would otherwise assume the other thing, such as a legal disclaimer.",
1174
+ detect: phrases(SOFT_CONTRAST, quoted, allText, alreadyBlocked),
1175
+ fixtures: {
1176
+ flag: [
1177
+ // From a 92EL report that passed the gate, October 2026.
1178
+ f("content/report.md", "Edge matters for game servers, not registration."),
1179
+ f("content/report.md", "Age 18 is the league's own threshold, not a legal one."),
1180
+ f("content/report.md", "Cloud computing means renting computing over the internet instead of owning it."),
1181
+ f("content/home.md", "Real Square data, not a vanity metric."),
1182
+ // Reported even straight after a sentence the blocking rule reports.
1183
+ f("content/report.md", "That means renting services, not running servers.\n\nEdge matters for game servers, not registration.")
1184
+ ],
1185
+ pass: [
1186
+ f("content/home.md", "Rewire, retile and replumb a bathroom in five days."),
1187
+ f("content/report.md", "Players never open the lists."),
1188
+ f("content/report.md", "It is not tested at national scale."),
1189
+ f("content/report.md", "Do not invent anything."),
1190
+ f("content/report.md", "Nothing is copied by hand."),
1191
+ f("content/report.md", "Results are checked by a person and not yet automated."),
1192
+ f("content/home.md", "Pay by card, not to mention Apple Pay."),
1193
+ f("content/home.md", "Card instead of cash is fine."),
1194
+ // The blocking rule reports this one; it is not reported twice.
1195
+ f("content/report.md", "The deletion is proposed, not automated.")
1125
1196
  ]
1126
1197
  }
1127
1198
  },
@@ -1171,7 +1242,7 @@ var COPY_TELLS = [
1171
1242
  generation: 2,
1172
1243
  severity: "warn",
1173
1244
  surface: "copy",
1174
- why: "Three fragments in a row ('Fast. Friendly. Local.' or 'No fuss. No jargon. Just results.') is the second wave's favourite rhythm.",
1245
+ why: "Three fragments in a row ('Fast. Friendly. Local.' or 'No fuss. No jargon. Just results.') (a tricolon in asyndeton: see COPY.md) is the second wave's favourite rhythm.",
1175
1246
  fix: "Write one sentence that says which of the three is true, and how you know.",
1176
1247
  // The fragments share one paragraph: "You don't. Again.", a blank line, then "It's frustrating." is two beats, not three.
1177
1248
  detect: phrases([/(?:\b[A-Z][\w'’-]*(?:[ \t]+[\w'’-]+){0,2}[.!](?:[ \t]+|[ \t]*\n(?![ \t]*\n)[ \t]*)){2}[A-Z][\w'’-]*(?:[ \t]+[\w'’-]+){0,2}[.!](?=\s|$)/], quoted),
@@ -1183,6 +1254,36 @@ var COPY_TELLS = [
1183
1254
  ]
1184
1255
  }
1185
1256
  },
1257
+ {
1258
+ id: "parallel-pair",
1259
+ name: "Verbless parallel pair",
1260
+ generation: 2,
1261
+ severity: "warn",
1262
+ surface: "copy",
1263
+ why: "'One form, seven workflows', 'Same site, same \xA38,000': two matched fragments with no verb (isocolon, often with anaphora or asyndeton: see COPY.md), the staccato triplet's two-part cousin. It sounds decided and says less than a sentence would.",
1264
+ fix: "Write the sentence the pair stands for: 'One form and seven workflows replace the spreadsheets.' A short label on a slide can stay if a person reads it and it earns its place.",
1265
+ detect: phrases(PARALLEL_PAIR, quoted),
1266
+ fixtures: {
1267
+ flag: [
1268
+ // From 92EL deliverables, October 2026.
1269
+ f("content/deck.md", "# One form, seven workflows"),
1270
+ f("content/deck.md", "One form, seven workflows."),
1271
+ f("content/deck.md", "Same site, same \xA38,000."),
1272
+ f("content/deck.md", "Pay per user, per month"),
1273
+ f("content/deck.md", "Service account, match-day reminders, analytics.")
1274
+ ],
1275
+ pass: [
1276
+ f("content/deck.md", "Forms, SharePoint, Outlook and Teams"),
1277
+ f("content/deck.md", "One form and seven workflows replace 92EL's spreadsheets and email chains."),
1278
+ f("content/deck.md", "PulseCloud Technologies, for 92EL senior management"),
1279
+ f("content/deck.md", "41 of 50 passed, 12 after a fix."),
1280
+ f("content/deck.md", "Pay monthly for each user"),
1281
+ f("content/home.md", "We fix boilers the same day, and we tell you the price before we start."),
1282
+ // The blocking no-x-no-y reports this one.
1283
+ f("content/home.md", "We reply within a day. No obligation, no spam.")
1284
+ ]
1285
+ }
1286
+ },
1186
1287
  {
1187
1288
  id: "where-x-meets-y",
1188
1289
  name: "'Where X meets Y'",
@@ -9,7 +9,7 @@ import {
9
9
  parseFile,
10
10
  sentencesOf,
11
11
  specificity
12
- } from "./chunk-NV6FKMID.js";
12
+ } from "./chunk-EHMEMSM2.js";
13
13
  import {
14
14
  SNAPSHOT_VERSION
15
15
  } from "./chunk-QYBAVU3P.js";
@@ -2568,6 +2568,11 @@ var HOUSE = {
2568
2568
  "matey-register": { tier: "review", label: "matey register, write plain and complete British English" },
2569
2569
  // New 2026-10-20 (founder, from Eunice Ordor's review): review first, like every new tell.
2570
2570
  "confession-line": { tier: "review", label: "confession line, scope the work by saying precisely what is true" },
2571
+ // New 2026-10-23 (a 92EL report passed the gate with three): review, because a
2572
+ // genuine disclaimer has the same shape. The gerund pair joined not-just-but.
2573
+ // New 2026-10-23 (founder, from 92EL deliverables): review, since a short slide label is often fine.
2574
+ "parallel-pair": { tier: "review", label: "verbless parallel pair, write the sentence it stands for" },
2575
+ "trailing-contrast": { tier: "review", label: "trailing contrast. Say the positive claim, unless it is a disclaimer the reader needs" },
2571
2576
  "ai-vocabulary": { tier: "review", label: "AI vocabulary" },
2572
2577
  "stock-phrase": { tier: "review", label: "stock phrase" },
2573
2578
  "hollow-imperative": { tier: "review", label: "hollow imperative" },
@@ -3190,7 +3195,7 @@ var IMAGERY_TELLS = [
3190
3195
  ];
3191
3196
 
3192
3197
  // src/character/check.ts
3193
- var CATALOGUE_VERSION = "2026.10.5";
3198
+ var CATALOGUE_VERSION = "2026.10.8";
3194
3199
  var CATALOGUE = [
3195
3200
  ...[...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map((t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t),
3196
3201
  ...SPECIFICITY_COPY_TELLS,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-OQXTQQAU.js";
4
4
  import {
5
5
  parseFlags
6
- } from "./chunk-WTR77PEM.js";
6
+ } from "./chunk-V3GJSISR.js";
7
7
  import {
8
8
  toJson
9
9
  } from "./chunk-QIEDBL4J.js";
@@ -22,10 +22,10 @@ import {
22
22
  hueSwatch,
23
23
  nullPrompt,
24
24
  scanSource
25
- } from "./chunk-MLYHSPF7.js";
25
+ } from "./chunk-GA3AJN67.js";
26
26
  import {
27
27
  extractStrings
28
- } from "./chunk-NV6FKMID.js";
28
+ } from "./chunk-EHMEMSM2.js";
29
29
 
30
30
  // src/null/cli.ts
31
31
  import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "fs";
@@ -120,7 +120,7 @@ async function build(flags, io) {
120
120
  const toShoot = ids.filter((id) => existsSync(join(pages, `${id}.html`)) && !existsSync(join(shots, `${id}.json`)));
121
121
  if (toShoot.length) {
122
122
  io.out(`craft null: snapshotting ${toShoot.length} page${toShoot.length === 1 ? "" : "s"}`);
123
- const { snapshotUrls } = await import("./audit-CDMZ6JHT.js");
123
+ const { snapshotUrls } = await import("./audit-DESBVHQJ.js");
124
124
  const results = await snapshotUrls(toShoot.map((id) => pathToFileURL(join(pages, `${id}.html`)).href));
125
125
  results.forEach((r, i) => {
126
126
  const id = toShoot[i];
@@ -241,7 +241,7 @@ async function importPages(flags, io) {
241
241
  const toShoot = pages.filter((p) => !existsSync(join(shots, `${p.id}.json`)));
242
242
  if (toShoot.length) {
243
243
  io.out(`craft null: snapshotting ${toShoot.length} page${toShoot.length === 1 ? "" : "s"} from ${flags.builder}`);
244
- const { snapshotUrls } = await import("./audit-CDMZ6JHT.js");
244
+ const { snapshotUrls } = await import("./audit-DESBVHQJ.js");
245
245
  const servers = /* @__PURE__ */ new Map();
246
246
  try {
247
247
  for (const p of toShoot) if (!servers.has(p.root)) servers.set(p.root, await serveDir(p.root));
@@ -4,13 +4,13 @@ import {
4
4
  formatDirectionMatches,
5
5
  summariseDirection,
6
6
  validateDirection
7
- } from "./chunk-IAU4ZAIU.js";
7
+ } from "./chunk-7DPB5G4G.js";
8
8
  import {
9
9
  loadNull
10
- } from "./chunk-KH56TEFK.js";
10
+ } from "./chunk-GDDBCHQR.js";
11
11
  import {
12
12
  parseFlags
13
- } from "./chunk-WTR77PEM.js";
13
+ } from "./chunk-V3GJSISR.js";
14
14
  import {
15
15
  toJson
16
16
  } from "./chunk-QIEDBL4J.js";
@@ -30,7 +30,7 @@ import {
30
30
  rhythmOf,
31
31
  shapeName,
32
32
  temperatureName
33
- } from "./chunk-MLYHSPF7.js";
33
+ } from "./chunk-GA3AJN67.js";
34
34
 
35
35
  // src/estate/cli.ts
36
36
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -133,7 +133,7 @@ async function snapshotOf(target, cwd) {
133
133
  return snap;
134
134
  }
135
135
  if (!/^https?:\/\//.test(target)) throw new Error(`${target} is neither a URL, a snapshot file, nor a site in the register`);
136
- const { snapshotUrl } = await import("./audit-CDMZ6JHT.js");
136
+ const { snapshotUrl } = await import("./audit-DESBVHQJ.js");
137
137
  return snapshotUrl(target);
138
138
  }
139
139
  var line = (distance, sibling, shared) => `${distance.toFixed(2)}${sibling ? " SIBLING" : ""}${shared.length ? ` shares ${shared.join(", ")}` : ""}`;
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  snapshotUrl,
3
3
  snapshotUrls
4
- } from "./chunk-D6TAYXOS.js";
4
+ } from "./chunk-ZV3FPQPM.js";
5
5
  import {
6
6
  describeTypicality,
7
7
  loadNull
8
- } from "./chunk-KH56TEFK.js";
8
+ } from "./chunk-GDDBCHQR.js";
9
9
  import {
10
10
  SOURCE_FILE,
11
11
  finish,
@@ -14,7 +14,7 @@ import {
14
14
  parseFlags,
15
15
  prepareReport,
16
16
  readPaths
17
- } from "./chunk-WTR77PEM.js";
17
+ } from "./chunk-V3GJSISR.js";
18
18
  import {
19
19
  toJson
20
20
  } from "./chunk-QIEDBL4J.js";
@@ -28,7 +28,7 @@ import {
28
28
  rhythmOf,
29
29
  scanSource,
30
30
  typicality
31
- } from "./chunk-MLYHSPF7.js";
31
+ } from "./chunk-GA3AJN67.js";
32
32
 
33
33
  // src/audit/cli.ts
34
34
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -10,7 +10,7 @@ import {
10
10
  holdHouseBlocks,
11
11
  houseRule,
12
12
  scanSource
13
- } from "./chunk-MLYHSPF7.js";
13
+ } from "./chunk-GA3AJN67.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-NV6FKMID.js";
24
+ } from "./chunk-EHMEMSM2.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-CDMZ6JHT.js");
625
+ const { snapshotUrl } = await import("./audit-DESBVHQJ.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-4PXDNTZX.js");
636
+ const { loadNull } = await import("./cli-36YQA6BP.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-IQ5U76AZ.js").then((m) => m.runDirection(rest, io));
662
+ return import("./cli-TP5ZMJOL.js").then((m) => m.runDirection(rest, io));
663
663
  }
664
664
  if (command === "report" || command === "retrofit") {
665
- return import("./cli-223CUNU3.js").then((m) => m.runReport(command, rest, io));
665
+ return import("./cli-7IBKMUMM.js").then((m) => m.runReport(command, rest, io));
666
666
  }
667
667
  if (command === "register") {
668
- return import("./cli-6SMNHOCJ.js").then((m) => m.runRegister(rest, io));
668
+ return import("./cli-YOSHHLIV.js").then((m) => m.runRegister(rest, io));
669
669
  }
670
670
  if (command === "estate") {
671
- return import("./cli-CQUORKMC.js").then((m) => m.runEstate(rest, io));
671
+ return import("./cli-RXXGSKD6.js").then((m) => m.runEstate(rest, io));
672
672
  }
673
673
  if (command === "null") {
674
- return import("./cli-4PXDNTZX.js").then((m) => m.runNull(rest, io));
674
+ return import("./cli-36YQA6BP.js").then((m) => m.runNull(rest, io));
675
675
  }
676
676
  if (command === "calibrate") {
677
- return import("./cli-7PPDBN6N.js").then((m) => m.runCalibrate(rest, io));
677
+ return import("./cli-FCFRPPHZ.js").then((m) => m.runCalibrate(rest, io));
678
678
  }
679
679
  if (command === "tells" && rest[0] === "harvest") {
680
- return import("./cli-4PXDNTZX.js").then((m) => m.runHarvest(rest, io)).catch((error) => {
680
+ return import("./cli-36YQA6BP.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-FKWJF4V4.js").then((m) => m.runPhoneFirst(rest, io));
686
+ return import("./cli-SOH4QMMW.js").then((m) => m.runPhoneFirst(rest, io));
687
687
  }
688
688
  if (command === "viewports") {
689
- return import("./viewports-cli-H6UIUMBC.js").then((m) => m.runViewports(rest, io));
689
+ return import("./viewports-cli-ET664I2Y.js").then((m) => m.runViewports(rest, io));
690
690
  }
691
691
  if (command === "snapshot" || command === "audit") {
692
- return import("./cli-3QV4FKM4.js").then((m) => m.runAudit(command, rest, io));
692
+ return import("./cli-3PFEOEQI.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);
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  auditSnapshot,
6
6
  fingerprint
7
- } from "./chunk-MLYHSPF7.js";
7
+ } from "./chunk-GA3AJN67.js";
8
8
  import {
9
9
  SNAPSHOT_VERSION
10
10
  } from "./chunk-QYBAVU3P.js";
@@ -9,13 +9,13 @@ import {
9
9
  runHarvest,
10
10
  runNull,
11
11
  serveDir
12
- } from "./chunk-KH56TEFK.js";
12
+ } from "./chunk-GDDBCHQR.js";
13
13
  import "./chunk-OQXTQQAU.js";
14
- import "./chunk-WTR77PEM.js";
14
+ import "./chunk-V3GJSISR.js";
15
15
  import "./chunk-QIEDBL4J.js";
16
16
  import "./chunk-WUACK2HX.js";
17
- import "./chunk-MLYHSPF7.js";
18
- import "./chunk-NV6FKMID.js";
17
+ import "./chunk-GA3AJN67.js";
18
+ import "./chunk-EHMEMSM2.js";
19
19
  import "./chunk-QYBAVU3P.js";
20
20
  export {
21
21
  describeTypicality,
@@ -4,16 +4,16 @@ import {
4
4
  merge,
5
5
  resolvePages,
6
6
  runAudit
7
- } from "./chunk-JT2NLOQI.js";
8
- import "./chunk-D6TAYXOS.js";
7
+ } from "./chunk-M5QSMIT6.js";
8
+ import "./chunk-ZV3FPQPM.js";
9
9
  import "./chunk-JYNXGCYZ.js";
10
- import "./chunk-KH56TEFK.js";
10
+ import "./chunk-GDDBCHQR.js";
11
11
  import "./chunk-OQXTQQAU.js";
12
- import "./chunk-WTR77PEM.js";
12
+ import "./chunk-V3GJSISR.js";
13
13
  import "./chunk-QIEDBL4J.js";
14
14
  import "./chunk-WUACK2HX.js";
15
- import "./chunk-MLYHSPF7.js";
16
- import "./chunk-NV6FKMID.js";
15
+ import "./chunk-GA3AJN67.js";
16
+ import "./chunk-EHMEMSM2.js";
17
17
  import "./chunk-QYBAVU3P.js";
18
18
  export {
19
19
  describeComponents,
@@ -3,21 +3,21 @@ import {
3
3
  } from "./chunk-OKVHWXYV.js";
4
4
  import {
5
5
  merge
6
- } from "./chunk-JT2NLOQI.js";
7
- import "./chunk-D6TAYXOS.js";
6
+ } from "./chunk-M5QSMIT6.js";
7
+ import "./chunk-ZV3FPQPM.js";
8
8
  import "./chunk-JYNXGCYZ.js";
9
9
  import {
10
10
  SIBLING_AT,
11
11
  compareToEstate,
12
12
  loadEstate
13
- } from "./chunk-ICEG4S56.js";
13
+ } from "./chunk-LRWKKJIW.js";
14
14
  import {
15
15
  PAGE_TYPES,
16
16
  validateDirection
17
- } from "./chunk-IAU4ZAIU.js";
17
+ } from "./chunk-7DPB5G4G.js";
18
18
  import {
19
19
  loadNull
20
- } from "./chunk-KH56TEFK.js";
20
+ } from "./chunk-GDDBCHQR.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-WTR77PEM.js";
31
+ } from "./chunk-V3GJSISR.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-MLYHSPF7.js";
46
- import "./chunk-NV6FKMID.js";
45
+ } from "./chunk-GA3AJN67.js";
46
+ import "./chunk-EHMEMSM2.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-CDMZ6JHT.js");
129
+ const { snapshotUrl } = await import("./audit-DESBVHQJ.js");
130
130
  snap = await snapshotUrl(target2);
131
131
  }
132
132
  const fp = fingerprint(snap);
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  expandNullTargets,
6
6
  loadNull
7
- } from "./chunk-KH56TEFK.js";
7
+ } from "./chunk-GDDBCHQR.js";
8
8
  import "./chunk-OQXTQQAU.js";
9
9
  import {
10
10
  parseFlags
11
- } from "./chunk-WTR77PEM.js";
11
+ } from "./chunk-V3GJSISR.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-MLYHSPF7.js";
25
- import "./chunk-NV6FKMID.js";
24
+ } from "./chunk-GA3AJN67.js";
25
+ import "./chunk-EHMEMSM2.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-CDMZ6JHT.js");
191
+ const { snapshotUrls } = await import("./audit-DESBVHQJ.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,15 +4,15 @@ import {
4
4
  formatPairs,
5
5
  loadEstate,
6
6
  runEstate
7
- } from "./chunk-ICEG4S56.js";
8
- import "./chunk-IAU4ZAIU.js";
9
- import "./chunk-KH56TEFK.js";
7
+ } from "./chunk-LRWKKJIW.js";
8
+ import "./chunk-7DPB5G4G.js";
9
+ import "./chunk-GDDBCHQR.js";
10
10
  import "./chunk-OQXTQQAU.js";
11
- import "./chunk-WTR77PEM.js";
11
+ import "./chunk-V3GJSISR.js";
12
12
  import "./chunk-QIEDBL4J.js";
13
13
  import "./chunk-WUACK2HX.js";
14
- import "./chunk-MLYHSPF7.js";
15
- import "./chunk-NV6FKMID.js";
14
+ import "./chunk-GA3AJN67.js";
15
+ import "./chunk-EHMEMSM2.js";
16
16
  import "./chunk-QYBAVU3P.js";
17
17
  export {
18
18
  formatComponentPairs,
@@ -16,12 +16,12 @@ import {
16
16
  import {
17
17
  SOURCE_FILE,
18
18
  readPaths
19
- } from "./chunk-WTR77PEM.js";
19
+ } from "./chunk-V3GJSISR.js";
20
20
  import {
21
21
  toJson
22
22
  } from "./chunk-QIEDBL4J.js";
23
- import "./chunk-MLYHSPF7.js";
24
- import "./chunk-NV6FKMID.js";
23
+ import "./chunk-GA3AJN67.js";
24
+ import "./chunk-EHMEMSM2.js";
25
25
  import "./chunk-QYBAVU3P.js";
26
26
 
27
27
  // src/phone/cli.ts
@@ -19,10 +19,10 @@ import {
19
19
  checkReason,
20
20
  researchPrompt,
21
21
  validateDirection
22
- } from "./chunk-IAU4ZAIU.js";
22
+ } from "./chunk-7DPB5G4G.js";
23
23
  import {
24
24
  parseFlags
25
- } from "./chunk-WTR77PEM.js";
25
+ } from "./chunk-V3GJSISR.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-MLYHSPF7.js";
42
- import "./chunk-NV6FKMID.js";
41
+ } from "./chunk-GA3AJN67.js";
42
+ import "./chunk-EHMEMSM2.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-CDMZ6JHT.js");
487
+ const { snapshotUrl } = await import("./audit-DESBVHQJ.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-NV6FKMID.js";
12
+ } from "./chunk-EHMEMSM2.js";
13
13
 
14
14
  // src/register/cli.ts
15
15
  import { existsSync, readFileSync } from "fs";
package/dist/cli.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  run
4
- } from "./chunk-WTR77PEM.js";
4
+ } from "./chunk-V3GJSISR.js";
5
5
  import "./chunk-QIEDBL4J.js";
6
- import "./chunk-MLYHSPF7.js";
7
- import "./chunk-NV6FKMID.js";
6
+ import "./chunk-GA3AJN67.js";
7
+ import "./chunk-EHMEMSM2.js";
8
8
  import "./chunk-QYBAVU3P.js";
9
9
 
10
10
  // src/cli.ts