@maycombhq/atticus 2.0.0-beta.12 → 2.0.0-beta.12.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.
Files changed (154) hide show
  1. package/dist/bin.js +2 -2
  2. package/dist/{chunk-NL6XQZSV.js → chunk-2DJUQ6CO.js} +8 -8
  3. package/dist/{chunk-MNCQ2GL7.js → chunk-2OWSG6BK.js} +3 -3
  4. package/dist/{chunk-PCCPXWJC.js → chunk-2QT6WVAK.js} +11 -11
  5. package/dist/{chunk-HP32HUWR.js → chunk-2RMWW6G3.js} +9 -9
  6. package/dist/{chunk-KUYA2E7M.js → chunk-36CTZGPH.js} +4 -4
  7. package/dist/{chunk-VP5H6DII.js → chunk-3PLE3ZQ5.js} +7 -7
  8. package/dist/{chunk-4G56W6H7.js → chunk-3W5R5J65.js} +5 -5
  9. package/dist/{chunk-EU7VTBAI.js → chunk-42L2WHP6.js} +2 -2
  10. package/dist/{chunk-5FFMJMVH.js → chunk-4GNKICU5.js} +8 -8
  11. package/dist/{chunk-SCBU46AJ.js → chunk-4JLB5ISS.js} +2 -2
  12. package/dist/{chunk-5GGGAI5C.js → chunk-5C24MOXU.js} +5 -5
  13. package/dist/{chunk-7AXMUE2U.js → chunk-5G5GD5HF.js} +4 -4
  14. package/dist/{chunk-ITJ7ST5E.js → chunk-5I5JDJ3R.js} +2 -2
  15. package/dist/{chunk-ZBQCLKTH.js → chunk-5IMZYLDW.js} +3 -3
  16. package/dist/{chunk-FBFSTYAB.js → chunk-5R2EWR47.js} +1 -1
  17. package/dist/{chunk-2ELFEKOO.js → chunk-65XZSK6S.js} +1 -1
  18. package/dist/{chunk-P76AW3PA.js → chunk-6AYUBYK6.js} +54 -5
  19. package/dist/{chunk-TVSNWIAM.js → chunk-6HSRGY4B.js} +1 -1
  20. package/dist/{chunk-BTOGAUWX.js → chunk-6IKYFARG.js} +15 -9
  21. package/dist/{chunk-YURIUFKF.js → chunk-6R2OM6Y3.js} +5 -5
  22. package/dist/{chunk-7TEQF64E.js → chunk-7C7PTJM2.js} +151 -31
  23. package/dist/{chunk-ENZWVTTN.js → chunk-7FPTI62T.js} +7 -7
  24. package/dist/{chunk-F6FGIYPT.js → chunk-7H5HYERS.js} +7 -7
  25. package/dist/{chunk-O5W4ECUY.js → chunk-7MASAGFE.js} +4 -4
  26. package/dist/{chunk-NWL7XEQ4.js → chunk-7UXSS23C.js} +8 -7
  27. package/dist/{chunk-MLAACAES.js → chunk-7VAMO66T.js} +343 -99
  28. package/dist/{chunk-FQ6IBYFC.js → chunk-7XWCTVJS.js} +1 -1
  29. package/dist/{chunk-LDUJ6NIT.js → chunk-AUSC47BK.js} +1 -1
  30. package/dist/{chunk-KNGESBFW.js → chunk-AY7Y3WPD.js} +10 -10
  31. package/dist/{chunk-CW5SEPUT.js → chunk-BFZSO2TP.js} +4 -4
  32. package/dist/{chunk-6S27MUQQ.js → chunk-BHHIHENP.js} +1 -1
  33. package/dist/{chunk-6FG7QKJC.js → chunk-BUD6JILH.js} +9 -9
  34. package/dist/{chunk-V3VCUSQ6.js → chunk-CCXEXCRO.js} +4 -4
  35. package/dist/{chunk-ZS47PQ3O.js → chunk-CGF4LKXR.js} +1 -1
  36. package/dist/{chunk-BSVTNNUK.js → chunk-CJ5FQHST.js} +4 -4
  37. package/dist/{chunk-NWXY3B4R.js → chunk-CKI4VG2I.js} +8 -8
  38. package/dist/{chunk-F5GA6G3U.js → chunk-CU35HXQ7.js} +11 -11
  39. package/dist/{chunk-PVW2N63M.js → chunk-CUD4I2U6.js} +17 -17
  40. package/dist/{chunk-GN5ZLSLD.js → chunk-CUX4GRTB.js} +2 -2
  41. package/dist/{chunk-GKPOCUQR.js → chunk-CYDJK34J.js} +1 -1
  42. package/dist/{chunk-SHAAGH3T.js → chunk-DBVU45FY.js} +4 -4
  43. package/dist/{chunk-22GLUHGE.js → chunk-DBZNQAMN.js} +1 -1
  44. package/dist/{chunk-RZWZO2JQ.js → chunk-DDOLWHIM.js} +8 -7
  45. package/dist/{chunk-HJUEQERG.js → chunk-DIAYQLEY.js} +4 -4
  46. package/dist/{chunk-Q55UP5EZ.js → chunk-DKGWE5ZL.js} +9 -9
  47. package/dist/{chunk-QJ3OX7OC.js → chunk-DLX2R3MI.js} +18 -18
  48. package/dist/{chunk-XVIVWG7B.js → chunk-DREIS5Z5.js} +1 -1
  49. package/dist/{chunk-QAFMLBPF.js → chunk-DX5H5YKM.js} +2 -2
  50. package/dist/{chunk-MNUZX67F.js → chunk-EOCZDNWU.js} +2 -2
  51. package/dist/{chunk-TV4CGNEY.js → chunk-EOWO4YPF.js} +10 -10
  52. package/dist/{chunk-Z4JSRKNR.js → chunk-EZ3FDHW3.js} +11 -11
  53. package/dist/{chunk-4BPROPGG.js → chunk-F5L23NGR.js} +12 -12
  54. package/dist/{chunk-WE5VMPUP.js → chunk-FF5Q7ONT.js} +90 -80
  55. package/dist/{chunk-NSJ6ZR2A.js → chunk-FLROTO6F.js} +2 -2
  56. package/dist/{chunk-VF4VOPMB.js → chunk-FNVY656P.js} +9 -9
  57. package/dist/{chunk-BXP2Q4TD.js → chunk-FP6GJJY7.js} +10 -10
  58. package/dist/{chunk-GFZ5MIQG.js → chunk-FSR7OUVJ.js} +9 -9
  59. package/dist/{chunk-JXXQHETS.js → chunk-FT3RXIN4.js} +2 -2
  60. package/dist/{chunk-6JV3YHRR.js → chunk-FYWA2CPF.js} +5 -5
  61. package/dist/{chunk-CXK27ZUY.js → chunk-G2K2D6XS.js} +4 -4
  62. package/dist/{chunk-U5T4A2QV.js → chunk-G5SKNMPC.js} +1 -1
  63. package/dist/{chunk-TH526O6E.js → chunk-GIPQHVJF.js} +3 -3
  64. package/dist/{chunk-RMLUZYEA.js → chunk-GJ4B2FYS.js} +5 -5
  65. package/dist/{chunk-SAC6FNKR.js → chunk-GRZGEMO5.js} +76 -75
  66. package/dist/{chunk-6ENDKY52.js → chunk-GU7PEYRC.js} +2 -2
  67. package/dist/{chunk-SGNHNN3G.js → chunk-GX3Q5PRC.js} +3 -3
  68. package/dist/{chunk-TXV2AYZB.js → chunk-HK2CF6KQ.js} +10 -10
  69. package/dist/{chunk-ZYASEL7K.js → chunk-HMQXIFOL.js} +1 -1
  70. package/dist/{chunk-PKJ3K3GM.js → chunk-IDLO7UCZ.js} +4 -4
  71. package/dist/{chunk-SNSFQ47W.js → chunk-IJ7TPOXQ.js} +2 -2
  72. package/dist/{chunk-VLDM4QZM.js → chunk-IZF2VJU5.js} +9 -9
  73. package/dist/{chunk-GHSVJNVL.js → chunk-J22RSFKY.js} +4 -1
  74. package/dist/{chunk-JGLZUQVN.js → chunk-J3DTLYER.js} +5 -5
  75. package/dist/{chunk-ZBOPIYOY.js → chunk-JC3BMRB5.js} +3 -3
  76. package/dist/{chunk-ZGI7DNJ6.js → chunk-JOG6LBOP.js} +11 -11
  77. package/dist/{chunk-P6UJ22XR.js → chunk-JS3DJH3Q.js} +1 -1
  78. package/dist/{chunk-Z53ZB34U.js → chunk-JWQMD54C.js} +6 -6
  79. package/dist/{chunk-INCECZ2E.js → chunk-KJ6IH2D5.js} +1 -1
  80. package/dist/{chunk-GMDOXWIS.js → chunk-KPHPVOME.js} +1 -1
  81. package/dist/{chunk-RLJDYLID.js → chunk-LAOZB5YC.js} +7 -7
  82. package/dist/{chunk-RSVBX6A3.js → chunk-LRCWWMHH.js} +15 -15
  83. package/dist/{chunk-FMV6IZ3P.js → chunk-LVQMS54L.js} +18 -18
  84. package/dist/{chunk-DDZZXVQ5.js → chunk-M3BJTXLR.js} +4 -4
  85. package/dist/{chunk-TWHZU36X.js → chunk-M4D3VKAS.js} +1 -1
  86. package/dist/{chunk-5M3CLAOV.js → chunk-MI3GGF7V.js} +6 -6
  87. package/dist/{chunk-NCONDPHH.js → chunk-MIOY6EXD.js} +1 -1
  88. package/dist/{chunk-ZPT4QX3J.js → chunk-ML3HOWPI.js} +2 -2
  89. package/dist/{chunk-J3VAFDEX.js → chunk-MOY52LHS.js} +3 -3
  90. package/dist/{chunk-L4UIKAWD.js → chunk-N2FA53DA.js} +3 -3
  91. package/dist/{chunk-SK5OYWIY.js → chunk-N6YELFHL.js} +1 -1
  92. package/dist/{chunk-V5XV3JSP.js → chunk-N7HG4UP7.js} +3 -3
  93. package/dist/{chunk-4VOG5H2K.js → chunk-NAKVQU6F.js} +1 -1
  94. package/dist/{chunk-VRYQJZFL.js → chunk-NZY72PGJ.js} +8 -2
  95. package/dist/{chunk-36KD4OGC.js → chunk-O62VA6MH.js} +3 -3
  96. package/dist/{chunk-QEZSA2O7.js → chunk-OKUYBXXI.js} +5 -5
  97. package/dist/{chunk-E73QLYK7.js → chunk-P3VBYYAS.js} +1 -1
  98. package/dist/{chunk-5OACMWWI.js → chunk-P7SONIEO.js} +50 -27
  99. package/dist/{chunk-2VQLFNBO.js → chunk-PAOIMLTK.js} +7 -7
  100. package/dist/{chunk-3CFBU2O6.js → chunk-PAQDPB6T.js} +2 -2
  101. package/dist/{chunk-4Q2PGM5T.js → chunk-PKCYRG6G.js} +51 -11
  102. package/dist/{chunk-AYVLEB55.js → chunk-PUGPT4Y6.js} +6 -6
  103. package/dist/{chunk-DGZXJO5I.js → chunk-PVMGHQWB.js} +3 -3
  104. package/dist/{chunk-VXSJKWB7.js → chunk-Q4AWUD6C.js} +12 -12
  105. package/dist/{chunk-U4NNG3ES.js → chunk-QC24Z5JU.js} +2 -2
  106. package/dist/{chunk-SSL6JMPA.js → chunk-QKSWQBWD.js} +3 -3
  107. package/dist/{chunk-QY7RGTUP.js → chunk-QOF7U6BI.js} +49 -12
  108. package/dist/{chunk-4HIQ2FTI.js → chunk-QOPX5M7Y.js} +1 -1
  109. package/dist/{chunk-Y3ZKT6IF.js → chunk-RMNYY5IE.js} +3 -3
  110. package/dist/{chunk-5CSZTVXH.js → chunk-S3QCJWCF.js} +8 -8
  111. package/dist/{chunk-TLCRIAU3.js → chunk-S4USA5WC.js} +11 -11
  112. package/dist/{chunk-AEZ3EICK.js → chunk-S5X7BVWP.js} +6 -6
  113. package/dist/{chunk-DWYPYVPJ.js → chunk-SR2M7DWL.js} +3 -3
  114. package/dist/{chunk-2P6IHSRO.js → chunk-T4TMX54Q.js} +6 -6
  115. package/dist/{chunk-WIF7A6JU.js → chunk-T72K4PLH.js} +3 -3
  116. package/dist/{chunk-A5GY2EWH.js → chunk-TBKJPKDN.js} +3 -3
  117. package/dist/{chunk-WEG7DY5K.js → chunk-TIUBGJG3.js} +4 -4
  118. package/dist/{chunk-MQHYCS6A.js → chunk-TJHDFS33.js} +16 -14
  119. package/dist/{chunk-2Q2YBAR5.js → chunk-TJP2KLZI.js} +5 -4
  120. package/dist/{chunk-HKGQUOQ3.js → chunk-TV6ECMN3.js} +7 -7
  121. package/dist/{chunk-NHS55U7T.js → chunk-U2SGLXFR.js} +5 -5
  122. package/dist/{chunk-CWSZP2LU.js → chunk-U3JGJ3BO.js} +12 -12
  123. package/dist/{chunk-DPNCAFMB.js → chunk-U43G5EUN.js} +5 -5
  124. package/dist/{chunk-CJXM6SG4.js → chunk-UQUDITWL.js} +11 -11
  125. package/dist/{chunk-VS6FS472.js → chunk-UYKKTEWB.js} +4 -4
  126. package/dist/{chunk-DWN7RSNQ.js → chunk-VAL7HAIR.js} +1 -1
  127. package/dist/{chunk-Z47YGBUY.js → chunk-VC4JMXM5.js} +9 -8
  128. package/dist/{chunk-X64BFQ3R.js → chunk-VRH6ITQH.js} +3 -3
  129. package/dist/{chunk-FAET4BB6.js → chunk-VUBVBFJW.js} +4 -4
  130. package/dist/{chunk-UT5OA7KA.js → chunk-W3ZWS3B3.js} +2 -2
  131. package/dist/{chunk-NTTXTLCQ.js → chunk-WBOVB3XR.js} +11 -11
  132. package/dist/{chunk-B6X5PJSA.js → chunk-WFJMKUTR.js} +6 -6
  133. package/dist/{chunk-5H46QFSL.js → chunk-WRLEYM3T.js} +1 -1
  134. package/dist/{chunk-EJDZEK22.js → chunk-WSFPKNKT.js} +10 -10
  135. package/dist/{chunk-47HPZ34V.js → chunk-XB64FJLU.js} +11 -11
  136. package/dist/{chunk-HJ52XDST.js → chunk-XBNKOARP.js} +1 -1
  137. package/dist/chunk-XDTD55UU.js +89 -0
  138. package/dist/{chunk-3RP34PYV.js → chunk-XMYGEZQ7.js} +5 -5
  139. package/dist/{chunk-FSJMFPA3.js → chunk-XP3KLC4S.js} +2 -2
  140. package/dist/{chunk-BRCDEGNE.js → chunk-XRDYEEDE.js} +1 -1
  141. package/dist/{chunk-3ZKLWM5Y.js → chunk-XSNIHYO6.js} +2 -2
  142. package/dist/{chunk-76QVBNEM.js → chunk-XVQGT4SL.js} +7 -7
  143. package/dist/{chunk-GYS64N6F.js → chunk-XZLSKGJX.js} +2 -2
  144. package/dist/{chunk-GLSNVC67.js → chunk-Y2FMWQQB.js} +5 -5
  145. package/dist/{chunk-LTLR4JZJ.js → chunk-Y6LFFSRV.js} +5 -5
  146. package/dist/{chunk-MH7UBG47.js → chunk-YISWYR3Q.js} +3 -3
  147. package/dist/{chunk-7TH6I6TL.js → chunk-YSFIQGDK.js} +3 -3
  148. package/dist/{chunk-4RDW2X43.js → chunk-YVQWJDVN.js} +10 -10
  149. package/dist/{chunk-I2PNEG3M.js → chunk-ZDZCUZ4N.js} +3 -3
  150. package/dist/{chunk-BZRWJUB4.js → chunk-ZPPLFE4N.js} +4 -4
  151. package/dist/{chunk-XJRC3ZDI.js → chunk-ZRP6ZXOF.js} +3 -3
  152. package/dist/{chunk-FEBYMFZA.js → chunk-ZWGU46YO.js} +10 -10
  153. package/dist/files.json +371 -367
  154. package/package.json +4 -4
@@ -354,6 +354,29 @@ function parseReviewed(text) {
354
354
  }
355
355
  var isGlob = (path) => /[*?]/.test(path);
356
356
 
357
+ // packages/verify/dist/conventions.js
358
+ var SPEC_NAME = /(^|\/)[^/]*(openapi|swagger|asyncapi|api-docs)[^/]*\.(ya?ml|json|xml)$|\.oas\.(ya?ml|json)$/i;
359
+ function rulesOf(c) {
360
+ const folders = underFolders(c.apiSpecFolders, { tail: "(.+/)?[^/]+\\.(ya?ml|json)$" });
361
+ return {
362
+ apiSpec: new RegExp(`${SPEC_NAME.source}|${folders.source}`, "i"),
363
+ notProduct: underFolders(c.notProductFolders),
364
+ notRead: underFolders(c.notReadFolders),
365
+ gatewayBundle: gatewayBundleTest(c.gatewayBundleFolders),
366
+ frameworks: c.frameworks
367
+ };
368
+ }
369
+ var DEFAULT_READ_RULES = rulesOf(DEFAULT_CONVENTIONS);
370
+ var made = /* @__PURE__ */ new WeakMap();
371
+ function readRulesOf(c) {
372
+ if (!c || c === DEFAULT_CONVENTIONS)
373
+ return DEFAULT_READ_RULES;
374
+ let r = made.get(c);
375
+ if (!r)
376
+ made.set(c, r = rulesOf(c));
377
+ return r;
378
+ }
379
+
357
380
  // packages/verify/dist/apigee-policy.js
358
381
  var MAKES = {
359
382
  OAuthV1: ["oauth2"],
@@ -1334,29 +1357,6 @@ function derivedNamesAt(file, lines, line, env) {
1334
1357
  return out;
1335
1358
  }
1336
1359
 
1337
- // packages/verify/dist/conventions.js
1338
- var SPEC_NAME = /(^|\/)[^/]*(openapi|swagger|asyncapi|api-docs)[^/]*\.(ya?ml|json|xml)$|\.oas\.(ya?ml|json)$/i;
1339
- function rulesOf(c) {
1340
- const folders = underFolders(c.apiSpecFolders, { tail: "(.+/)?[^/]+\\.(ya?ml|json)$" });
1341
- return {
1342
- apiSpec: new RegExp(`${SPEC_NAME.source}|${folders.source}`, "i"),
1343
- notProduct: underFolders(c.notProductFolders),
1344
- notRead: underFolders(c.notReadFolders),
1345
- gatewayBundle: gatewayBundleTest(c.gatewayBundleFolders),
1346
- frameworks: c.frameworks
1347
- };
1348
- }
1349
- var DEFAULT_READ_RULES = rulesOf(DEFAULT_CONVENTIONS);
1350
- var made = /* @__PURE__ */ new WeakMap();
1351
- function readRulesOf(c) {
1352
- if (!c || c === DEFAULT_CONVENTIONS)
1353
- return DEFAULT_READ_RULES;
1354
- let r = made.get(c);
1355
- if (!r)
1356
- made.set(c, r = rulesOf(c));
1357
- return r;
1358
- }
1359
-
1360
1360
  // packages/verify/dist/not-product.js
1361
1361
  var LOCALE_BUNDLE = /(^|\/)(i18n|l10n|locales?|lang|langs|languages|translations?)\/(.+\/)?[^/]+\.(json|ya?ml|properties)$|(^|\/)res\/values[^/]*\/(strings|plurals|arrays)\.xml$/i;
1362
1362
  function isLocaleBundle(path) {
@@ -1418,6 +1418,142 @@ function pageRouteMatches(file, lines, exists, path) {
1418
1418
  return norm(route) === norm(path);
1419
1419
  }
1420
1420
 
1421
+ // packages/verify/dist/reachable.js
1422
+ var CODE = /\.(java|kt|kts|scala|groovy|cs|vb|fs|py|rb|go|rs|php|swift|ts|tsx|js|mjs|cjs|dart)$/i;
1423
+ var MODEL_DIR = /(^|\/)(models?|dtos?|payloads?|schemas?|pojos?|beans|viewmodels?)\//i;
1424
+ var MODEL_NAME = /(dto|request|response|payload|model|body)$/i;
1425
+ var MODEL_PART = /[._-](dto|model|schema|payload|request|response)\.[^/.]+$/i;
1426
+ var MAPS_TABLE = /@Entity\b|@Table\b|@Document\b|\[Table\(|__tablename__|models\.Model\b|@Entity\(|\bgorm\.Model\b/;
1427
+ var ROOT_PART = /[._-](controller|resolver|gateway|handlers?|router|routes?|consumer|listener|subscriber|client|publisher|producer|endpoints?)\.[^/.]+$/i;
1428
+ var CLIENT_NAME = /(client|gateway|publisher|producer|sender|feign|proxy|connector)$/i;
1429
+ var CLIENT_DIR = /(^|\/)(clients?|gateways?|integrations?|publishers?|producers?|outbound)\//i;
1430
+ var base = (path) => path.slice(path.lastIndexOf("/") + 1);
1431
+ var stem = (path) => {
1432
+ const b = base(path);
1433
+ const dot = b.indexOf(".");
1434
+ return dot > 0 ? b.slice(0, dot) : b;
1435
+ };
1436
+ function isModelFile(path, text) {
1437
+ if (!CODE.test(path) || readingRank(path) === 5)
1438
+ return false;
1439
+ if (!MODEL_DIR.test(path) && !MODEL_NAME.test(stem(path)) && !MODEL_PART.test(path))
1440
+ return false;
1441
+ return text === void 0 || !MAPS_TABLE.test(text);
1442
+ }
1443
+ var ENTRY_POINT_NAME = /(controller|resource|router|routes?|handlers?|listener|consumer|subscriber|endpoints?|servlet|webhook|resolver)$/i;
1444
+ var ENTRY_POINT_DIR = /(^|\/)(controllers?|routes|routers|handlers|endpoints|listeners|consumers)\//i;
1445
+ var ENTRY_POINT_PART = /[._-](controller|resolver|handlers?|router|routes?|consumer|listener|subscriber|endpoints?)\.[^/.]+$/i;
1446
+ function isEntryPointFile(path) {
1447
+ if (!CODE.test(path) || readingRank(path) === 5 || isModelFile(path))
1448
+ return false;
1449
+ return ENTRY_POINT_NAME.test(stem(path)) || ENTRY_POINT_DIR.test(path) || ENTRY_POINT_PART.test(path);
1450
+ }
1451
+ function isRootFile(path) {
1452
+ if (!CODE.test(path) || readingRank(path) === 5 || isModelFile(path))
1453
+ return false;
1454
+ return readingRank(path) === 2 || isEntryPointFile(path) || ROOT_PART.test(path) || CLIENT_NAME.test(stem(path)) || CLIENT_DIR.test(path);
1455
+ }
1456
+ var DECLARES = /\b(?:class|record|interface|struct|enum|object)\s+([A-Za-z_][A-Za-z0-9_]*)|^\s*(?:export\s+)?(?:declare\s+)?type\s+([A-Za-z_][A-Za-z0-9_]*)/gm;
1457
+ var IDENT = /[A-Za-z_][A-Za-z0-9_]*/g;
1458
+ function declaredTypes(path, text) {
1459
+ const out = [];
1460
+ const s = stem(path);
1461
+ if (/^[A-Z][A-Za-z0-9_]*$/.test(s))
1462
+ out.push(s);
1463
+ for (const m of text.matchAll(DECLARES)) {
1464
+ const n = m[1] ?? m[2];
1465
+ if (n && !out.includes(n))
1466
+ out.push(n);
1467
+ }
1468
+ return out;
1469
+ }
1470
+ function identifiers(text) {
1471
+ return [...new Set(text.match(IDENT) ?? [])];
1472
+ }
1473
+ var NOT_REACHED_WHY = "model classes no entry point, call or field fact reaches (ADR 0169): left out of the read; atticus map <repo> --models all reads them";
1474
+ function reachableModels(o) {
1475
+ const texts = /* @__PURE__ */ new Map();
1476
+ const textOf = (p) => {
1477
+ if (!texts.has(p))
1478
+ texts.set(p, o.read(p) ?? "");
1479
+ return texts.get(p);
1480
+ };
1481
+ const ordered = readingOrder(o.paths);
1482
+ const models = ordered.filter((p) => isModelFile(p, textOf(p))).sort();
1483
+ const isModel = new Set(models);
1484
+ const byName = /* @__PURE__ */ new Map();
1485
+ const declared = /* @__PURE__ */ new Map();
1486
+ for (const p of models) {
1487
+ const names = declaredTypes(p, textOf(p));
1488
+ declared.set(p, names);
1489
+ for (const n of names)
1490
+ byName.set(n, [...byName.get(n) ?? [], p]);
1491
+ }
1492
+ const known = new Set(o.paths);
1493
+ const roots = [];
1494
+ const addRoot = (p) => {
1495
+ if (known.has(p) && !isModel.has(p) && !roots.includes(p))
1496
+ roots.push(p);
1497
+ };
1498
+ const facts = o.facts ?? [];
1499
+ for (const f of facts)
1500
+ if (f.kind === "entry" || f.kind === "call")
1501
+ for (const p of citedFiles(f))
1502
+ addRoot(p);
1503
+ for (const p of ordered)
1504
+ if (isRootFile(p))
1505
+ addRoot(p);
1506
+ const reached = /* @__PURE__ */ new Map();
1507
+ const queue = [];
1508
+ const reach = (names, from, own = []) => {
1509
+ for (const n of names) {
1510
+ if (own.includes(n))
1511
+ continue;
1512
+ for (const p of byName.get(n) ?? []) {
1513
+ const r = reached.get(p);
1514
+ if (r) {
1515
+ if (r.from === from && !r.types.includes(n))
1516
+ r.types.push(n);
1517
+ continue;
1518
+ }
1519
+ reached.set(p, { path: p, types: [n], from });
1520
+ queue.push(p);
1521
+ }
1522
+ }
1523
+ };
1524
+ for (const p of roots)
1525
+ reach(identifiers(textOf(p)), p);
1526
+ for (const f of facts) {
1527
+ for (const p of citedFiles(f))
1528
+ if (isModel.has(p) && !reached.has(p)) {
1529
+ reached.set(p, { path: p, types: [...(declared.get(p) ?? []).slice(0, 1)], from: f.id });
1530
+ queue.push(p);
1531
+ }
1532
+ if (f.kind === "field")
1533
+ reach(identifiers([f.type ?? "", f.transform === "message type" ? f.name : ""].join(" ")), f.id);
1534
+ }
1535
+ const rooted = roots.length > 0 || reached.size > 0;
1536
+ if (!rooted)
1537
+ return {
1538
+ rooted,
1539
+ roots,
1540
+ reached: models.map((p) => ({ path: p, types: declared.get(p) ?? [], from: "" })),
1541
+ notReached: [],
1542
+ models: models.length
1543
+ };
1544
+ for (let i = 0; i < queue.length; i++) {
1545
+ const p = queue[i];
1546
+ reach(identifiers(textOf(p)), p, declared.get(p));
1547
+ }
1548
+ return {
1549
+ rooted,
1550
+ roots,
1551
+ reached: queue.map((p) => reached.get(p)),
1552
+ notReached: models.filter((p) => !reached.has(p)),
1553
+ models: models.length
1554
+ };
1555
+ }
1556
+
1421
1557
  // packages/verify/dist/method.js
1422
1558
  var HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]);
1423
1559
  function wordsOf(line) {
@@ -2199,23 +2335,23 @@ async function verifyFacts(o) {
2199
2335
  const accepted = facts.filter((f) => !rejected.has(f.id)).map((f) => {
2200
2336
  o.room?.();
2201
2337
  const verified = f.by === "person" && f.verified !== "none" ? f.verified : "line";
2202
- const base = { ...f, verified, cite: fixQuote(f.cite) };
2203
- if (base.kind === "entry" && base.auth !== void 0 && !base.authCite && f.by !== "person")
2338
+ const base2 = { ...f, verified, cite: fixQuote(f.cite) };
2339
+ if (base2.kind === "entry" && base2.auth !== void 0 && !base2.authCite && f.by !== "person")
2204
2340
  authUncited.push({
2205
- id: base.id,
2206
- auth: base.auth,
2207
- cite: `${base.cite.file}:${base.cite.line}`
2341
+ id: base2.id,
2342
+ auth: base2.auth,
2343
+ cite: `${base2.cite.file}:${base2.cite.line}`
2208
2344
  });
2209
- const unseen = methodUnseenOf(base, linesOf2, factById);
2345
+ const unseen = methodUnseenOf(base2, linesOf2, factById);
2210
2346
  if (unseen)
2211
2347
  methodUnseen.push(unseen);
2212
- if (base.kind === "flow")
2348
+ if (base2.kind === "flow")
2213
2349
  return {
2214
- ...base,
2215
- steps: base.steps.map((s) => ({ ...s, cite: fixQuote(s.cite) })),
2216
- errors: base.errors.map((e) => ({ ...e, cite: fixQuote(e.cite) }))
2350
+ ...base2,
2351
+ steps: base2.steps.map((s) => ({ ...s, cite: fixQuote(s.cite) })),
2352
+ errors: base2.errors.map((e) => ({ ...e, cite: fixQuote(e.cite) }))
2217
2353
  };
2218
- return base;
2354
+ return base2;
2219
2355
  });
2220
2356
  const excludeRes = (o.exclude ?? []).map(globToRegExp);
2221
2357
  const sources = [];
@@ -2284,6 +2420,11 @@ async function verifyFacts(o) {
2284
2420
  refuse("is not in the repo at this commit; name a file you read");
2285
2421
  continue;
2286
2422
  }
2423
+ const entryPoints = re ? matched.filter((p) => isSource.has(p) && !touched.has(p) && isEntryPointFile(p)) : [];
2424
+ if (entryPoints.length) {
2425
+ refuse(`covers ${entryPoints[0]}, an entry point (a controller, route, handler or listener)${entryPoints.length > 1 ? ` and ${entryPoints.length - 1} more` : ""} no fact cites: read it, and write its entries and the fields of the classes it takes and returns; never mark an entry point reviewed with a glob (name it alone if it truly holds nothing)`);
2426
+ continue;
2427
+ }
2287
2428
  const files = matched.filter((p) => isSource.has(p) && !touched.has(p)).sort();
2288
2429
  for (const p of files)
2289
2430
  reviewedSet.add(p);
@@ -2293,7 +2434,9 @@ async function verifyFacts(o) {
2293
2434
  }
2294
2435
  const read = sources.filter((p) => touched.has(p)).sort();
2295
2436
  const reviewedFiles = sources.filter((p) => reviewedSet.has(p)).sort();
2296
- const unknown = sources.filter((p) => !touched.has(p) && !reviewedSet.has(p)).sort();
2437
+ const leftOut = new Set(o.notReached ?? []);
2438
+ const notReached = sources.filter((p) => leftOut.has(p) && !touched.has(p) && !reviewedSet.has(p)).sort();
2439
+ const unknown = sources.filter((p) => !touched.has(p) && !reviewedSet.has(p) && !leftOut.has(p)).sort();
2297
2440
  const total = read.length + reviewedFiles.length + unknown.length;
2298
2441
  const ratio = total === 0 ? 1 : Math.round(read.length / total * 1e3) / 1e3;
2299
2442
  const ix = indexFacts(accepted);
@@ -2326,7 +2469,14 @@ async function verifyFacts(o) {
2326
2469
  accepted,
2327
2470
  // a rejected fact goes back as it was read, at its own commit, even one that was carried
2328
2471
  rejected: [...rejected.values()].map((r) => carriedFrom.has(r.fact.id) ? { ...r, fact: { ...r.fact, commit: carriedFrom.get(r.fact.id) } } : r).sort((a, b) => a.fact.id < b.fact.id ? -1 : a.fact.id > b.fact.id ? 1 : 0),
2329
- coverage: { read, reviewed: reviewedFiles, unknown, excluded: excluded.sort(), ratio },
2472
+ coverage: {
2473
+ read,
2474
+ reviewed: reviewedFiles,
2475
+ unknown,
2476
+ excluded: excluded.sort(),
2477
+ notReached,
2478
+ ratio
2479
+ },
2330
2480
  redacted,
2331
2481
  quotesDropped,
2332
2482
  carried: accepted.flatMap((f) => carriedFrom.has(f.id) ? [{ id: f.id, from: carriedFrom.get(f.id) }] : []),
@@ -2354,10 +2504,10 @@ var BOUNDARY_NAME = /(client|gateway|repository|repo|dao|mapper|entity|model|dto
2354
2504
  var BOUNDARY_FILE = /\.(sql|proto|graphql|gql|avsc|wsdl|xsd)$|(^|\/)(openapi|swagger)[^/]*\.(ya?ml|json)$/i;
2355
2505
  var BOUNDARY_DIR = /(^|\/)(clients?|gateways?|repositories|dao|models?|entities|dto|migrations?)\//i;
2356
2506
  var TEST = /(^|\/)(test|tests|__tests__|spec|specs|e2e|it)\/|[._-](test|spec)\.[^/.]+$|(Test|Tests|IT|Spec)\.[^/.]+$|(^|\/)test_[^/]+$|_test\.go$/;
2357
- var stem = (path) => {
2358
- const base = path.slice(path.lastIndexOf("/") + 1);
2359
- const dot = base.indexOf(".");
2360
- return dot > 0 ? base.slice(0, dot) : base;
2507
+ var stem2 = (path) => {
2508
+ const base2 = path.slice(path.lastIndexOf("/") + 1);
2509
+ const dot = base2.indexOf(".");
2510
+ return dot > 0 ? base2.slice(0, dot) : base2;
2361
2511
  };
2362
2512
  function readingRank(path) {
2363
2513
  if (TEST.test(path))
@@ -2366,7 +2516,7 @@ function readingRank(path) {
2366
2516
  return 0;
2367
2517
  if (CONFIG.test(path))
2368
2518
  return 1;
2369
- const s = stem(path);
2519
+ const s = stem2(path);
2370
2520
  if (ENTRY_NAME.test(s) || ENTRY_DIR.test(path))
2371
2521
  return 2;
2372
2522
  if (BOUNDARY_NAME.test(s) || BOUNDARY_FILE.test(path) || BOUNDARY_DIR.test(path))
@@ -2482,6 +2632,8 @@ function planBatches(source, o) {
2482
2632
  const rules = readRulesOf(o.conventions);
2483
2633
  const excludeRes = (o.exclude ?? []).map(globToRegExp);
2484
2634
  const excluded = [];
2635
+ const leaveOut = new Set(o.reach?.leaveOut ?? []);
2636
+ const notReached = [];
2485
2637
  const paths = [];
2486
2638
  const texts = /* @__PURE__ */ new Map();
2487
2639
  for (const p of source.list()) {
@@ -2497,6 +2649,10 @@ function planBatches(source, o) {
2497
2649
  }
2498
2650
  if (!text.trim())
2499
2651
  continue;
2652
+ if (leaveOut.has(p)) {
2653
+ notReached.push(p);
2654
+ continue;
2655
+ }
2500
2656
  paths.push(p);
2501
2657
  texts.set(p, text);
2502
2658
  }
@@ -2512,7 +2668,7 @@ function planBatches(source, o) {
2512
2668
  const slices = [];
2513
2669
  let lines = 0;
2514
2670
  let leastRoom = room;
2515
- for (const path of readingOrder(paths)) {
2671
+ for (const path of reachOrder(paths, o.reach?.first)) {
2516
2672
  const kinds2 = fileKinds(path, rules);
2517
2673
  const left = room - overhead(kinds2);
2518
2674
  leastRoom = Math.min(leastRoom, left);
@@ -2561,9 +2717,20 @@ function planBatches(source, o) {
2561
2717
  tokens: slices.reduce((n, s) => n + s.tokens, 0),
2562
2718
  batches,
2563
2719
  excluded: excluded.sort(),
2564
- leastRoom
2720
+ leastRoom,
2721
+ notReached: notReached.sort()
2565
2722
  };
2566
2723
  }
2724
+ function reachOrder(paths, first) {
2725
+ const order = readingOrder(paths);
2726
+ if (!first?.length)
2727
+ return order;
2728
+ const has = new Set(paths);
2729
+ const head = order.filter((p) => readingRank(p) <= 1);
2730
+ const lead = [...new Set(first)].filter((p) => has.has(p) && readingRank(p) > 1);
2731
+ const taken = /* @__PURE__ */ new Set([...head, ...lead]);
2732
+ return [...head, ...lead, ...order.filter((p) => !taken.has(p))];
2733
+ }
2567
2734
 
2568
2735
  // packages/verify/dist/vendored.js
2569
2736
  var LICENSE_FILE = /^(LICEN[CS]E|COPYING)([._-][^/]*)?$/i;
@@ -2871,27 +3038,101 @@ function unitsOf(dir, fs, room) {
2871
3038
  out.push(...unitsOf(child, children.get(child), room));
2872
3039
  return out;
2873
3040
  }
2874
- function planParts(files, room = SESSION_TOKENS) {
3041
+ function groupUnits(dir, fs, room, holds) {
3042
+ const prefix = dir ? `${dir}/` : "";
3043
+ const direct = [];
3044
+ const children = /* @__PURE__ */ new Map();
3045
+ for (const f of fs) {
3046
+ const rest = f.path.slice(prefix.length);
3047
+ const slash = rest.indexOf("/");
3048
+ if (slash < 0)
3049
+ direct.push(f);
3050
+ else {
3051
+ const child = prefix + rest.slice(0, slash);
3052
+ children.set(child, [...children.get(child) ?? [], f]);
3053
+ }
3054
+ }
3055
+ if (dir && holds(dir, true, fs.length) && (sum(fs) <= room || !children.size))
3056
+ return [{ glob: `${dir}/**`, files: fs.length, tokens: sum(fs) }];
3057
+ const out = [];
3058
+ if (direct.length) {
3059
+ if (holds(dir, false, direct.length))
3060
+ out.push({ glob: `${prefix}*`, files: direct.length, tokens: sum(direct) });
3061
+ else
3062
+ for (const f of [...direct].sort((a, b) => byPath2(a.path, b.path)))
3063
+ out.push({ glob: f.path, files: 1, tokens: f.tokens });
3064
+ }
3065
+ for (const child of [...children.keys()].sort(byPath2))
3066
+ out.push(...groupUnits(child, children.get(child), room, holds));
3067
+ return out;
3068
+ }
3069
+ function rangeUnits(f, room) {
3070
+ return lineRanges({ ...f, lines: f.lines }, room).map((r, i) => ({
3071
+ glob: `${f.path}#L${r.from}-L${r.to}`,
3072
+ files: i === 0 ? 1 : 0,
3073
+ tokens: r.tokens
3074
+ }));
3075
+ }
3076
+ function orderedUnits(files, room, o) {
3077
+ const isBig = (f) => f.tokens > room && (f.lines ?? 0) > 1;
3078
+ const byFile = new Map(files.map((f) => [f.path, f]));
3079
+ const head = new Set(o.head.filter((p) => byFile.has(p)));
3080
+ const models = [...new Set(o.models)].filter((p) => byFile.has(p) && !head.has(p));
3081
+ const inModels = new Set(models);
3082
+ const rest = files.filter((f) => !head.has(f.path) && !inModels.has(f.path));
3083
+ const all2 = [...files.map((f) => f.path), ...o.leftOut];
3084
+ const counts = () => {
3085
+ const deep = /* @__PURE__ */ new Map();
3086
+ const own = /* @__PURE__ */ new Map();
3087
+ const count = (m, k) => m.set(k, (m.get(k) ?? 0) + 1);
3088
+ for (const p of all2) {
3089
+ const parts = p.split("/");
3090
+ count(own, parts.slice(0, -1).join("/"));
3091
+ for (let d = 1; d < parts.length; d++)
3092
+ count(deep, parts.slice(0, d).join("/"));
3093
+ }
3094
+ return (dir, isDeep, n) => (isDeep ? deep.get(dir) : own.get(dir)) === n;
3095
+ };
3096
+ const holds = counts();
3097
+ const unitsOfGroup = (group) => {
3098
+ const small = group.filter((f) => !isBig(f)).sort((a, b) => byPath2(a.path, b.path));
3099
+ const out = groupUnits("", small, room, holds);
3100
+ for (const f of group.filter(isBig))
3101
+ out.push(...rangeUnits(f, room));
3102
+ return out;
3103
+ };
3104
+ return [
3105
+ ...unitsOfGroup(files.filter((f) => head.has(f.path))),
3106
+ ...models.flatMap((p) => {
3107
+ const f = byFile.get(p);
3108
+ return isBig(f) ? rangeUnits(f, room) : [{ glob: p, files: 1, tokens: f.tokens }];
3109
+ }),
3110
+ ...unitsOfGroup(rest)
3111
+ ];
3112
+ }
3113
+ function planParts(files, room = SESSION_TOKENS, order) {
2875
3114
  const total = sum(files);
2876
3115
  if (total <= room)
2877
3116
  return [];
2878
- const big = files.filter((f) => f.tokens > room && (f.lines ?? 0) > 1);
2879
- const rest = files.filter((f) => !big.includes(f));
2880
- const ranges = [];
2881
- for (const f of big)
2882
- for (const [i, r] of lineRanges({ ...f, lines: f.lines }, room).entries())
2883
- ranges.push({
2884
- glob: `${f.path}#L${r.from}-L${r.to}`,
2885
- files: i === 0 ? 1 : 0,
2886
- tokens: r.tokens,
2887
- key: `${f.path}\0${String(r.start).padStart(12, "0")}`
2888
- });
2889
- const sorted = [...rest].sort((a, b) => byPath2(a.path, b.path));
2890
- const keyOf = (g) => g.replace(/\/?\*\*?$/, "");
2891
- const units = [
2892
- ...unitsOf("", sorted, room).map((u) => ({ ...u, key: keyOf(u.glob) })),
2893
- ...ranges
2894
- ].sort((a, b) => byPath2(a.key, b.key));
3117
+ let units;
3118
+ if (order)
3119
+ units = orderedUnits(files, room, order);
3120
+ else {
3121
+ const big = files.filter((f) => f.tokens > room && (f.lines ?? 0) > 1);
3122
+ const rest = files.filter((f) => !big.includes(f));
3123
+ const ranges = [];
3124
+ for (const f of big)
3125
+ for (const [i, r] of lineRanges({ ...f, lines: f.lines }, room).entries())
3126
+ ranges.push({
3127
+ glob: `${f.path}#L${r.from}-L${r.to}`,
3128
+ files: i === 0 ? 1 : 0,
3129
+ tokens: r.tokens,
3130
+ key: `${f.path}\0${String(r.start).padStart(12, "0")}`
3131
+ });
3132
+ const sorted = [...rest].sort((a, b) => byPath2(a.path, b.path));
3133
+ const keyOf = (g) => g.replace(/\/?\*\*?$/, "");
3134
+ units = [...unitsOf("", sorted, room).map((u) => ({ ...u, key: keyOf(u.glob) })), ...ranges].sort((a, b) => byPath2(a.key, b.key)).map(({ key: _k, ...u }) => u);
3135
+ }
2895
3136
  const target = total / Math.ceil(total / room);
2896
3137
  const parts = [];
2897
3138
  let current;
@@ -2920,7 +3161,7 @@ function split(cite2) {
2920
3161
  const m = /^(.+):(\d+)$/.exec(cite2);
2921
3162
  return m ? { file: m[1], line: Number(m[2]) } : void 0;
2922
3163
  }
2923
- function planGaps(from, size, room) {
3164
+ function planGaps(from, size, room, o = {}) {
2924
3165
  const whole = new Set(from.unknown ?? []);
2925
3166
  const lines = /* @__PURE__ */ new Map();
2926
3167
  const note = (cite2, why) => {
@@ -2936,14 +3177,15 @@ function planGaps(from, size, room) {
2936
3177
  for (const h of from.reviewedHolds ?? [])
2937
3178
  for (const s of h.skipped)
2938
3179
  note(s.cite, `writes the ${s.kind} ${quoted2(s.value)}, but ${quoted2(h.path)} is reviewed as ${quoted2(h.why)}: write its fact, or narrow the reviewed line`);
2939
- for (const o of from.specOpsUncovered ?? [])
2940
- note(o.cite, `declares ${o.method} ${quoted2(o.path)}, which no entry covers: find the code that serves it`);
3180
+ for (const o2 of from.specOpsUncovered ?? [])
3181
+ note(o2.cite, `declares ${o2.method} ${quoted2(o2.path)}, which no entry covers: find the code that serves it`);
2941
3182
  for (const e of from.entriesNoFlowFollows ?? [])
2942
3183
  note(e.cite, `is ${e.id} (${[e.entryType, e.method, quoted2(e.path)].filter(Boolean).join(" ")}), which no flow follows: write its flow`);
2943
3184
  const unlisted = Math.max(0, (from.skippedCount ?? 0) - (from.skipped?.length ?? 0)) + Math.max(0, (from.specOpsUncoveredCount ?? 0) - (from.specOpsUncovered?.length ?? 0));
2944
3185
  const gone = [];
2945
3186
  const reads = [];
2946
- const files = [.../* @__PURE__ */ new Set([...whole, ...lines.keys()])].sort(byPath3);
3187
+ const named = [.../* @__PURE__ */ new Set([...whole, ...lines.keys()])].sort(byPath3);
3188
+ const files = o.first?.length ? reachOrder(named, o.first) : named;
2947
3189
  for (const file of files) {
2948
3190
  const sz = size(file);
2949
3191
  if (!sz) {
@@ -3499,8 +3741,8 @@ function changeView(records2, change, flows, known = []) {
3499
3741
  const nodes = [];
3500
3742
  for (const id of comps) {
3501
3743
  const sys = c.components.has(id) ? c.systemOf(id) : void 0;
3502
- const base = c.components.has(id) || c.isSystem(id) ? c.endNode(id, sys) : { id, label: id, kind: "component" };
3503
- const { legend: _status, ...rest } = base;
3744
+ const base2 = c.components.has(id) || c.isSystem(id) ? c.endNode(id, sys) : { id, label: id, kind: "component" };
3745
+ const { legend: _status, ...rest } = base2;
3504
3746
  nodes.push({ ...rest, label: marked(rest.label, legends.get(id)), ...withMark(id) });
3505
3747
  }
3506
3748
  for (const t of tables) {
@@ -3596,14 +3838,14 @@ var Ids = class {
3596
3838
  const known = this.map.get(key);
3597
3839
  if (known)
3598
3840
  return known;
3599
- let base = raw.replace(/[^A-Za-z0-9_]/g, "_");
3600
- if (!/^[A-Za-z]/.test(base))
3601
- base = `n_${base}`;
3602
- if (RESERVED.has(base.toLowerCase()))
3603
- base = `${base}_`;
3604
- let id = base;
3841
+ let base2 = raw.replace(/[^A-Za-z0-9_]/g, "_");
3842
+ if (!/^[A-Za-z]/.test(base2))
3843
+ base2 = `n_${base2}`;
3844
+ if (RESERVED.has(base2.toLowerCase()))
3845
+ base2 = `${base2}_`;
3846
+ let id = base2;
3605
3847
  for (let n = 2; this.used.has(id); n++)
3606
- id = `${base}_${n}`;
3848
+ id = `${base2}_${n}`;
3607
3849
  this.used.add(id);
3608
3850
  this.map.set(key, id);
3609
3851
  return id;
@@ -3792,8 +4034,8 @@ function nodeStyle(n) {
3792
4034
  return styleText(SHAPES.topic, legend);
3793
4035
  if (n.boundary === "vendor")
3794
4036
  return styleText(SHAPES.vendor, n.kind === "component" ? { atticusKind: "component" } : {}, legend);
3795
- const base = n.kind === "system" ? SHAPES.system : SHAPES.component;
3796
- return styleText(base, n.boundary ? BOUNDARY[n.boundary] : void 0, legend);
4037
+ const base2 = n.kind === "system" ? SHAPES.system : SHAPES.component;
4038
+ return styleText(base2, n.boundary ? BOUNDARY[n.boundary] : void 0, legend);
3797
4039
  }
3798
4040
  function groupStyle(g) {
3799
4041
  return styleText(SHAPES.group, g.kind === "datastore" ? { atticusKind: "datastore-group" } : {}, g.boundary ? { strokeColor: BOUNDARY[g.boundary].strokeColor } : void 0, g.legend ? LEGEND[g.legend] : void 0);
@@ -3884,14 +4126,14 @@ function edgeStyle(e) {
3884
4126
  }
3885
4127
  var compress = (xml) => deflateRawSync(Buffer.from(encodeURIComponent(xml), "utf8"), { level: 9 }).toString("base64");
3886
4128
  function shapeLibrary() {
3887
- const base = [
4129
+ const base2 = [
3888
4130
  ["System", SHAPES.system, W, H],
3889
4131
  ["Component", SHAPES.component, W, H],
3890
4132
  ["Vendor", SHAPES.vendor, W, H + 20],
3891
4133
  ["Data store", SHAPES.datastore, 120, 80],
3892
4134
  ["Topic", SHAPES.topic, W, H]
3893
4135
  ];
3894
- const entries = base.flatMap(([title, style, w, h]) => [void 0, "new", "modify", "retire"].map((legend) => {
4136
+ const entries = base2.flatMap(([title, style, w, h]) => [void 0, "new", "modify", "retire"].map((legend) => {
3895
4137
  const value = attr(title);
3896
4138
  const st = attr(styleText(style, legend ? LEGEND[legend] : void 0));
3897
4139
  const xml = `<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="2" value="${value}" style="${st}" vertex="1" parent="1"><mxGeometry width="${w}" height="${h}" as="geometry"/></mxCell></root></mxGraphModel>`;
@@ -4834,13 +5076,13 @@ function codeLinkerFor(o) {
4834
5076
  web = `https://${scp[1]}/${scp[2]}`;
4835
5077
  }
4836
5078
  if (web) {
4837
- const base = web.replace(/\/+$/, "").replace(/\.git$/, "");
4838
- const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(base);
5079
+ const base2 = web.replace(/\/+$/, "").replace(/\.git$/, "");
5080
+ const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(base2);
4839
5081
  return (path, line, commit) => {
4840
5082
  const p = encodeURI(path);
4841
5083
  if (ado)
4842
- return `${base}?path=/${p}${commit ? `&version=GC${commit}` : ""}${line ? `&line=${line}` : ""}`;
4843
- return `${base}/blob/${commit ?? "HEAD"}/${p}${line ? `#L${line}` : ""}`;
5084
+ return `${base2}?path=/${p}${commit ? `&version=GC${commit}` : ""}${line ? `&line=${line}` : ""}`;
5085
+ return `${base2}/blob/${commit ?? "HEAD"}/${p}${line ? `#L${line}` : ""}`;
4844
5086
  };
4845
5087
  }
4846
5088
  const dir = (o.dir ?? "").replace(/\/+$/, "");
@@ -5289,8 +5531,8 @@ function ctxOf(i, file) {
5289
5531
  }
5290
5532
  function renderMap(i) {
5291
5533
  const files = {};
5292
- const base = ctxOf(i, "map.md");
5293
- for (const comp of [...base.comps].sort(cmp2)) {
5534
+ const base2 = ctxOf(i, "map.md");
5535
+ for (const comp of [...base2.comps].sort(cmp2)) {
5294
5536
  const yaml = openApiOf(i, comp);
5295
5537
  if (yaml)
5296
5538
  files[`contracts/${comp}.openapi.yaml`] = yaml;
@@ -5304,18 +5546,18 @@ function renderMap(i) {
5304
5546
  HEADER2(i.repo, "the catalog and its specs"),
5305
5547
  "",
5306
5548
  ...aboutLine(i.about, i.repo),
5307
- ...builtOnLine(base),
5549
+ ...builtOnLine(base2),
5308
5550
  trustLine(i.trust, i.repo),
5309
5551
  "",
5310
- ...section("What it serves", serves(base)),
5311
- ...section("What it calls", calls(base)),
5312
- ...section("What it stores", stores(base)),
5313
- ...section("Where it runs", deploys(base)),
5314
- ...section("Config that names other systems", config(base)),
5315
- ...i.terms?.length ? section("Terms", terms(base)) : [],
5316
- ...section("Flows", flowsList(base)),
5317
- ...section("Contracts", contracts(base, files)),
5318
- ...section("Open questions", openQuestions(base))
5552
+ ...section("What it serves", serves(base2)),
5553
+ ...section("What it calls", calls(base2)),
5554
+ ...section("What it stores", stores(base2)),
5555
+ ...section("Where it runs", deploys(base2)),
5556
+ ...section("Config that names other systems", config(base2)),
5557
+ ...i.terms?.length ? section("Terms", terms(base2)) : [],
5558
+ ...section("Flows", flowsList(base2)),
5559
+ ...section("Contracts", contracts(base2, files)),
5560
+ ...section("Open questions", openQuestions(base2))
5319
5561
  ].join("\n");
5320
5562
  return Object.fromEntries(Object.entries(files).sort(([a], [b]) => cmp2(a, b)));
5321
5563
  }
@@ -5525,7 +5767,7 @@ function repairFormSlips(facts, bad, onFile = []) {
5525
5767
  }
5526
5768
 
5527
5769
  // packages/verify/dist/house-imports.js
5528
- var CODE = /\.(java|kt|kts|scala|groovy|cs|vb|fs|ts|tsx|js|jsx|mjs|cjs|vue|svelte|py|go|rb|php|swift)$/i;
5770
+ var CODE2 = /\.(java|kt|kts|scala|groovy|cs|vb|fs|ts|tsx|js|jsx|mjs|cjs|vue|svelte|py|go|rb|php|swift)$/i;
5529
5771
  var IMPORTS = [
5530
5772
  // Java, Kotlin, Scala, Groovy, Python's `import a.b`, Go's one-line import
5531
5773
  /^\s*import\s+(?:static\s+)?([A-Za-z_][\w.]*)/,
@@ -5573,7 +5815,7 @@ function houseImportsUntaught(source, o) {
5573
5815
  const prefixes = o.prefixes.map(lower);
5574
5816
  const taught = o.taught.map(lower);
5575
5817
  const found = /* @__PURE__ */ new Map();
5576
- const paths = source.list().filter((p) => CODE.test(p) && !rules.notRead.test(p) && !(o.exclude ?? []).some((re) => re.test(p)) && isSourceFile(p, "", void 0, rules)).sort();
5818
+ const paths = source.list().filter((p) => CODE2.test(p) && !rules.notRead.test(p) && !(o.exclude ?? []).some((re) => re.test(p)) && isSourceFile(p, "", void 0, rules)).sort();
5577
5819
  for (const p of paths) {
5578
5820
  const text = source.read(p);
5579
5821
  if (text === void 0)
@@ -5623,9 +5865,6 @@ export {
5623
5865
  readRulesOf,
5624
5866
  lineRangeOf,
5625
5867
  parseReviewed,
5626
- sameCommit,
5627
- staleMessage,
5628
- verifyFacts,
5629
5868
  readingRank,
5630
5869
  FILE_KINDS,
5631
5870
  fileKinds,
@@ -5633,6 +5872,11 @@ export {
5633
5872
  numberedSlice,
5634
5873
  sliceText,
5635
5874
  planBatches,
5875
+ NOT_REACHED_WHY,
5876
+ reachableModels,
5877
+ sameCommit,
5878
+ staleMessage,
5879
+ verifyFacts,
5636
5880
  SHOWN_PROPOSALS,
5637
5881
  proposeExclusions,
5638
5882
  exclusionYaml,
@@ -5,7 +5,7 @@ var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
5
  var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
6
  import {
7
7
  readCatalog
8
- } from "./chunk-22GLUHGE.js";
8
+ } from "./chunk-DBZNQAMN.js";
9
9
  import {
10
10
  readDiagram,
11
11
  reconcile
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  draftRepoType,
11
11
  matchRepoType
12
- } from "./chunk-22GLUHGE.js";
12
+ } from "./chunk-DBZNQAMN.js";
13
13
  import {
14
14
  fsRepo
15
15
  } from "./chunk-MRLCNXXR.js";