@opensip-cli/graph 0.1.11 → 0.1.12

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 (127) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/cache/engine-version.test.js +4 -4
  3. package/dist/__tests__/cache/engine-version.test.js.map +1 -1
  4. package/dist/__tests__/public-api.test.js +10 -0
  5. package/dist/__tests__/public-api.test.js.map +1 -1
  6. package/dist/__tests__/rules/registry.test.js +1 -0
  7. package/dist/__tests__/rules/registry.test.js.map +1 -1
  8. package/dist/cache/engine-version.d.ts.map +1 -1
  9. package/dist/cache/engine-version.js +5 -1
  10. package/dist/cache/engine-version.js.map +1 -1
  11. package/dist/cli/__tests__/equivalence-diagnostic.test.d.ts +7 -0
  12. package/dist/cli/__tests__/equivalence-diagnostic.test.d.ts.map +1 -0
  13. package/dist/cli/__tests__/equivalence-diagnostic.test.js +136 -0
  14. package/dist/cli/__tests__/equivalence-diagnostic.test.js.map +1 -0
  15. package/dist/cli/equivalence-check-command.d.ts.map +1 -1
  16. package/dist/cli/equivalence-check-command.js +35 -2
  17. package/dist/cli/equivalence-check-command.js.map +1 -1
  18. package/dist/cli/equivalence-diagnostic.d.ts +100 -0
  19. package/dist/cli/equivalence-diagnostic.d.ts.map +1 -0
  20. package/dist/cli/equivalence-diagnostic.js +138 -0
  21. package/dist/cli/equivalence-diagnostic.js.map +1 -0
  22. package/dist/cli/graph/graph-command-spec.d.ts.map +1 -1
  23. package/dist/cli/graph/graph-command-spec.js +3 -0
  24. package/dist/cli/graph/graph-command-spec.js.map +1 -1
  25. package/dist/cli/graph-config-schema.d.ts +3 -0
  26. package/dist/cli/graph-config-schema.d.ts.map +1 -1
  27. package/dist/cli/graph-config-schema.js +11 -0
  28. package/dist/cli/graph-config-schema.js.map +1 -1
  29. package/dist/cli/graph-config.d.ts.map +1 -1
  30. package/dist/cli/graph-config.js +5 -9
  31. package/dist/cli/graph-config.js.map +1 -1
  32. package/dist/cli/graph-envelope-view.d.ts.map +1 -1
  33. package/dist/cli/graph-envelope-view.js +1 -0
  34. package/dist/cli/graph-envelope-view.js.map +1 -1
  35. package/dist/cli/graph-modes.d.ts.map +1 -1
  36. package/dist/cli/graph-modes.js +6 -3
  37. package/dist/cli/graph-modes.js.map +1 -1
  38. package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js +76 -0
  39. package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js.map +1 -1
  40. package/dist/cli/orchestrate/catalog-stats.d.ts.map +1 -1
  41. package/dist/cli/orchestrate/catalog-stats.js +0 -1
  42. package/dist/cli/orchestrate/catalog-stats.js.map +1 -1
  43. package/dist/cli/orchestrate/cross-shard-resolve.d.ts.map +1 -1
  44. package/dist/cli/orchestrate/cross-shard-resolve.js +77 -2
  45. package/dist/cli/orchestrate/cross-shard-resolve.js.map +1 -1
  46. package/dist/cli/orchestrate/flat-monorepo-strategy.d.ts.map +1 -1
  47. package/dist/cli/orchestrate/flat-monorepo-strategy.js +0 -1
  48. package/dist/cli/orchestrate/flat-monorepo-strategy.js.map +1 -1
  49. package/dist/cli/pressure-monitor.d.ts +2 -0
  50. package/dist/cli/pressure-monitor.d.ts.map +1 -1
  51. package/dist/cli/pressure-monitor.js +15 -0
  52. package/dist/cli/pressure-monitor.js.map +1 -1
  53. package/dist/cli/report-data.d.ts.map +1 -1
  54. package/dist/cli/report-data.js +0 -1
  55. package/dist/cli/report-data.js.map +1 -1
  56. package/dist/index.d.ts +4 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +5 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/lang-adapter/__tests__/language-of-file.test.d.ts +2 -0
  61. package/dist/lang-adapter/__tests__/language-of-file.test.d.ts.map +1 -0
  62. package/dist/lang-adapter/__tests__/language-of-file.test.js +36 -0
  63. package/dist/lang-adapter/__tests__/language-of-file.test.js.map +1 -0
  64. package/dist/lang-adapter/__tests__/near-duplicate-signature.test.d.ts +2 -0
  65. package/dist/lang-adapter/__tests__/near-duplicate-signature.test.d.ts.map +1 -0
  66. package/dist/lang-adapter/__tests__/near-duplicate-signature.test.js +78 -0
  67. package/dist/lang-adapter/__tests__/near-duplicate-signature.test.js.map +1 -0
  68. package/dist/lang-adapter/body-digest.d.ts +9 -41
  69. package/dist/lang-adapter/body-digest.d.ts.map +1 -1
  70. package/dist/lang-adapter/body-digest.js +9 -44
  71. package/dist/lang-adapter/body-digest.js.map +1 -1
  72. package/dist/lang-adapter/language-of-file.d.ts +15 -0
  73. package/dist/lang-adapter/language-of-file.d.ts.map +1 -0
  74. package/dist/lang-adapter/language-of-file.js +43 -0
  75. package/dist/lang-adapter/language-of-file.js.map +1 -0
  76. package/dist/lang-adapter/near-duplicate-signature.d.ts +12 -0
  77. package/dist/lang-adapter/near-duplicate-signature.d.ts.map +1 -0
  78. package/dist/lang-adapter/near-duplicate-signature.js +12 -0
  79. package/dist/lang-adapter/near-duplicate-signature.js.map +1 -0
  80. package/dist/lang-adapter/read-source.d.ts.map +1 -1
  81. package/dist/lang-adapter/read-source.js +0 -1
  82. package/dist/lang-adapter/read-source.js.map +1 -1
  83. package/dist/lang-adapter/registry.d.ts.map +1 -1
  84. package/dist/lang-adapter/registry.js +0 -1
  85. package/dist/lang-adapter/registry.js.map +1 -1
  86. package/dist/persistence/catalog-repo.d.ts.map +1 -1
  87. package/dist/persistence/catalog-repo.js +1 -0
  88. package/dist/persistence/catalog-repo.js.map +1 -1
  89. package/dist/persistence/session-payload.d.ts.map +1 -1
  90. package/dist/persistence/session-payload.js +0 -1
  91. package/dist/persistence/session-payload.js.map +1 -1
  92. package/dist/persistence/session-replay.d.ts.map +1 -1
  93. package/dist/persistence/session-replay.js +10 -25
  94. package/dist/persistence/session-replay.js.map +1 -1
  95. package/dist/pipeline/feature-deps.d.ts.map +1 -1
  96. package/dist/pipeline/feature-deps.js +0 -1
  97. package/dist/pipeline/feature-deps.js.map +1 -1
  98. package/dist/pipeline/features.d.ts.map +1 -1
  99. package/dist/pipeline/features.js +0 -1
  100. package/dist/pipeline/features.js.map +1 -1
  101. package/dist/pipeline/indexes.d.ts.map +1 -1
  102. package/dist/pipeline/indexes.js +0 -1
  103. package/dist/pipeline/indexes.js.map +1 -1
  104. package/dist/render/rule-id-mapping.d.ts.map +1 -1
  105. package/dist/render/rule-id-mapping.js +1 -0
  106. package/dist/render/rule-id-mapping.js.map +1 -1
  107. package/dist/rules/__tests__/near-duplicate-function-body.test.d.ts +2 -0
  108. package/dist/rules/__tests__/near-duplicate-function-body.test.d.ts.map +1 -0
  109. package/dist/rules/__tests__/near-duplicate-function-body.test.js +142 -0
  110. package/dist/rules/__tests__/near-duplicate-function-body.test.js.map +1 -0
  111. package/dist/rules/_entry-points.d.ts.map +1 -1
  112. package/dist/rules/_entry-points.js +0 -1
  113. package/dist/rules/_entry-points.js.map +1 -1
  114. package/dist/rules/duplicated-function-body.d.ts +12 -34
  115. package/dist/rules/duplicated-function-body.d.ts.map +1 -1
  116. package/dist/rules/duplicated-function-body.js +83 -233
  117. package/dist/rules/duplicated-function-body.js.map +1 -1
  118. package/dist/rules/near-duplicate-function-body.d.ts +11 -0
  119. package/dist/rules/near-duplicate-function-body.d.ts.map +1 -0
  120. package/dist/rules/near-duplicate-function-body.js +74 -0
  121. package/dist/rules/near-duplicate-function-body.js.map +1 -0
  122. package/dist/rules/registry.d.ts.map +1 -1
  123. package/dist/rules/registry.js +2 -1
  124. package/dist/rules/registry.js.map +1 -1
  125. package/dist/types.d.ts +20 -0
  126. package/dist/types.d.ts.map +1 -1
  127. package/package.json +10 -9
package/README.md CHANGED
@@ -25,8 +25,8 @@ This package is published for the CLI and advanced plugin authors; most users sh
25
25
  ## Documentation
26
26
 
27
27
  - 📚 Project docs: https://opensip.ai/docs/opensip-cli/
28
- - 🧭 Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.11/docs/public/70-reference/02-package-catalog.md
29
- - 📦 Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.11/packages/graph/engine
28
+ - 🧭 Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.12/docs/public/70-reference/02-package-catalog.md
29
+ - 📦 Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.12/packages/graph/engine
30
30
 
31
31
  ## License
32
32
 
@@ -13,7 +13,7 @@ import { ENGINE_VERSION, stampEngineVersion } from '../../cache/engine-version.j
13
13
  import { classifyCatalog, computeFilesFingerprint } from '../../cache/invalidate.js';
14
14
  describe('stampEngineVersion', () => {
15
15
  it('prefixes the adapter cacheKey with the running engine version and the default exact mode', () => {
16
- expect(stampEngineVersion('ts-6.0.3-exact-abc')).toBe(`eng=${ENGINE_VERSION}|mode=exact|ts-6.0.3-exact-abc`);
16
+ expect(stampEngineVersion('ts-6.0.3-exact-abc')).toBe(`eng=${ENGINE_VERSION}|mode=exact|sig=128.2|ts-6.0.3-exact-abc`);
17
17
  });
18
18
  it('reads a real version (not the 0.0.0 not-found sentinel)', () => {
19
19
  // Resolves @opensip-cli/graph's package.json; a 0.0.0 here would mean
@@ -23,7 +23,7 @@ describe('stampEngineVersion', () => {
23
23
  });
24
24
  it('is polyglot — wraps every adapter prefix identically', () => {
25
25
  for (const adapterKey of ['ts-6-x', 'go-abc', 'java-abc', 'rs-abc', 'py-abc']) {
26
- expect(stampEngineVersion(adapterKey)).toBe(`eng=${ENGINE_VERSION}|mode=exact|${adapterKey}`);
26
+ expect(stampEngineVersion(adapterKey)).toBe(`eng=${ENGINE_VERSION}|mode=exact|sig=128.2|${adapterKey}`);
27
27
  }
28
28
  });
29
29
  it('folds the engine MODE so exact and sharded keys never collide (ADR-0032)', () => {
@@ -35,8 +35,8 @@ describe('stampEngineVersion', () => {
35
35
  // mode ⇒ different cacheKey.
36
36
  const exact = stampEngineVersion('ts-6.0.3-exact-abc', 'exact');
37
37
  const sharded = stampEngineVersion('ts-6.0.3-exact-abc', 'sharded');
38
- expect(exact).toBe(`eng=${ENGINE_VERSION}|mode=exact|ts-6.0.3-exact-abc`);
39
- expect(sharded).toBe(`eng=${ENGINE_VERSION}|mode=sharded|ts-6.0.3-exact-abc`);
38
+ expect(exact).toBe(`eng=${ENGINE_VERSION}|mode=exact|sig=128.2|ts-6.0.3-exact-abc`);
39
+ expect(sharded).toBe(`eng=${ENGINE_VERSION}|mode=sharded|sig=128.2|ts-6.0.3-exact-abc`);
40
40
  expect(exact).not.toBe(sharded);
41
41
  });
42
42
  });
@@ -1 +1 @@
1
- {"version":3,"file":"engine-version.test.js","sourceRoot":"","sources":["../../../src/__tests__/cache/engine-version.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine-version.test.js","sourceRoot":"","sources":["../../../src/__tests__/cache/engine-version.test.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ const EXPECTED_VALUE_EXPORTS = [
29
29
  'GraphAdapterSelector',
30
30
  'GraphRecipeRegistry',
31
31
  'appendEdge',
32
+ 'bodySignature',
32
33
  'builtInGraphRecipes',
33
34
  'builtInGraphRecipesByName',
34
35
  // Cross-package resolution primitives — the (import specifier + callee name) →
@@ -47,11 +48,19 @@ const EXPECTED_VALUE_EXPORTS = [
47
48
  'defaultGraphRecipe',
48
49
  'defineGraphRecipe',
49
50
  'defineRule',
51
+ 'digestCanonicalBody',
52
+ 'estimateJaccard',
50
53
  'graphTool',
51
54
  'GRAPH_CONTRACT_VERSION',
52
55
  'hashBody',
53
56
  'isBuiltInGraphRecipe',
57
+ 'isTestFilePath',
58
+ 'languageOfFile',
54
59
  'linkExported',
60
+ 'lshBandHashes',
61
+ 'NEAR_DUP_LSH_BANDS',
62
+ 'NEAR_DUP_LSH_ROWS',
63
+ 'NEAR_DUP_SIGNATURE_K',
55
64
  'normalizeWhitespace',
56
65
  'ownerEdgeKey',
57
66
  'pickAdapter',
@@ -59,6 +68,7 @@ const EXPECTED_VALUE_EXPORTS = [
59
68
  'resolveCrossPackageCall',
60
69
  'resolveRecipeToRules',
61
70
  'resolveSpecifierToPackage',
71
+ 'shingle',
62
72
  'tool',
63
73
  'truncateForCallEdge',
64
74
  // Per-file source size guard shared by adapter parse steps (10 MB cap, shared
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.test.js","sourceRoot":"","sources":["../../src/__tests__/public-api.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;IACxB,+EAA+E;IAC/E,iCAAiC;IACjC,iBAAiB;IACjB,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,YAAY;IACZ,qBAAqB;IACrB,2BAA2B;IAC3B,+EAA+E;IAC/E,+EAA+E;IAC/E,wEAAwE;IACxE,iEAAiE;IACjE,kBAAkB;IAClB,2BAA2B;IAC3B,oCAAoC;IACpC,uBAAuB;IACvB,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,YAAY;IACZ,WAAW;IACX,wBAAwB;IACxB,UAAU;IACV,sBAAsB;IACtB,cAAc;IACd,qBAAqB;IACrB,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,MAAM;IACN,qBAAqB;IACrB,8EAA8E;IAC9E,kDAAkD;IAClD,uBAAuB;IACvB,uBAAuB;CACxB,CAAC,IAAI,EAAE,CAAC;AAET,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAwB,CAAC,KAAK,SAAS,CAAC;aAC7D,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAClF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,uEAAuE;QACvE,0DAA0D;QAC1D,KAAK,MAAM,IAAI,IAAI;YACjB,aAAa;YACb,UAAU;YACV,cAAc;YACd,cAAc;YACd,yBAAyB;YACzB,mBAAmB;YACnB,4BAA4B;YAC5B,qBAAqB;YACrB,cAAc;SACf,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"public-api.test.js","sourceRoot":"","sources":["../../src/__tests__/public-api.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;IACxB,+EAA+E;IAC/E,iCAAiC;IACjC,iBAAiB;IACjB,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,YAAY;IACZ,eAAe;IACf,qBAAqB;IACrB,2BAA2B;IAC3B,+EAA+E;IAC/E,+EAA+E;IAC/E,wEAAwE;IACxE,iEAAiE;IACjE,kBAAkB;IAClB,2BAA2B;IAC3B,oCAAoC;IACpC,uBAAuB;IACvB,oBAAoB;IACpB,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,YAAY;IACZ,qBAAqB;IACrB,iBAAiB;IACjB,WAAW;IACX,wBAAwB;IACxB,UAAU;IACV,sBAAsB;IACtB,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,qBAAqB;IACrB,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,SAAS;IACT,MAAM;IACN,qBAAqB;IACrB,8EAA8E;IAC9E,kDAAkD;IAClD,uBAAuB;IACvB,uBAAuB;CACxB,CAAC,IAAI,EAAE,CAAC;AAET,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAwB,CAAC,KAAK,SAAS,CAAC;aAC7D,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAClF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,uEAAuE;QACvE,0DAA0D;QAC1D,KAAK,MAAM,IAAI,IAAI;YACjB,aAAa;YACb,UAAU;YACV,cAAc;YACd,cAAc;YACd,yBAAyB;YACzB,mBAAmB;YACnB,4BAA4B;YAC5B,qBAAqB;YACrB,cAAc;SACf,EAAE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -42,6 +42,7 @@ describe('rules registry conformance', () => {
42
42
  const slugs = rules.map((r) => r.slug);
43
43
  expect(slugs).toContain('graph:orphan-subtree');
44
44
  expect(slugs).toContain('graph:duplicated-function-body');
45
+ expect(slugs).toContain('graph:near-duplicate-function-body');
45
46
  expect(slugs).toContain('graph:no-side-effect-path');
46
47
  expect(slugs).toContain('graph:test-only-reachable');
47
48
  expect(slugs).toContain('graph:always-throws-branch');
@@ -1 +1 @@
1
- {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/__tests__/rules/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,IAAI,KAAsB,CAAC;AAE3B,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC7B,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,GAAG,YAAY,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/__tests__/rules/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1C,IAAI,KAAsB,CAAC;AAE3B,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC7B,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,UAAU,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,GAAG,YAAY,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"engine-version.d.ts","sourceRoot":"","sources":["../../src/cache/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAKlE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAK7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,GAAE,UAAoB,GAAG,MAAM,CAE9F"}
1
+ {"version":3,"file":"engine-version.d.ts","sourceRoot":"","sources":["../../src/cache/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAsC,CAAC;AAKlE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAQ7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,GAAE,UAAoB,GAAG,MAAM,CAG9F"}
@@ -25,6 +25,7 @@
25
25
  * catalog simply mismatches the new prefix and rebuilds once.
26
26
  */
27
27
  import { readPackageVersion } from '@opensip-cli/core';
28
+ import { NEAR_DUP_SIGNATURE_K, NEAR_DUP_SIGNATURE_VERSION, } from '../lang-adapter/near-duplicate-signature.js';
28
29
  /**
29
30
  * The running `@opensip-cli/graph` package version, resolved once from
30
31
  * the nearest `package.json`. In a published install this is the version
@@ -35,6 +36,8 @@ export const ENGINE_VERSION = readPackageVersion(import.meta.url);
35
36
  const ENGINE_VERSION_PREFIX = 'eng=';
36
37
  /** Cache-key segment carrying the build engine mode. */
37
38
  const ENGINE_MODE_PREFIX = 'mode=';
39
+ /** Cache-key segment carrying the near-duplicate signature schema version. */
40
+ const SIGNATURE_VERSION_PREFIX = 'sig=';
38
41
  /**
39
42
  * Prefix an adapter's `cacheKey` with the running engine version AND the
40
43
  * build engine mode so (a) a tool upgrade invalidates persisted
@@ -55,6 +58,7 @@ const ENGINE_MODE_PREFIX = 'mode=';
55
58
  * rebuild is diagnosable.
56
59
  */
57
60
  export function stampEngineVersion(adapterCacheKey, mode = 'exact') {
58
- return `${ENGINE_VERSION_PREFIX}${ENGINE_VERSION}|${ENGINE_MODE_PREFIX}${mode}|${adapterCacheKey}`;
61
+ const sig = `${String(NEAR_DUP_SIGNATURE_K)}.${String(NEAR_DUP_SIGNATURE_VERSION)}`;
62
+ return `${ENGINE_VERSION_PREFIX}${ENGINE_VERSION}|${ENGINE_MODE_PREFIX}${mode}|${SIGNATURE_VERSION_PREFIX}${sig}|${adapterCacheKey}`;
59
63
  }
60
64
  //# sourceMappingURL=engine-version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine-version.js","sourceRoot":"","sources":["../../src/cache/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElE,oDAAoD;AACpD,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAmBrC,wDAAwD;AACxD,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB,EAAE,OAAmB,OAAO;IACpF,OAAO,GAAG,qBAAqB,GAAG,cAAc,IAAI,kBAAkB,GAAG,IAAI,IAAI,eAAe,EAAE,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"engine-version.js","sourceRoot":"","sources":["../../src/cache/engine-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,6CAA6C,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElE,oDAAoD;AACpD,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAmBrC,wDAAwD;AACxD,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAAC,eAAuB,EAAE,OAAmB,OAAO;IACpF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,0BAA0B,CAAC,EAAE,CAAC;IACpF,OAAO,GAAG,qBAAqB,GAAG,cAAc,IAAI,kBAAkB,GAAG,IAAI,IAAI,wBAAwB,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;AACvI,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for the PURE equivalence-diagnostic builder. No fs / env / clock —
3
+ * the host command owns those effects; here we assert the analysis maps a
4
+ * decline/phantom divergence to a symmetric per-engine description.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=equivalence-diagnostic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equivalence-diagnostic.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/equivalence-diagnostic.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Unit tests for the PURE equivalence-diagnostic builder. No fs / env / clock —
3
+ * the host command owns those effects; here we assert the analysis maps a
4
+ * decline/phantom divergence to a symmetric per-engine description.
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { buildEquivalenceDiagnostic } from '../equivalence-diagnostic.js';
8
+ function occ(simpleName, filePath, bodyHash, calls = []) {
9
+ return {
10
+ bodyHash,
11
+ simpleName,
12
+ qualifiedName: `${filePath}.${simpleName}`,
13
+ filePath,
14
+ line: 1,
15
+ column: 0,
16
+ endLine: 1,
17
+ kind: 'function-declaration',
18
+ params: [],
19
+ returnType: null,
20
+ enclosingClass: null,
21
+ decorators: [],
22
+ visibility: 'exported',
23
+ inTestFile: false,
24
+ definedInGenerated: false,
25
+ calls,
26
+ };
27
+ }
28
+ function fragment(...occs) {
29
+ const functions = {};
30
+ for (const o of occs) {
31
+ const bucket = functions[o.simpleName];
32
+ if (bucket)
33
+ bucket.push(o);
34
+ else
35
+ functions[o.simpleName] = [o];
36
+ }
37
+ return {
38
+ version: '3.0',
39
+ tool: 'graph',
40
+ language: 'typescript',
41
+ builtAt: 'x',
42
+ cacheKey: 'key',
43
+ resolutionMode: 'exact',
44
+ functions,
45
+ };
46
+ }
47
+ const edge = (over) => ({
48
+ line: 5,
49
+ column: 9,
50
+ resolution: 'semantic',
51
+ confidence: 'high',
52
+ text: 'target()',
53
+ ...over,
54
+ });
55
+ function diff(over) {
56
+ return {
57
+ key: 'OWNER@caller',
58
+ ownerFilePath: 'packages/a/src/caller.ts',
59
+ line: 5,
60
+ column: 9,
61
+ toA: '',
62
+ toB: '',
63
+ cross: true,
64
+ ...over,
65
+ };
66
+ }
67
+ const SHARDS = [{ id: 'pkg:a', rootDir: '/repo/packages/a', files: ['f1.ts', 'f2.ts'] }];
68
+ describe('buildEquivalenceDiagnostic', () => {
69
+ it('describes a decline (exact resolved, sharded declined) symmetrically', () => {
70
+ const exactEdge = edge({ to: ['TGT'], resolution: 'semantic', crossShard: true });
71
+ const shardedEdge = edge({ to: [], resolution: 'unknown', confidence: 'low' });
72
+ const exact = fragment(occ('caller', 'packages/a/src/caller.ts', 'OWNER', [exactEdge]), occ('target', 'packages/b/src/target.ts', 'TGT'));
73
+ const sharded = fragment(occ('caller', 'packages/a/src/caller.ts', 'OWNER', [shardedEdge]), occ('target', 'packages/b/src/target.ts', 'TGT'));
74
+ const out = buildEquivalenceDiagnostic({
75
+ report: { productionDecline: [diff({ toA: 'TGT', toB: '' })], productionPhantom: [] },
76
+ exact,
77
+ sharded,
78
+ shards: SHARDS,
79
+ });
80
+ expect(out.counts).toEqual({ productionDecline: 1, productionPhantom: 0 });
81
+ expect(out.shards).toEqual([{ id: 'pkg:a', rootDir: '/repo/packages/a', fileCount: 2 }]);
82
+ const d = out.decline[0];
83
+ expect(d.owner.hash).toBe('OWNER');
84
+ expect(d.owner.exact?.simpleName).toBe('caller');
85
+ expect(d.owner.sharded?.simpleName).toBe('caller');
86
+ expect(d.exactEdge?.to).toEqual(['TGT']);
87
+ expect(d.exactEdge?.resolution).toBe('semantic');
88
+ expect(d.exactEdge?.crossShard).toBe(true);
89
+ expect(d.shardedEdge?.to).toEqual([]);
90
+ expect(d.shardedEdge?.resolution).toBe('unknown');
91
+ expect(d.exactTo).toEqual([
92
+ { hash: 'TGT', occurrences: [expect.objectContaining({ simpleName: 'target' })] },
93
+ ]);
94
+ expect(d.shardedTo).toEqual([]);
95
+ // Histogram keys on `<resolution>:<crossShard>` of the exact edge.
96
+ expect(out.declineByExactResolution).toEqual({ 'semantic:true': 1 });
97
+ });
98
+ it('describes a phantom (sharded resolved, exact declined) and histograms it', () => {
99
+ const exact = fragment(occ('caller', 'packages/a/src/caller.ts', 'OWNER', [edge({ to: [] })]));
100
+ const sharded = fragment(occ('caller', 'packages/a/src/caller.ts', 'OWNER', [
101
+ edge({ to: ['TGT'], resolution: 'semantic', crossShard: true }),
102
+ ]), occ('target', 'packages/b/src/target.ts', 'TGT'));
103
+ const out = buildEquivalenceDiagnostic({
104
+ report: { productionDecline: [], productionPhantom: [diff({ toA: '', toB: 'TGT' })] },
105
+ exact,
106
+ sharded,
107
+ shards: SHARDS,
108
+ });
109
+ expect(out.counts).toEqual({ productionDecline: 0, productionPhantom: 1 });
110
+ const p = out.phantom[0];
111
+ expect(p.shardedEdge?.to).toEqual(['TGT']);
112
+ expect(p.shardedTo).toEqual([
113
+ { hash: 'TGT', occurrences: [expect.objectContaining({ simpleName: 'target' })] },
114
+ ]);
115
+ expect(p.exactTo).toEqual([]);
116
+ expect(out.phantomByShardedResolution).toEqual({ 'semantic:true': 1 });
117
+ });
118
+ it('emits null edge/owner summaries when the occurrence is absent from a catalog', () => {
119
+ // sharded never saw the owner at all → its owner + same-site edge are null.
120
+ const exact = fragment(occ('caller', 'packages/a/src/caller.ts', 'OWNER', [edge({ to: ['TGT'] })]), occ('target', 'packages/b/src/target.ts', 'TGT'));
121
+ const sharded = fragment(occ('unrelated', 'packages/c/src/x.ts', 'OTHER'));
122
+ const out = buildEquivalenceDiagnostic({
123
+ report: { productionDecline: [diff({ toA: 'TGT', toB: '' })], productionPhantom: [] },
124
+ exact,
125
+ sharded,
126
+ shards: SHARDS,
127
+ });
128
+ const d = out.decline[0];
129
+ expect(d.owner.exact?.simpleName).toBe('caller');
130
+ expect(d.owner.sharded).toBeNull();
131
+ expect(d.shardedEdge).toBeNull();
132
+ expect(d.shardedSameSite).toBeNull();
133
+ expect(d.exactSameSite?.to).toEqual(['TGT']);
134
+ });
135
+ });
136
+ //# sourceMappingURL=equivalence-diagnostic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equivalence-diagnostic.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/equivalence-diagnostic.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"equivalence-check-command.d.ts","sourceRoot":"","sources":["../../src/cli/equivalence-check-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAoBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAwFD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,uBAAuB,EAC7B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAgEf"}
1
+ {"version":3,"file":"equivalence-check-command.d.ts","sourceRoot":"","sources":["../../src/cli/equivalence-check-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAwBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAwFD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,uBAAuB,EAC7B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
@@ -31,9 +31,11 @@ import { dirname, resolve } from 'node:path';
31
31
  import { EXIT_CODES } from '@opensip-cli/contracts';
32
32
  import { logger } from '@opensip-cli/core';
33
33
  import { pickAdapter } from '../lang-adapter/registry.js';
34
+ import { buildEquivalenceDiagnostic } from './equivalence-diagnostic.js';
34
35
  import { resolveShardsForCwd } from './graph.js';
35
36
  import { buildEquivalenceReport, judgeEquivalence, } from './orchestrate/equivalence-check.js';
36
37
  import { runGraph, runShardedGraph } from './orchestrate.js';
38
+ import { readGraphEnv } from './pressure-monitor.js';
37
39
  const MODULE = 'graph:cli';
38
40
  /** Default committed budget path, relative to the target repo root. */
39
41
  const DEFAULT_BUDGET_REL = '.config/graph-equivalence-budget.json';
@@ -131,13 +133,27 @@ export async function executeEquivalenceCheck(opts, cli) {
131
133
  'The comparison requires a multi-package (shardable) repo so the sharded and ' +
132
134
  'exact engines actually diverge through real dist/*.d.ts resolution.');
133
135
  }
136
+ // Transparent passthrough wrappers: capture both catalogs ONLY to feed the
137
+ // optional GRAPH_EQUIV_DIAG dump. Behaviourally identical to passing the
138
+ // builders directly when the diagnostic is not requested.
139
+ let exactCatalog = null;
140
+ let shardedCatalog = null;
134
141
  const report = await buildEquivalenceReport({
135
142
  cwd,
136
143
  shards,
137
144
  cliScript,
138
- buildExact: buildExactCatalog,
139
- buildSharded: buildShardedCatalog,
145
+ buildExact: async (root) => {
146
+ const c = await buildExactCatalog(root);
147
+ exactCatalog = c;
148
+ return c;
149
+ },
150
+ buildSharded: async (input) => {
151
+ const c = await buildShardedCatalog(input);
152
+ shardedCatalog = c;
153
+ return c;
154
+ },
140
155
  });
156
+ maybeWriteEquivalenceDiagnostic(report, exactCatalog, shardedCatalog, shards);
141
157
  const seedMissing = opts.updateBudget === true && !existsSync(budgetPath);
142
158
  const budget = seedMissing
143
159
  ? {
@@ -172,6 +188,23 @@ export async function executeEquivalenceCheck(opts, cli) {
172
188
  cli.setExitCode(EXIT_CODES.RUNTIME_ERROR);
173
189
  }
174
190
  }
191
+ /**
192
+ * Write the structured equivalence diagnostic to the path named by the
193
+ * `GRAPH_EQUIV_DIAG` env var (read through the governed {@link GRAPH_ENV}
194
+ * registry), if set and both catalogs were captured. Inert otherwise. Effectful
195
+ * seam (env gate + file + stdout) — the analysis itself is the pure
196
+ * {@link buildEquivalenceDiagnostic}. Mirrors {@link writeBudget}'s direct file
197
+ * write; this is a host CI/diagnostic command, not a tool action body.
198
+ */
199
+ function maybeWriteEquivalenceDiagnostic(report, exact, sharded, shards) {
200
+ const outPath = readGraphEnv('GRAPH_EQUIV_DIAG');
201
+ if (outPath === undefined || outPath.length === 0 || exact === null || sharded === null)
202
+ return;
203
+ const diagnostic = buildEquivalenceDiagnostic({ report, exact, sharded, shards });
204
+ const payload = { generatedAt: new Date().toISOString(), ...diagnostic };
205
+ writeFileSync(outPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
206
+ process.stdout.write(`Wrote graph equivalence diagnostic to ${outPath}\n`);
207
+ }
175
208
  function logEnd(report, verdict, failed) {
176
209
  logger.info({
177
210
  evt: 'graph.cli.equivalence_check.complete',
@@ -1 +1 @@
1
- {"version":3,"file":"equivalence-check-command.js","sourceRoot":"","sources":["../../src/cli/equivalence-check-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"equivalence-check-command.js","sourceRoot":"","sources":["../../src/cli/equivalence-check-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Equivalence-divergence diagnostic builder (pure).
3
+ *
4
+ * When `graph-equivalence-check` reports production decline/phantom divergences,
5
+ * this turns each divergence into a fully-described record — owner occurrence,
6
+ * resolved target occurrences, and the actual call edge on BOTH engines (plus the
7
+ * same-call-site edge whatever its resolution) — so a maintainer can see exactly
8
+ * how exact and sharded disagreed at a call site, not just the bodyHash deltas.
9
+ *
10
+ * It is the structured form of the throwaway instrumentation that originally
11
+ * root-caused the 118-decline asymmetry (exact resolves workspace deps via
12
+ * symlinked `packages/X/dist`, sharded via pnpm's injected `.pnpm/...@file+...`).
13
+ * Keeping it as a maintained, env-gated artifact makes the NEXT equivalence
14
+ * regression debuggable in minutes instead of hours.
15
+ *
16
+ * This module is PURE — no `fs`, no `process`, no `Date`. The host command
17
+ * (`equivalence-check-command.ts`) owns the env gate + file/stdout effects, so
18
+ * the analysis is unit-testable in isolation.
19
+ */
20
+ import type { Catalog, CallEdge, FunctionOccurrence } from '../types.js';
21
+ import type { EdgeDifference } from './orchestrate/cross-shard-resolve.js';
22
+ /** Compact occurrence projection for the diagnostic JSON. */
23
+ export interface OccurrenceSummary {
24
+ readonly simpleName: string;
25
+ readonly qualifiedName: string;
26
+ readonly filePath: string;
27
+ readonly line: number;
28
+ readonly column: number;
29
+ readonly kind: FunctionOccurrence['kind'];
30
+ readonly visibility: FunctionOccurrence['visibility'];
31
+ readonly package: string | undefined;
32
+ }
33
+ /** Compact call-edge projection for the diagnostic JSON. */
34
+ export interface EdgeSummary {
35
+ readonly to: readonly string[];
36
+ readonly line: number;
37
+ readonly column: number;
38
+ readonly resolution: CallEdge['resolution'];
39
+ readonly confidence: CallEdge['confidence'];
40
+ readonly text: string;
41
+ readonly crossShard: boolean;
42
+ readonly discarded: boolean;
43
+ }
44
+ /** One resolved target bodyHash and every occurrence that shares it. */
45
+ export interface TargetSummary {
46
+ readonly hash: string;
47
+ readonly occurrences: readonly OccurrenceSummary[];
48
+ }
49
+ /** A single divergence, described symmetrically across both engines. */
50
+ export interface DiffDiagnostic {
51
+ readonly owner: {
52
+ readonly hash: string;
53
+ readonly filePath: string;
54
+ readonly line: number;
55
+ readonly column: number;
56
+ readonly exact: OccurrenceSummary | null;
57
+ readonly sharded: OccurrenceSummary | null;
58
+ };
59
+ readonly exactTo: readonly TargetSummary[];
60
+ readonly shardedTo: readonly TargetSummary[];
61
+ /** The edge whose target set exactly matches this divergence's recorded `to`. */
62
+ readonly exactEdge: EdgeSummary | null;
63
+ readonly shardedEdge: EdgeSummary | null;
64
+ /** The edge at the same call site regardless of its resolved target set. */
65
+ readonly exactSameSite: EdgeSummary | null;
66
+ readonly shardedSameSite: EdgeSummary | null;
67
+ }
68
+ export interface EquivalenceDiagnostic {
69
+ readonly counts: {
70
+ readonly productionDecline: number;
71
+ readonly productionPhantom: number;
72
+ };
73
+ readonly shards: readonly {
74
+ readonly id: string;
75
+ readonly rootDir: string;
76
+ readonly fileCount: number;
77
+ }[];
78
+ /** Histogram: `<resolution>:<crossShard>` of the exact edge for each decline. */
79
+ readonly declineByExactResolution: Record<string, number>;
80
+ /** Histogram: `<resolution>:<crossShard>` of the sharded edge for each phantom. */
81
+ readonly phantomByShardedResolution: Record<string, number>;
82
+ readonly decline: readonly DiffDiagnostic[];
83
+ readonly phantom: readonly DiffDiagnostic[];
84
+ }
85
+ export interface BuildEquivalenceDiagnosticInput {
86
+ readonly report: {
87
+ readonly productionDecline: readonly EdgeDifference[];
88
+ readonly productionPhantom: readonly EdgeDifference[];
89
+ };
90
+ readonly exact: Catalog;
91
+ readonly sharded: Catalog;
92
+ readonly shards: readonly {
93
+ readonly id: string;
94
+ readonly rootDir: string;
95
+ readonly files: readonly string[];
96
+ }[];
97
+ }
98
+ /** Build the structured equivalence diagnostic. Pure: no I/O, no clock. */
99
+ export declare function buildEquivalenceDiagnostic(input: BuildEquivalenceDiagnosticInput): EquivalenceDiagnostic;
100
+ //# sourceMappingURL=equivalence-diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equivalence-diagnostic.d.ts","sourceRoot":"","sources":["../../src/cli/equivalence-diagnostic.ts"],"names":[],"mappings":"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"}