@opensip-cli/graph 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/__tests__/baseline-plane.test.js +8 -3
- package/dist/__tests__/baseline-plane.test.js.map +1 -1
- package/dist/__tests__/cache/engine-version.test.js +4 -4
- package/dist/__tests__/cache/engine-version.test.js.map +1 -1
- package/dist/__tests__/cli/graph-execute.test.js +25 -12
- package/dist/__tests__/cli/graph-execute.test.js.map +1 -1
- package/dist/__tests__/cli/graph.test.js +36 -21
- package/dist/__tests__/cli/graph.test.js.map +1 -1
- package/dist/__tests__/cli/language-mismatch.test.js +7 -2
- package/dist/__tests__/cli/language-mismatch.test.js.map +1 -1
- package/dist/__tests__/cli/lookup.test.js +32 -29
- package/dist/__tests__/cli/lookup.test.js.map +1 -1
- package/dist/__tests__/cli/session-contract.test.js +5 -1
- package/dist/__tests__/cli/session-contract.test.js.map +1 -1
- package/dist/__tests__/cli/symbol-index.test.js +9 -2
- package/dist/__tests__/cli/symbol-index.test.js.map +1 -1
- package/dist/__tests__/cli/tool-show-mode.test.js +7 -1
- package/dist/__tests__/cli/tool-show-mode.test.js.map +1 -1
- package/dist/__tests__/public-api.test.js +10 -0
- package/dist/__tests__/public-api.test.js.map +1 -1
- package/dist/__tests__/report-failure-mock.d.ts +8 -0
- package/dist/__tests__/report-failure-mock.d.ts.map +1 -0
- package/dist/__tests__/report-failure-mock.js +19 -0
- package/dist/__tests__/report-failure-mock.js.map +1 -0
- package/dist/__tests__/rules/registry.test.js +1 -0
- package/dist/__tests__/rules/registry.test.js.map +1 -1
- package/dist/__tests__/tool-branches.test.js +9 -2
- package/dist/__tests__/tool-branches.test.js.map +1 -1
- package/dist/__tests__/tool-register.test.js +26 -15
- package/dist/__tests__/tool-register.test.js.map +1 -1
- package/dist/baseline-strategy.d.ts +1 -2
- package/dist/baseline-strategy.d.ts.map +1 -1
- package/dist/baseline-strategy.js +6 -1
- package/dist/baseline-strategy.js.map +1 -1
- package/dist/cache/engine-version.d.ts.map +1 -1
- package/dist/cache/engine-version.js +5 -1
- package/dist/cache/engine-version.js.map +1 -1
- package/dist/cli/__tests__/dispatch-envelope.test.js +5 -1
- package/dist/cli/__tests__/dispatch-envelope.test.js.map +1 -1
- package/dist/cli/__tests__/dispatch-suppression-root.test.js +1 -0
- package/dist/cli/__tests__/dispatch-suppression-root.test.js.map +1 -1
- package/dist/cli/__tests__/equivalence-diagnostic.test.d.ts +7 -0
- package/dist/cli/__tests__/equivalence-diagnostic.test.d.ts.map +1 -0
- package/dist/cli/__tests__/equivalence-diagnostic.test.js +136 -0
- package/dist/cli/__tests__/equivalence-diagnostic.test.js.map +1 -0
- package/dist/cli/__tests__/graph-gate-mode.test.js +6 -0
- package/dist/cli/__tests__/graph-gate-mode.test.js.map +1 -1
- package/dist/cli/__tests__/graph-recipes.test.js +2 -2
- package/dist/cli/__tests__/graph-recipes.test.js.map +1 -1
- package/dist/cli/__tests__/list-files.test.js +45 -12
- package/dist/cli/__tests__/list-files.test.js.map +1 -1
- package/dist/cli/__tests__/live-suppression-parity.test.js +5 -1
- package/dist/cli/__tests__/live-suppression-parity.test.js.map +1 -1
- package/dist/cli/__tests__/lookup-result.test.d.ts +2 -0
- package/dist/cli/__tests__/lookup-result.test.d.ts.map +1 -0
- package/dist/cli/__tests__/lookup-result.test.js +119 -0
- package/dist/cli/__tests__/lookup-result.test.js.map +1 -0
- package/dist/cli/__tests__/shard-worker.test.js +2 -0
- package/dist/cli/__tests__/shard-worker.test.js.map +1 -1
- package/dist/cli/detect.d.ts.map +1 -1
- package/dist/cli/detect.js +4 -3
- package/dist/cli/detect.js.map +1 -1
- package/dist/cli/equivalence-check-command.d.ts.map +1 -1
- package/dist/cli/equivalence-check-command.js +64 -9
- package/dist/cli/equivalence-check-command.js.map +1 -1
- package/dist/cli/equivalence-diagnostic.d.ts +100 -0
- package/dist/cli/equivalence-diagnostic.d.ts.map +1 -0
- package/dist/cli/equivalence-diagnostic.js +138 -0
- package/dist/cli/equivalence-diagnostic.js.map +1 -0
- package/dist/cli/graph/graph-aux-command-specs.d.ts +2 -2
- package/dist/cli/graph/graph-aux-command-specs.d.ts.map +1 -1
- package/dist/cli/graph/graph-aux-command-specs.js +85 -51
- package/dist/cli/graph/graph-aux-command-specs.js.map +1 -1
- package/dist/cli/graph/graph-command-spec.d.ts.map +1 -1
- package/dist/cli/graph/graph-command-spec.js +3 -0
- package/dist/cli/graph/graph-command-spec.js.map +1 -1
- package/dist/cli/graph-config-schema.d.ts +3 -0
- package/dist/cli/graph-config-schema.d.ts.map +1 -1
- package/dist/cli/graph-config-schema.js +11 -0
- package/dist/cli/graph-config-schema.js.map +1 -1
- package/dist/cli/graph-config.d.ts.map +1 -1
- package/dist/cli/graph-config.js +9 -12
- package/dist/cli/graph-config.js.map +1 -1
- package/dist/cli/graph-envelope-view.d.ts.map +1 -1
- package/dist/cli/graph-envelope-view.js +1 -0
- package/dist/cli/graph-envelope-view.js.map +1 -1
- package/dist/cli/graph-modes.d.ts +5 -4
- package/dist/cli/graph-modes.d.ts.map +1 -1
- package/dist/cli/graph-modes.js +15 -18
- package/dist/cli/graph-modes.js.map +1 -1
- package/dist/cli/graph-recipes.d.ts.map +1 -1
- package/dist/cli/graph-recipes.js +12 -5
- package/dist/cli/graph-recipes.js.map +1 -1
- package/dist/cli/graph-result-delivery.d.ts.map +1 -1
- package/dist/cli/graph-result-delivery.js +11 -10
- package/dist/cli/graph-result-delivery.js.map +1 -1
- package/dist/cli/graph-single-run-mode.d.ts.map +1 -1
- package/dist/cli/graph-single-run-mode.js +3 -2
- package/dist/cli/graph-single-run-mode.js.map +1 -1
- package/dist/cli/graph-worker.d.ts.map +1 -1
- package/dist/cli/graph-worker.js +9 -2
- package/dist/cli/graph-worker.js.map +1 -1
- package/dist/cli/graph-workspace-mode.d.ts.map +1 -1
- package/dist/cli/graph-workspace-mode.js +3 -2
- package/dist/cli/graph-workspace-mode.js.map +1 -1
- package/dist/cli/graph.d.ts +2 -2
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +26 -28
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/heap-preflight.d.ts.map +1 -1
- package/dist/cli/heap-preflight.js +6 -5
- package/dist/cli/heap-preflight.js.map +1 -1
- package/dist/cli/list-files.d.ts.map +1 -1
- package/dist/cli/list-files.js +9 -4
- package/dist/cli/list-files.js.map +1 -1
- package/dist/cli/lookup-result.d.ts +4 -0
- package/dist/cli/lookup-result.d.ts.map +1 -0
- package/dist/cli/lookup-result.js +44 -0
- package/dist/cli/lookup-result.js.map +1 -0
- package/dist/cli/lookup.d.ts +12 -1
- package/dist/cli/lookup.d.ts.map +1 -1
- package/dist/cli/lookup.js +31 -30
- package/dist/cli/lookup.js.map +1 -1
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js +76 -0
- package/dist/cli/orchestrate/__tests__/cross-shard-resolve.test.js.map +1 -1
- package/dist/cli/orchestrate/catalog-stats.d.ts.map +1 -1
- package/dist/cli/orchestrate/catalog-stats.js +0 -1
- package/dist/cli/orchestrate/catalog-stats.js.map +1 -1
- package/dist/cli/orchestrate/cross-shard-resolve.d.ts.map +1 -1
- package/dist/cli/orchestrate/cross-shard-resolve.js +77 -2
- package/dist/cli/orchestrate/cross-shard-resolve.js.map +1 -1
- package/dist/cli/orchestrate/flat-monorepo-strategy.d.ts.map +1 -1
- package/dist/cli/orchestrate/flat-monorepo-strategy.js +0 -1
- package/dist/cli/orchestrate/flat-monorepo-strategy.js.map +1 -1
- package/dist/cli/orchestrate/incremental-merge.d.ts.map +1 -1
- package/dist/cli/orchestrate/incremental-merge.js +3 -2
- package/dist/cli/orchestrate/incremental-merge.js.map +1 -1
- package/dist/cli/positional-paths.d.ts.map +1 -1
- package/dist/cli/positional-paths.js +3 -2
- package/dist/cli/positional-paths.js.map +1 -1
- package/dist/cli/pressure-monitor.d.ts +2 -0
- package/dist/cli/pressure-monitor.d.ts.map +1 -1
- package/dist/cli/pressure-monitor.js +15 -0
- package/dist/cli/pressure-monitor.js.map +1 -1
- package/dist/cli/report-data.d.ts.map +1 -1
- package/dist/cli/report-data.js +0 -1
- package/dist/cli/report-data.js.map +1 -1
- package/dist/cli/sarif-export.d.ts.map +1 -1
- package/dist/cli/sarif-export.js +4 -3
- package/dist/cli/sarif-export.js.map +1 -1
- package/dist/cli/symbol-index.d.ts.map +1 -1
- package/dist/cli/symbol-index.js +15 -14
- package/dist/cli/symbol-index.js.map +1 -1
- package/dist/cli/workspace-runner.d.ts.map +1 -1
- package/dist/cli/workspace-runner.js +5 -4
- package/dist/cli/workspace-runner.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lang-adapter/__tests__/language-of-file.test.d.ts +2 -0
- package/dist/lang-adapter/__tests__/language-of-file.test.d.ts.map +1 -0
- package/dist/lang-adapter/__tests__/language-of-file.test.js +36 -0
- package/dist/lang-adapter/__tests__/language-of-file.test.js.map +1 -0
- package/dist/lang-adapter/__tests__/near-duplicate-signature.test.d.ts +2 -0
- package/dist/lang-adapter/__tests__/near-duplicate-signature.test.d.ts.map +1 -0
- package/dist/lang-adapter/__tests__/near-duplicate-signature.test.js +78 -0
- package/dist/lang-adapter/__tests__/near-duplicate-signature.test.js.map +1 -0
- package/dist/lang-adapter/body-digest.d.ts +9 -41
- package/dist/lang-adapter/body-digest.d.ts.map +1 -1
- package/dist/lang-adapter/body-digest.js +9 -44
- package/dist/lang-adapter/body-digest.js.map +1 -1
- package/dist/lang-adapter/language-of-file.d.ts +15 -0
- package/dist/lang-adapter/language-of-file.d.ts.map +1 -0
- package/dist/lang-adapter/language-of-file.js +43 -0
- package/dist/lang-adapter/language-of-file.js.map +1 -0
- package/dist/lang-adapter/near-duplicate-signature.d.ts +12 -0
- package/dist/lang-adapter/near-duplicate-signature.d.ts.map +1 -0
- package/dist/lang-adapter/near-duplicate-signature.js +12 -0
- package/dist/lang-adapter/near-duplicate-signature.js.map +1 -0
- package/dist/lang-adapter/read-source.d.ts.map +1 -1
- package/dist/lang-adapter/read-source.js +0 -1
- package/dist/lang-adapter/read-source.js.map +1 -1
- package/dist/lang-adapter/registry.d.ts.map +1 -1
- package/dist/lang-adapter/registry.js +0 -1
- package/dist/lang-adapter/registry.js.map +1 -1
- package/dist/persistence/catalog-repo.d.ts.map +1 -1
- package/dist/persistence/catalog-repo.js +88 -81
- package/dist/persistence/catalog-repo.js.map +1 -1
- package/dist/persistence/session-payload.d.ts.map +1 -1
- package/dist/persistence/session-payload.js +0 -1
- package/dist/persistence/session-payload.js.map +1 -1
- package/dist/persistence/session-replay.d.ts.map +1 -1
- package/dist/persistence/session-replay.js +15 -25
- package/dist/persistence/session-replay.js.map +1 -1
- package/dist/pipeline/feature-deps.d.ts.map +1 -1
- package/dist/pipeline/feature-deps.js +0 -1
- package/dist/pipeline/feature-deps.js.map +1 -1
- package/dist/pipeline/features.d.ts.map +1 -1
- package/dist/pipeline/features.js +0 -1
- package/dist/pipeline/features.js.map +1 -1
- package/dist/pipeline/indexes.d.ts.map +1 -1
- package/dist/pipeline/indexes.js +0 -1
- package/dist/pipeline/indexes.js.map +1 -1
- package/dist/recipes/__tests__/resolve.test.js +7 -0
- package/dist/recipes/__tests__/resolve.test.js.map +1 -1
- package/dist/render/rule-id-mapping.d.ts.map +1 -1
- package/dist/render/rule-id-mapping.js +1 -0
- package/dist/render/rule-id-mapping.js.map +1 -1
- package/dist/rules/__tests__/fingerprint-golden.test.js +1 -1
- package/dist/rules/__tests__/fingerprint-golden.test.js.map +1 -1
- package/dist/rules/__tests__/near-duplicate-function-body.test.d.ts +2 -0
- package/dist/rules/__tests__/near-duplicate-function-body.test.d.ts.map +1 -0
- package/dist/rules/__tests__/near-duplicate-function-body.test.js +142 -0
- package/dist/rules/__tests__/near-duplicate-function-body.test.js.map +1 -0
- package/dist/rules/_entry-points.d.ts.map +1 -1
- package/dist/rules/_entry-points.js +0 -1
- package/dist/rules/_entry-points.js.map +1 -1
- package/dist/rules/duplicated-function-body.d.ts +12 -34
- package/dist/rules/duplicated-function-body.d.ts.map +1 -1
- package/dist/rules/duplicated-function-body.js +83 -233
- package/dist/rules/duplicated-function-body.js.map +1 -1
- package/dist/rules/near-duplicate-function-body.d.ts +11 -0
- package/dist/rules/near-duplicate-function-body.d.ts.map +1 -0
- package/dist/rules/near-duplicate-function-body.js +74 -0
- package/dist/rules/near-duplicate-function-body.js.map +1 -0
- package/dist/rules/registry.d.ts.map +1 -1
- package/dist/rules/registry.js +2 -1
- package/dist/rules/registry.js.map +1 -1
- package/dist/tool.d.ts.map +1 -1
- package/dist/tool.js +3 -1
- package/dist/tool.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +15 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-index.d.ts","sourceRoot":"","sources":["../../src/cli/symbol-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"symbol-index.d.ts","sourceRoot":"","sources":["../../src/cli/symbol-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAWH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;CACzD;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAgBnE"}
|
package/dist/cli/symbol-index.js
CHANGED
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
* Bidirectional like codeindex (name→file and file→names), but enriched
|
|
24
24
|
* with kind/visibility/bodyHash since we already have that data.
|
|
25
25
|
*/
|
|
26
|
-
import {
|
|
27
|
-
import { dirname, resolve } from 'node:path';
|
|
26
|
+
import { resolve } from 'node:path';
|
|
28
27
|
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
29
|
-
import { ConfigurationError,
|
|
28
|
+
import { createToolLogger, ConfigurationError, ToolError } from '@opensip-cli/core';
|
|
30
29
|
import { CatalogRepo } from '../persistence/catalog-repo.js';
|
|
31
30
|
import { loadGraphConfig, runGraph } from './orchestrate.js';
|
|
31
|
+
const log = createToolLogger('graph:cli');
|
|
32
32
|
export async function executeSymbolIndex(opts, cli) {
|
|
33
|
-
|
|
33
|
+
log.info({
|
|
34
34
|
evt: 'graph.cli.symbol-index.start',
|
|
35
35
|
module: 'graph:cli',
|
|
36
36
|
build: opts.build === true,
|
|
@@ -48,16 +48,12 @@ export async function executeSymbolIndex(opts, cli) {
|
|
|
48
48
|
}
|
|
49
49
|
const artifact = buildArtifact(catalog);
|
|
50
50
|
const outPath = resolve(opts.cwd, opts.out);
|
|
51
|
-
|
|
52
|
-
// (e.g. reports/symbolindex.json) doesn't throw ENOENT — matches
|
|
53
|
-
// the sibling writers (sarif-export, baseline-export, catalog-json).
|
|
54
|
-
mkdirSync(dirname(outPath), { recursive: true });
|
|
55
|
-
writeFileSync(outPath, `${JSON.stringify(artifact, null, 2)}\n`, 'utf8');
|
|
51
|
+
await cli.writeArtifact(outPath, `${JSON.stringify(artifact, null, 2)}\n`);
|
|
56
52
|
const symbolCount = Object.values(artifact.symbols).reduce((n, arr) => n + arr.length, 0);
|
|
57
53
|
const fileCount = Object.keys(artifact.fileSymbols).length;
|
|
58
54
|
process.stdout.write(`wrote ${String(symbolCount)} symbol(s) across ${String(fileCount)} file(s) to ${outPath}\n`);
|
|
59
55
|
cli.setExitCode(EXIT_CODES.SUCCESS);
|
|
60
|
-
|
|
56
|
+
log.info({
|
|
61
57
|
evt: 'graph.cli.symbol-index.complete',
|
|
62
58
|
module: 'graph:cli',
|
|
63
59
|
symbols: symbolCount,
|
|
@@ -65,15 +61,20 @@ export async function executeSymbolIndex(opts, cli) {
|
|
|
65
61
|
});
|
|
66
62
|
}
|
|
67
63
|
catch (error) {
|
|
68
|
-
|
|
64
|
+
log.error({
|
|
69
65
|
evt: 'graph.cli.symbol-index.error',
|
|
70
66
|
module: 'graph:cli',
|
|
71
67
|
err: error instanceof Error ? error.message : String(error),
|
|
72
68
|
});
|
|
73
|
-
|
|
69
|
+
const exitCode = error instanceof ConfigurationError
|
|
74
70
|
? EXIT_CODES.CONFIGURATION_ERROR
|
|
75
|
-
: EXIT_CODES.RUNTIME_ERROR
|
|
76
|
-
|
|
71
|
+
: EXIT_CODES.RUNTIME_ERROR;
|
|
72
|
+
await cli.reportFailure({
|
|
73
|
+
message: `graph symbol-index: ${error instanceof Error ? error.message : String(error)}`,
|
|
74
|
+
exitCode,
|
|
75
|
+
...(error instanceof ToolError ? { error } : {}),
|
|
76
|
+
jsonRequested: false,
|
|
77
|
+
});
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
async function resolveCatalogForIndex(opts, datastore) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-index.js","sourceRoot":"","sources":["../../src/cli/symbol-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"symbol-index.js","sourceRoot":"","sources":["../../src/cli/symbol-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-runner.d.ts","sourceRoot":"","sources":["../../src/cli/workspace-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-runner.d.ts","sourceRoot":"","sources":["../../src/cli/workspace-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,eAAe,EAAE,GACnC,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CASnC;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CA0ClC"}
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
import { spawn } from 'node:child_process';
|
|
18
18
|
import { cpus } from 'node:os';
|
|
19
19
|
import { relative } from 'node:path';
|
|
20
|
-
import {
|
|
20
|
+
import { createToolLogger, ConfigurationError, } from '@opensip-cli/core';
|
|
21
|
+
const log = createToolLogger('graph:cli');
|
|
21
22
|
import { runWorkerPool } from './orchestrate/worker-pool.js';
|
|
22
23
|
/**
|
|
23
24
|
* Aggregate WorkspaceUnits across all adapters that implement the
|
|
@@ -49,7 +50,7 @@ export async function runWorkspaceUnitsInParallel(input) {
|
|
|
49
50
|
throw new ConfigurationError('--workspace: no workspace units found. Use `opensip graph` for whole-project analysis.');
|
|
50
51
|
}
|
|
51
52
|
const concurrency = Math.max(1, input.concurrency ?? Math.max(1, cpus().length - 1));
|
|
52
|
-
|
|
53
|
+
log.info({
|
|
53
54
|
evt: 'graph.cli.workspace.start',
|
|
54
55
|
module: 'graph:cli',
|
|
55
56
|
units: input.units.length,
|
|
@@ -70,7 +71,7 @@ export async function runWorkspaceUnitsInParallel(input) {
|
|
|
70
71
|
// Sort for deterministic display order regardless of completion
|
|
71
72
|
// order — units finish in unpredictable order under parallelism.
|
|
72
73
|
results.sort((a, b) => a.rootDir.localeCompare(b.rootDir));
|
|
73
|
-
|
|
74
|
+
log.info({
|
|
74
75
|
evt: 'graph.cli.workspace.complete',
|
|
75
76
|
module: 'graph:cli',
|
|
76
77
|
units: input.units.length,
|
|
@@ -150,7 +151,7 @@ function parseChildSignals(stdout, rootDir, stderr) {
|
|
|
150
151
|
}
|
|
151
152
|
catch (error) {
|
|
152
153
|
/* v8 ignore start */
|
|
153
|
-
|
|
154
|
+
log.warn({
|
|
154
155
|
evt: 'graph.cli.workspace.parse-error',
|
|
155
156
|
module: 'graph:cli',
|
|
156
157
|
rootDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-runner.js","sourceRoot":"","sources":["../../src/cli/workspace-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"workspace-runner.js","sourceRoot":"","sources":["../../src/cli/workspace-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,10 @@ export { truncateForCallEdge, CALL_EDGE_TEXT_MAX, CREATION_EDGE_PREFIX, CREATION
|
|
|
20
20
|
export type { EdgePosition, EdgeSink, MutableStats } from './lang-adapter/edge-helpers.js';
|
|
21
21
|
export { normalizeWhitespace, hashBody } from './lang-adapter/body-digest.js';
|
|
22
22
|
export type { BodyDigest } from './lang-adapter/body-digest.js';
|
|
23
|
+
export { NEAR_DUP_SIGNATURE_K, NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS, shingle, bodySignature, estimateJaccard, lshBandHashes, digestCanonicalBody, } from './lang-adapter/near-duplicate-signature.js';
|
|
24
|
+
export type { BodyDigestWithSignature } from './lang-adapter/near-duplicate-signature.js';
|
|
25
|
+
export { languageOfFile } from './lang-adapter/language-of-file.js';
|
|
26
|
+
export { isTestFilePath } from '@opensip-cli/clone-detection';
|
|
23
27
|
export { ownerEdgeKey } from './owner-key.js';
|
|
24
28
|
export { buildExportIndex, buildPackageManifestIndex, buildPackageManifestIndexFromRoots, resolveSpecifierToPackage, } from './cross-package/export-index.js';
|
|
25
29
|
export type { ExportIndex, PackageManifest, PackageManifestIndex, ResolvedSpecifier, } from './cross-package/export-index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,yBAAyB,CAAC;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAgB5D,YAAY,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAS,EACT,eAAe,EACf,eAAe,EACf,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AA0BpB,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAMlE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AASxC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAS3F,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9E,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -35,6 +35,11 @@ export { truncateForCallEdge, CALL_EDGE_TEXT_MAX, CREATION_EDGE_PREFIX, CREATION
|
|
|
35
35
|
// only its language-specific comment stripper / normalizer (round-3
|
|
36
36
|
// audit 2026-05-30, finding D). Mirrors the edge-helpers rationale.
|
|
37
37
|
export { normalizeWhitespace, hashBody } from './lang-adapter/body-digest.js';
|
|
38
|
+
export { NEAR_DUP_SIGNATURE_K, NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS, shingle, bodySignature, estimateJaccard, lshBandHashes, digestCanonicalBody, } from './lang-adapter/near-duplicate-signature.js';
|
|
39
|
+
export { languageOfFile } from './lang-adapter/language-of-file.js';
|
|
40
|
+
// Canonical TS/JS test-file predicate, single-sourced in the shared substrate (ADR-0064,
|
|
41
|
+
// D1). Re-exported so graph-typescript reaches it via the engine barrel (no new dep).
|
|
42
|
+
export { isTestFilePath } from '@opensip-cli/clone-detection';
|
|
38
43
|
// PR 3 of plan 2026-05-23-plan-graph-adapter-package-split.md:
|
|
39
44
|
// first-party adapters live in their own graph-* packages, so the
|
|
40
45
|
// engine no longer re-exports any adapter, parsed-project type, or
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iEAAiE;AACjE,kEAAkE;AAClE,wBAAwB;AACxB,OAAO,yBAAyB,CAAC;AAGjC,mEAAmE;AACnE,qEAAqE;AACrE,6DAA6D;AAC7D,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,oEAAoE;AACpE,6EAA6E;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAsF5D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,0BAA0B;AAC1B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAWxC,qEAAqE;AACrE,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,wEAAwE;AACxE,oEAAoE;AACpE,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,iEAAiE;AACjE,kEAAkE;AAClE,wBAAwB;AACxB,OAAO,yBAAyB,CAAC;AAGjC,mEAAmE;AACnE,qEAAqE;AACrE,6DAA6D;AAC7D,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,oEAAoE;AACpE,6EAA6E;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAsF5D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,2EAA2E;AAC3E,0BAA0B;AAC1B,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAWxC,qEAAqE;AACrE,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,wEAAwE;AACxE,oEAAoE;AACpE,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,eAAe,EACf,aAAa,EACb,mBAAmB,GACpB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,yFAAyF;AACzF,sFAAsF;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,+DAA+D;AAC/D,kEAAkE;AAClE,mEAAmE;AACnE,qEAAqE;AACrE,gBAAgB;AAEhB,4EAA4E;AAC5E,gFAAgF;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,sEAAsE;AACtE,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,sEAAsE;AACtE,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,wEAAwE;AACxE,0EAA0E;AAC1E,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,kCAAkC,EAClC,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;AAOzC,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEnF,6EAA6E;AAC7E,qEAAqE;AACrE,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,sEAAsE;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-of-file.test.d.ts","sourceRoot":"","sources":["../../../src/lang-adapter/__tests__/language-of-file.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { languageOfFile } from '../language-of-file.js';
|
|
3
|
+
describe('languageOfFile', () => {
|
|
4
|
+
it('maps TypeScript extensions', () => {
|
|
5
|
+
expect(languageOfFile('src/a.ts')).toBe('typescript');
|
|
6
|
+
expect(languageOfFile('src/a.tsx')).toBe('typescript');
|
|
7
|
+
expect(languageOfFile('src/a.mts')).toBe('typescript');
|
|
8
|
+
expect(languageOfFile('src/a.cts')).toBe('typescript');
|
|
9
|
+
});
|
|
10
|
+
it('maps JavaScript extensions to typescript (same adapter; .ts↔.js clones are real)', () => {
|
|
11
|
+
expect(languageOfFile('src/a.js')).toBe('typescript');
|
|
12
|
+
expect(languageOfFile('src/a.jsx')).toBe('typescript');
|
|
13
|
+
expect(languageOfFile('src/a.mjs')).toBe('typescript');
|
|
14
|
+
expect(languageOfFile('src/a.cjs')).toBe('typescript');
|
|
15
|
+
// A .ts and a .js file are the same language → clones between them are detected.
|
|
16
|
+
expect(languageOfFile('a.ts')).toBe(languageOfFile('b.js'));
|
|
17
|
+
});
|
|
18
|
+
it('maps Python extensions without truncating .pyi', () => {
|
|
19
|
+
expect(languageOfFile('mod.py')).toBe('python');
|
|
20
|
+
expect(languageOfFile('stub.pyi')).toBe('python');
|
|
21
|
+
});
|
|
22
|
+
it('maps Go, Java, and Rust', () => {
|
|
23
|
+
expect(languageOfFile('main.go')).toBe('go');
|
|
24
|
+
expect(languageOfFile('App.java')).toBe('java');
|
|
25
|
+
expect(languageOfFile('lib.rs')).toBe('rust');
|
|
26
|
+
});
|
|
27
|
+
it('returns undefined for unknown extensions', () => {
|
|
28
|
+
expect(languageOfFile('readme.md')).toBeUndefined();
|
|
29
|
+
expect(languageOfFile('noext')).toBeUndefined();
|
|
30
|
+
});
|
|
31
|
+
it('two files share a language iff languageOfFile is equal', () => {
|
|
32
|
+
expect(languageOfFile('a.ts')).toBe(languageOfFile('b.tsx'));
|
|
33
|
+
expect(languageOfFile('a.go')).not.toBe(languageOfFile('b.ts'));
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=language-of-file.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-of-file.test.js","sourceRoot":"","sources":["../../../src/lang-adapter/__tests__/language-of-file.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,iFAAiF;QACjF,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-duplicate-signature.test.d.ts","sourceRoot":"","sources":["../../../src/lang-adapter/__tests__/near-duplicate-signature.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS, NEAR_DUP_SIGNATURE_K, bodySignature, digestCanonicalBody, estimateJaccard, lshBandHashes, shingle, } from '../near-duplicate-signature.js';
|
|
3
|
+
describe('near-duplicate-signature', () => {
|
|
4
|
+
const base = 'function processItems(items) { const out = []; for (const item of items) { out.push(transform(item)); } return out; }';
|
|
5
|
+
const nearEdit = 'function processItems(items) { const result = []; for (const item of items) { result.push(transform(item)); } return result; }';
|
|
6
|
+
const unrelated = 'export function validateConfig(cfg) { if (!cfg.apiKey) throw new Error("missing"); return cfg; }';
|
|
7
|
+
it('identical canonical text yields Jaccard 1.0', () => {
|
|
8
|
+
const a = bodySignature(base);
|
|
9
|
+
const b = bodySignature(base);
|
|
10
|
+
expect(estimateJaccard(a, b)).toBe(1);
|
|
11
|
+
});
|
|
12
|
+
it('one-token edit yields high but sub-1.0 Jaccard', () => {
|
|
13
|
+
const j = estimateJaccard(bodySignature(base), bodySignature(nearEdit));
|
|
14
|
+
expect(j).toBeGreaterThan(0.5);
|
|
15
|
+
expect(j).toBeLessThan(1);
|
|
16
|
+
});
|
|
17
|
+
it('unrelated bodies yield low Jaccard', () => {
|
|
18
|
+
expect(estimateJaccard(bodySignature(base), bodySignature(unrelated))).toBeLessThan(0.5);
|
|
19
|
+
});
|
|
20
|
+
it('signatures are stable across runs', () => {
|
|
21
|
+
expect(bodySignature(base)).toEqual(bodySignature(base));
|
|
22
|
+
});
|
|
23
|
+
it('bands × rows equals k', () => {
|
|
24
|
+
expect(NEAR_DUP_LSH_BANDS * NEAR_DUP_LSH_ROWS).toBe(NEAR_DUP_SIGNATURE_K);
|
|
25
|
+
});
|
|
26
|
+
it('LSH knee is near the 0.85 threshold', () => {
|
|
27
|
+
const knee = (1 / NEAR_DUP_LSH_BANDS) ** (1 / NEAR_DUP_LSH_ROWS);
|
|
28
|
+
expect(knee).toBeCloseTo(0.878, 2);
|
|
29
|
+
});
|
|
30
|
+
it('shingle emits char 5-grams', () => {
|
|
31
|
+
expect(shingle('abcdef').size).toBe(2);
|
|
32
|
+
expect(shingle('ab').size).toBe(1);
|
|
33
|
+
expect(shingle('').size).toBe(0);
|
|
34
|
+
});
|
|
35
|
+
it('digestCanonicalBody returns hash, size, and signature', () => {
|
|
36
|
+
const d = digestCanonicalBody(base);
|
|
37
|
+
expect(d.hash).toMatch(/^[a-f0-9]{64}$/);
|
|
38
|
+
expect(d.size).toBeGreaterThan(0);
|
|
39
|
+
expect(d.signature?.length).toBe(NEAR_DUP_SIGNATURE_K);
|
|
40
|
+
});
|
|
41
|
+
it('lshBandHashes returns one hash per band', () => {
|
|
42
|
+
const sig = bodySignature(base);
|
|
43
|
+
expect(lshBandHashes(sig, NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS).length).toBe(NEAR_DUP_LSH_BANDS);
|
|
44
|
+
});
|
|
45
|
+
it('bodySignature returns empty for empty canonical (no shingles)', () => {
|
|
46
|
+
expect(bodySignature('')).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
it('bodySignature with custom k derives k seeds and returns k values', () => {
|
|
49
|
+
const sig = bodySignature(base, 32);
|
|
50
|
+
expect(sig.length).toBe(32);
|
|
51
|
+
// Custom-k path is deterministic and stable across calls.
|
|
52
|
+
expect(bodySignature(base, 32)).toEqual(sig);
|
|
53
|
+
// Identical body still self-matches under a custom k.
|
|
54
|
+
expect(estimateJaccard(sig, bodySignature(base, 32))).toBe(1);
|
|
55
|
+
});
|
|
56
|
+
it('bodySignature produces a full-width signature for sub-gram bodies', () => {
|
|
57
|
+
// Body shorter than the gram size yields a single whole-string shingle,
|
|
58
|
+
// exercising the single-base MinHash loop across all k positions.
|
|
59
|
+
const short = bodySignature('ab');
|
|
60
|
+
expect(short.length).toBe(NEAR_DUP_SIGNATURE_K);
|
|
61
|
+
expect(short.every((v) => Number.isInteger(v))).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('estimateJaccard returns 0 when either signature is empty', () => {
|
|
64
|
+
const sig = bodySignature(base);
|
|
65
|
+
expect(estimateJaccard([], sig)).toBe(0);
|
|
66
|
+
expect(estimateJaccard(sig, [])).toBe(0);
|
|
67
|
+
expect(estimateJaccard([], [])).toBe(0);
|
|
68
|
+
});
|
|
69
|
+
it('estimateJaccard returns 0 for mismatched signature lengths', () => {
|
|
70
|
+
expect(estimateJaccard(bodySignature(base), bodySignature(base, 32))).toBe(0);
|
|
71
|
+
});
|
|
72
|
+
it('digestCanonicalBody omits signature for empty canonical', () => {
|
|
73
|
+
const d = digestCanonicalBody('');
|
|
74
|
+
expect(d.hash).toMatch(/^[a-f0-9]{64}$/);
|
|
75
|
+
expect(d.signature).toBeUndefined();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=near-duplicate-signature.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-duplicate-signature.test.js","sourceRoot":"","sources":["../../../src/lang-adapter/__tests__/near-duplicate-signature.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Body-digest primitives — relocated to `@opensip-cli/clone-detection`.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* in all four tree-sitter packs). Per the round-3 modular-monolith audit
|
|
10
|
-
* (2026-05-30, finding D) it lives here on the contract layer instead of
|
|
11
|
-
* being copy-pasted into each pack.
|
|
4
|
+
* The hash/normalize tail (`BodyDigest`, `normalizeWhitespace`, `hashBody`) moved to
|
|
5
|
+
* the shared layer-2 substrate (ADR-0064) so both graph and yagni single-source it and
|
|
6
|
+
* cannot diverge. This module re-exports the same symbols verbatim so every existing
|
|
7
|
+
* graph-engine + adapter importer of `'../lang-adapter/body-digest.js'` is unchanged
|
|
8
|
+
* and `bodyHash` values stay byte-identical.
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* already import types from — so importing one more helper is
|
|
16
|
-
* structurally consistent and violates no layering rule (lang-* adapters
|
|
17
|
-
* may not import each OTHER, but lang-adapter/ is fair game).
|
|
18
|
-
*
|
|
19
|
-
* What deliberately STAYS in each adapter pack: the language-specific
|
|
20
|
-
* comment stripper (Go rune literals vs Java text blocks vs Rust nested
|
|
21
|
-
* block comments) and any language-specific normalization. Python, for
|
|
22
|
-
* example, substitutes its own `normalizePythonBody` for real bodies
|
|
23
|
-
* because indentation is semantically significant there — it still
|
|
24
|
-
* composes `hashBody` + `normalizeWhitespace` for synthetic bodies. The
|
|
25
|
-
* primitives are intentionally low-level (not a single `digestBody(text,
|
|
26
|
-
* stripFn)`) precisely so a pack can swap the normalization step.
|
|
27
|
-
*/
|
|
28
|
-
/** Catalog body fingerprint: SHA-256 hex hash + canonical-text length. */
|
|
29
|
-
export interface BodyDigest {
|
|
30
|
-
readonly hash: string;
|
|
31
|
-
readonly size: number;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Collapse every run of whitespace to a single space and trim. The
|
|
35
|
-
* default body normalization for whitespace-insensitive languages
|
|
36
|
-
* (Go/Java/Rust) and for synthetic (module-init) bodies in every pack.
|
|
37
|
-
*/
|
|
38
|
-
export declare function normalizeWhitespace(s: string): string;
|
|
39
|
-
/**
|
|
40
|
-
* SHA-256 an already-normalized ("canonical") body string into a
|
|
41
|
-
* `BodyDigest`. `size` is the canonical-text length so it tracks the
|
|
42
|
-
* hashed content, not the raw source. Callers normalize first — via
|
|
43
|
-
* `normalizeWhitespace` or a language-specific normalizer.
|
|
10
|
+
* Language-specific comment strippers / normalizers still live in each adapter pack;
|
|
11
|
+
* only the canonical-string→hash tail is shared (see the package).
|
|
44
12
|
*/
|
|
45
|
-
export
|
|
13
|
+
export { normalizeWhitespace, hashBody, type BodyDigest } from '@opensip-cli/clone-detection';
|
|
46
14
|
//# sourceMappingURL=body-digest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-digest.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/body-digest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"body-digest.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/body-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -1,49 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Body-digest primitives — relocated to `@opensip-cli/clone-detection`.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* in all four tree-sitter packs). Per the round-3 modular-monolith audit
|
|
10
|
-
* (2026-05-30, finding D) it lives here on the contract layer instead of
|
|
11
|
-
* being copy-pasted into each pack.
|
|
4
|
+
* The hash/normalize tail (`BodyDigest`, `normalizeWhitespace`, `hashBody`) moved to
|
|
5
|
+
* the shared layer-2 substrate (ADR-0064) so both graph and yagni single-source it and
|
|
6
|
+
* cannot diverge. This module re-exports the same symbols verbatim so every existing
|
|
7
|
+
* graph-engine + adapter importer of `'../lang-adapter/body-digest.js'` is unchanged
|
|
8
|
+
* and `bodyHash` values stay byte-identical.
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* already import types from — so importing one more helper is
|
|
16
|
-
* structurally consistent and violates no layering rule (lang-* adapters
|
|
17
|
-
* may not import each OTHER, but lang-adapter/ is fair game).
|
|
18
|
-
*
|
|
19
|
-
* What deliberately STAYS in each adapter pack: the language-specific
|
|
20
|
-
* comment stripper (Go rune literals vs Java text blocks vs Rust nested
|
|
21
|
-
* block comments) and any language-specific normalization. Python, for
|
|
22
|
-
* example, substitutes its own `normalizePythonBody` for real bodies
|
|
23
|
-
* because indentation is semantically significant there — it still
|
|
24
|
-
* composes `hashBody` + `normalizeWhitespace` for synthetic bodies. The
|
|
25
|
-
* primitives are intentionally low-level (not a single `digestBody(text,
|
|
26
|
-
* stripFn)`) precisely so a pack can swap the normalization step.
|
|
27
|
-
*/
|
|
28
|
-
import { createHash } from 'node:crypto';
|
|
29
|
-
/**
|
|
30
|
-
* Collapse every run of whitespace to a single space and trim. The
|
|
31
|
-
* default body normalization for whitespace-insensitive languages
|
|
32
|
-
* (Go/Java/Rust) and for synthetic (module-init) bodies in every pack.
|
|
33
|
-
*/
|
|
34
|
-
export function normalizeWhitespace(s) {
|
|
35
|
-
return s.replaceAll(/\s+/g, ' ').trim();
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* SHA-256 an already-normalized ("canonical") body string into a
|
|
39
|
-
* `BodyDigest`. `size` is the canonical-text length so it tracks the
|
|
40
|
-
* hashed content, not the raw source. Callers normalize first — via
|
|
41
|
-
* `normalizeWhitespace` or a language-specific normalizer.
|
|
10
|
+
* Language-specific comment strippers / normalizers still live in each adapter pack;
|
|
11
|
+
* only the canonical-string→hash tail is shared (see the package).
|
|
42
12
|
*/
|
|
43
|
-
export
|
|
44
|
-
return {
|
|
45
|
-
hash: createHash('sha256').update(canonical, 'utf8').digest('hex'),
|
|
46
|
-
size: canonical.length,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
13
|
+
export { normalizeWhitespace, hashBody } from '@opensip-cli/clone-detection';
|
|
49
14
|
//# sourceMappingURL=body-digest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-digest.js","sourceRoot":"","sources":["../../src/lang-adapter/body-digest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"body-digest.js","sourceRoot":"","sources":["../../src/lang-adapter/body-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAmB,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical language id by file extension — engine-homed for rule gating.
|
|
3
|
+
*
|
|
4
|
+
* The near-clone rule must gate candidate pairs to the same language. The
|
|
5
|
+
* equivalent filter in graph-adapter-common cannot be imported from the engine
|
|
6
|
+
* rule layer (adapter-common depends on the engine). This module is the
|
|
7
|
+
* canonical extension map consumed by rules; adapter-common may delegate here
|
|
8
|
+
* in a follow-up.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Return the canonical language id for `filePath` by extension, or `undefined`
|
|
12
|
+
* when the extension is not recognized.
|
|
13
|
+
*/
|
|
14
|
+
export declare function languageOfFile(filePath: string): string | undefined;
|
|
15
|
+
//# sourceMappingURL=language-of-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-of-file.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/language-of-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0BH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKnE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical language id by file extension — engine-homed for rule gating.
|
|
3
|
+
*
|
|
4
|
+
* The near-clone rule must gate candidate pairs to the same language. The
|
|
5
|
+
* equivalent filter in graph-adapter-common cannot be imported from the engine
|
|
6
|
+
* rule layer (adapter-common depends on the engine). This module is the
|
|
7
|
+
* canonical extension map consumed by rules; adapter-common may delegate here
|
|
8
|
+
* in a follow-up.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Extension suffix → canonical graph language id. Longest-match first per path.
|
|
12
|
+
* `.js`/`.jsx`/`.mjs`/`.cjs` map to `typescript` because the graph-typescript
|
|
13
|
+
* adapter analyzes them and a `.ts`↔`.js` (or `.js`↔`.js`) near-clone is a real,
|
|
14
|
+
* actionable clone — omitting them would silently skip every JS clone pair.
|
|
15
|
+
*/
|
|
16
|
+
const EXTENSION_TO_LANGUAGE = {
|
|
17
|
+
'.tsx': 'typescript',
|
|
18
|
+
'.mts': 'typescript',
|
|
19
|
+
'.cts': 'typescript',
|
|
20
|
+
'.ts': 'typescript',
|
|
21
|
+
'.jsx': 'typescript',
|
|
22
|
+
'.mjs': 'typescript',
|
|
23
|
+
'.cjs': 'typescript',
|
|
24
|
+
'.js': 'typescript',
|
|
25
|
+
'.pyi': 'python',
|
|
26
|
+
'.py': 'python',
|
|
27
|
+
'.java': 'java',
|
|
28
|
+
'.go': 'go',
|
|
29
|
+
'.rs': 'rust',
|
|
30
|
+
};
|
|
31
|
+
const SORTED_EXTENSIONS = Object.keys(EXTENSION_TO_LANGUAGE).sort((a, b) => b.length - a.length);
|
|
32
|
+
/**
|
|
33
|
+
* Return the canonical language id for `filePath` by extension, or `undefined`
|
|
34
|
+
* when the extension is not recognized.
|
|
35
|
+
*/
|
|
36
|
+
export function languageOfFile(filePath) {
|
|
37
|
+
for (const ext of SORTED_EXTENSIONS) {
|
|
38
|
+
if (filePath.endsWith(ext))
|
|
39
|
+
return EXTENSION_TO_LANGUAGE[ext];
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=language-of-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-of-file.js","sourceRoot":"","sources":["../../src/lang-adapter/language-of-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,qBAAqB,GAAqC;IAC9D,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjG;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Near-duplicate MinHash/LSH primitives — relocated to
|
|
3
|
+
* `@opensip-cli/clone-detection`.
|
|
4
|
+
*
|
|
5
|
+
* The signature constants + digest tail moved to the shared layer-2 substrate
|
|
6
|
+
* (ADR-0064) so graph and yagni single-source them. This module re-exports the same
|
|
7
|
+
* symbols verbatim so existing importers of `'../lang-adapter/near-duplicate-signature.js'`
|
|
8
|
+
* are unchanged and signature VALUES (and the `sig=` cache-key segment) stay
|
|
9
|
+
* byte-identical. `NEAR_DUP_SIGNATURE_VERSION` is unchanged by the move.
|
|
10
|
+
*/
|
|
11
|
+
export { NEAR_DUP_SIGNATURE_K, NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS, NEAR_DUP_SIGNATURE_VERSION, shingle, bodySignature, estimateJaccard, lshBandHashes, digestCanonicalBody, type BodyDigestWithSignature, } from '@opensip-cli/clone-detection';
|
|
12
|
+
//# sourceMappingURL=near-duplicate-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-duplicate-signature.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/near-duplicate-signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,aAAa,EACb,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,KAAK,uBAAuB,GAC7B,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Near-duplicate MinHash/LSH primitives — relocated to
|
|
3
|
+
* `@opensip-cli/clone-detection`.
|
|
4
|
+
*
|
|
5
|
+
* The signature constants + digest tail moved to the shared layer-2 substrate
|
|
6
|
+
* (ADR-0064) so graph and yagni single-source them. This module re-exports the same
|
|
7
|
+
* symbols verbatim so existing importers of `'../lang-adapter/near-duplicate-signature.js'`
|
|
8
|
+
* are unchanged and signature VALUES (and the `sig=` cache-key segment) stay
|
|
9
|
+
* byte-identical. `NEAR_DUP_SIGNATURE_VERSION` is unchanged by the move.
|
|
10
|
+
*/
|
|
11
|
+
export { NEAR_DUP_SIGNATURE_K, NEAR_DUP_LSH_BANDS, NEAR_DUP_LSH_ROWS, NEAR_DUP_SIGNATURE_VERSION, shingle, bodySignature, estimateJaccard, lshBandHashes, digestCanonicalBody, } from '@opensip-cli/clone-detection';
|
|
12
|
+
//# sourceMappingURL=near-duplicate-signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-duplicate-signature.js","sourceRoot":"","sources":["../../src/lang-adapter/near-duplicate-signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,OAAO,EACP,aAAa,EACb,eAAe,EACf,aAAa,EACb,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-source.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/read-source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"read-source.d.ts","sourceRoot":"","sources":["../../src/lang-adapter/read-source.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,WAAa,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA8B,GACvC,MAAM,CAYR"}
|