@domandigital/craft 0.22.1 → 0.23.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.
@@ -10,7 +10,7 @@ import {
10
10
  holdHouseBlocks,
11
11
  houseRule,
12
12
  scanSource
13
- } from "./chunk-MLYHSPF7.js";
13
+ } from "./chunk-3LCBLDAO.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-KIBDFRHT.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-CRTC7JSF.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-HWGSNSDD.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-E2CFVIGZ.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-TPV2EIIN.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-YRRBBU27.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-X3RZE4GM.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-HWGSNSDD.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-ROVZDHVR.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-HWGSNSDD.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-RHU3MAZY.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-EAUVLHFJ.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-IYRJZWMN.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);
@@ -723,8 +723,33 @@ 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 sentence = block.text.slice(Math.max(0, index - 80), index + match.length);
751
+ return NEGATION.some((pattern) => pattern.test(sentence));
752
+ };
728
753
  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
754
  var SIGNED_IN = /(?:^|\/)(?:admin|portal|dashboard|embedded)\//;
730
755
  function lineAround(text, index) {
@@ -1105,7 +1130,7 @@ var COPY_TELLS = [
1105
1130
  generation: 2,
1106
1131
  severity: "warn",
1107
1132
  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.",
1133
+ 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
1134
  fix: "Say the positive claim and drop the contrast.",
1110
1135
  detect: phrases(NEGATION, quoted, allText),
1111
1136
  fixtures: {
@@ -1116,12 +1141,54 @@ var COPY_TELLS = [
1116
1141
  f("content/home.md", "Hairdressing isn't a job, it's art."),
1117
1142
  f("content/home.md", "It is less about the tools and more about the eye."),
1118
1143
  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.";`)
1144
+ f("app/offer.tsx", `export const outcome = "The whole path, not just the ads.";`),
1145
+ // From a 92EL report that passed the gate, October 2026.
1146
+ f("content/report.md", "These are reported, not assumed to pass."),
1147
+ f("content/report.md", "The deletion is proposed, not automated."),
1148
+ f("content/report.md", "For 92EL, that means renting Microsoft's services, not running servers."),
1149
+ f("content/home.md", "Your team should spend time delivering services, not managing bookings.")
1120
1150
  ],
1121
1151
  pass: [
1122
1152
  f("content/home.md", "A haircut, a hot towel and a straight-razor finish."),
1123
1153
  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.")
1154
+ f("content/home.md", "The box arrived red, not led astray by a dented corner."),
1155
+ f("content/home.md", "We fix boilers in the morning, not in the evening."),
1156
+ f("content/report.md", "Players never open the lists."),
1157
+ f("content/report.md", "It is not tested at national scale."),
1158
+ f("content/report.md", "Do not invent anything."),
1159
+ f("content/report.md", "Nothing is copied by hand."),
1160
+ f("content/report.md", "Results are checked by a person and not yet automated.")
1161
+ ]
1162
+ }
1163
+ },
1164
+ {
1165
+ id: "trailing-contrast",
1166
+ name: "Trailing contrast",
1167
+ generation: 2,
1168
+ severity: "warn",
1169
+ surface: "copy",
1170
+ 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.",
1171
+ 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.",
1172
+ detect: phrases(SOFT_CONTRAST, quoted, allText, alreadyBlocked),
1173
+ fixtures: {
1174
+ flag: [
1175
+ // From a 92EL report that passed the gate, October 2026.
1176
+ f("content/report.md", "Edge matters for game servers, not registration."),
1177
+ f("content/report.md", "Age 18 is the league's own threshold, not a legal one."),
1178
+ f("content/report.md", "Cloud computing means renting computing over the internet instead of owning it."),
1179
+ f("content/home.md", "Real Square data, not a vanity metric.")
1180
+ ],
1181
+ pass: [
1182
+ f("content/home.md", "Rewire, retile and replumb a bathroom in five days."),
1183
+ f("content/report.md", "Players never open the lists."),
1184
+ f("content/report.md", "It is not tested at national scale."),
1185
+ f("content/report.md", "Do not invent anything."),
1186
+ f("content/report.md", "Nothing is copied by hand."),
1187
+ f("content/report.md", "Results are checked by a person and not yet automated."),
1188
+ f("content/home.md", "Pay by card, not to mention Apple Pay."),
1189
+ f("content/home.md", "Card instead of cash is fine."),
1190
+ // The blocking rule reports this one; it is not reported twice.
1191
+ f("content/report.md", "The deletion is proposed, not automated.")
1125
1192
  ]
1126
1193
  }
1127
1194
  },
@@ -1171,7 +1238,7 @@ var COPY_TELLS = [
1171
1238
  generation: 2,
1172
1239
  severity: "warn",
1173
1240
  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.",
1241
+ 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
1242
  fix: "Write one sentence that says which of the three is true, and how you know.",
1176
1243
  // The fragments share one paragraph: "You don't. Again.", a blank line, then "It's frustrating." is two beats, not three.
1177
1244
  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 +1250,36 @@ var COPY_TELLS = [
1183
1250
  ]
1184
1251
  }
1185
1252
  },
1253
+ {
1254
+ id: "parallel-pair",
1255
+ name: "Verbless parallel pair",
1256
+ generation: 2,
1257
+ severity: "warn",
1258
+ surface: "copy",
1259
+ 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.",
1260
+ 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.",
1261
+ detect: phrases(PARALLEL_PAIR, quoted),
1262
+ fixtures: {
1263
+ flag: [
1264
+ // From 92EL deliverables, October 2026.
1265
+ f("content/deck.md", "# One form, seven workflows"),
1266
+ f("content/deck.md", "One form, seven workflows."),
1267
+ f("content/deck.md", "Same site, same \xA38,000."),
1268
+ f("content/deck.md", "Pay per user, per month"),
1269
+ f("content/deck.md", "Service account, match-day reminders, analytics.")
1270
+ ],
1271
+ pass: [
1272
+ f("content/deck.md", "Forms, SharePoint, Outlook and Teams"),
1273
+ f("content/deck.md", "One form and seven workflows replace 92EL's spreadsheets and email chains."),
1274
+ f("content/deck.md", "PulseCloud Technologies, for 92EL senior management"),
1275
+ f("content/deck.md", "41 of 50 passed, 12 after a fix."),
1276
+ f("content/deck.md", "Pay monthly for each user"),
1277
+ f("content/home.md", "We fix boilers the same day, and we tell you the price before we start."),
1278
+ // The blocking no-x-no-y reports this one.
1279
+ f("content/home.md", "We reply within a day. No obligation, no spam.")
1280
+ ]
1281
+ }
1282
+ },
1186
1283
  {
1187
1284
  id: "where-x-meets-y",
1188
1285
  name: "'Where X meets Y'",
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  snapshotUrl,
3
3
  snapshotUrls
4
- } from "./chunk-D6TAYXOS.js";
4
+ } from "./chunk-A7KUKNX6.js";
5
5
  import {
6
6
  describeTypicality,
7
7
  loadNull
8
- } from "./chunk-KH56TEFK.js";
8
+ } from "./chunk-3LHIKF5L.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-KGEJ2TGT.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-3LCBLDAO.js";
32
32
 
33
33
  // src/audit/cli.ts
34
34
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -4,13 +4,13 @@ import {
4
4
  formatDirectionMatches,
5
5
  summariseDirection,
6
6
  validateDirection
7
- } from "./chunk-IAU4ZAIU.js";
7
+ } from "./chunk-4NON4PVK.js";
8
8
  import {
9
9
  loadNull
10
- } from "./chunk-KH56TEFK.js";
10
+ } from "./chunk-3LHIKF5L.js";
11
11
  import {
12
12
  parseFlags
13
- } from "./chunk-WTR77PEM.js";
13
+ } from "./chunk-KGEJ2TGT.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-3LCBLDAO.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-CRTC7JSF.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(", ")}` : ""}`;
@@ -19,10 +19,10 @@ import {
19
19
  checkReason,
20
20
  researchPrompt,
21
21
  validateDirection
22
- } from "./chunk-IAU4ZAIU.js";
22
+ } from "./chunk-4NON4PVK.js";
23
23
  import {
24
24
  parseFlags
25
- } from "./chunk-WTR77PEM.js";
25
+ } from "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
42
+ import "./chunk-KIBDFRHT.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-CRTC7JSF.js");
488
488
  return snapshotUrl(target);
489
489
  }
490
490
  return readSnapshot(readJson(resolve(cwd, target)), target);
@@ -9,13 +9,13 @@ import {
9
9
  runHarvest,
10
10
  runNull,
11
11
  serveDir
12
- } from "./chunk-KH56TEFK.js";
12
+ } from "./chunk-3LHIKF5L.js";
13
13
  import "./chunk-OQXTQQAU.js";
14
- import "./chunk-WTR77PEM.js";
14
+ import "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
18
+ import "./chunk-KIBDFRHT.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-OTQQTXXK.js";
8
+ import "./chunk-A7KUKNX6.js";
9
9
  import "./chunk-JYNXGCYZ.js";
10
- import "./chunk-KH56TEFK.js";
10
+ import "./chunk-3LHIKF5L.js";
11
11
  import "./chunk-OQXTQQAU.js";
12
- import "./chunk-WTR77PEM.js";
12
+ import "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
16
+ import "./chunk-KIBDFRHT.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-WTR77PEM.js";
19
+ } from "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
24
+ import "./chunk-KIBDFRHT.js";
25
25
  import "./chunk-QYBAVU3P.js";
26
26
 
27
27
  // src/phone/cli.ts
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  expandNullTargets,
6
6
  loadNull
7
- } from "./chunk-KH56TEFK.js";
7
+ } from "./chunk-3LHIKF5L.js";
8
8
  import "./chunk-OQXTQQAU.js";
9
9
  import {
10
10
  parseFlags
11
- } from "./chunk-WTR77PEM.js";
11
+ } from "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
25
+ import "./chunk-KIBDFRHT.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-CRTC7JSF.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];
@@ -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-OTQQTXXK.js";
7
+ import "./chunk-A7KUKNX6.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-Y2LGYHJ5.js";
14
14
  import {
15
15
  PAGE_TYPES,
16
16
  validateDirection
17
- } from "./chunk-IAU4ZAIU.js";
17
+ } from "./chunk-4NON4PVK.js";
18
18
  import {
19
19
  loadNull
20
- } from "./chunk-KH56TEFK.js";
20
+ } from "./chunk-3LHIKF5L.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-KGEJ2TGT.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-3LCBLDAO.js";
46
+ import "./chunk-KIBDFRHT.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-CRTC7JSF.js");
130
130
  snap = await snapshotUrl(target2);
131
131
  }
132
132
  const fp = fingerprint(snap);
@@ -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-Y2LGYHJ5.js";
8
+ import "./chunk-4NON4PVK.js";
9
+ import "./chunk-3LHIKF5L.js";
10
10
  import "./chunk-OQXTQQAU.js";
11
- import "./chunk-WTR77PEM.js";
11
+ import "./chunk-KGEJ2TGT.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-3LCBLDAO.js";
15
+ import "./chunk-KIBDFRHT.js";
16
16
  import "./chunk-QYBAVU3P.js";
17
17
  export {
18
18
  formatComponentPairs,
@@ -9,7 +9,7 @@ import {
9
9
  STOCK_PHRASES,
10
10
  countWords,
11
11
  specificity
12
- } from "./chunk-NV6FKMID.js";
12
+ } from "./chunk-KIBDFRHT.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-KGEJ2TGT.js";
5
5
  import "./chunk-QIEDBL4J.js";
6
- import "./chunk-MLYHSPF7.js";
7
- import "./chunk-NV6FKMID.js";
6
+ import "./chunk-3LCBLDAO.js";
7
+ import "./chunk-KIBDFRHT.js";
8
8
  import "./chunk-QYBAVU3P.js";
9
9
 
10
10
  // src/cli.ts