@omfalos/mokosh 0.3.1 → 0.3.2

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/dist/index.d.mts CHANGED
@@ -442,10 +442,29 @@ declare function saveChangeImpactCache(cache: ChangeImpactCache, cachePath: stri
442
442
  */
443
443
  declare function loadChangeImpactCache(cachePath: string): ChangeImpactCache | null;
444
444
 
445
+ /**
446
+ * Language-family partitioning for duplicate detection. `findDuplicates` never compares files
447
+ * across a family boundary — see docs/adr-013-duplicate-detection-noise-reduction.md. The
448
+ * immediate driver is CSS-family declarations: they share a small, finite vocabulary (property
449
+ * names, common value keywords) that the shared `KEYWORDS` denylist in `tokenizer.ts` doesn't
450
+ * cover, so unrelated style rules with the same declaration *shape* but different selectors/
451
+ * properties/values were hashing identically to unrelated TS/JS/Python shapes too. Splitting by
452
+ * family also lets later phases tune `windowSize`/`minLines`/vocabulary per family without one
453
+ * family's tuning affecting another's.
454
+ */
455
+
456
+ /** One partition of `findDuplicates` matching — files in different families are never compared. */
457
+ type DuplicateFamily = "style" | "code";
458
+
445
459
  /**
446
460
  * Sliding-window (shingle) hashing over a normalized token stream, plus chain-merging of
447
- * consecutive matching windows into contiguous duplicate blocks. Shared by every language
448
- * `tokenize()` supports the shingling step itself has no language awareness at all.
461
+ * consecutive matching windows into contiguous duplicate blocks, a structural-punctuation-density
462
+ * gate that drops blocks that are mostly object/array-literal shape (e.g. MCP tool `inputSchema`
463
+ * boilerplate) rather than substantive shared logic, and exact-occurrence clustering of pair-
464
+ * matches into one N-occurrence group instead of reporting C(N,2) near-identical pairs for a block
465
+ * repeated N times. Shared by every language `tokenize()` supports — the shingling step itself has
466
+ * no language awareness at all. See docs/adr-013-duplicate-detection-noise-reduction.md for the
467
+ * noise this addresses.
449
468
  */
450
469
 
451
470
  interface DuplicateOccurrence {
@@ -454,12 +473,20 @@ interface DuplicateOccurrence {
454
473
  endLine: number;
455
474
  }
456
475
  interface DuplicateGroup {
457
- /** Two locations sharing this duplicated block. */
458
- occurrences: [DuplicateOccurrence, DuplicateOccurrence];
459
- /** Line span covered by the block (measured on the first occurrence). */
476
+ /** Every location sharing this duplicated block (two or more) — locations that pairwise
477
+ * chain-match are clustered into one group instead of being reported once per pair, so a
478
+ * block repeated N times produces one N-occurrence group, not C(N,2) near-identical ones. */
479
+ occurrences: DuplicateOccurrence[];
480
+ /** Line span of the largest single pairwise match clustered into this group (each pair's own
481
+ * span is the shorter of its two occurrences) — the best-verified size for this block, not an
482
+ * average or a value shrunk by a more weakly-matching cluster member. */
460
483
  lines: number;
461
484
  /** Token-window length backing this block, after chain-merging adjacent windows. */
462
485
  tokens: number;
486
+ /** Which language family both occurrences belong to (set by `findDuplicates`, which never
487
+ * matches across families — see docs/adr-013-duplicate-detection-noise-reduction.md).
488
+ * Absent when called directly with a token stream that isn't family-scoped, e.g. in tests. */
489
+ family?: DuplicateFamily | undefined;
463
490
  }
464
491
 
465
492
  interface FindDuplicatesOptions {
@@ -470,6 +497,13 @@ interface FindDuplicatesOptions {
470
497
  /** When true (default), string/number literals are normalized too, so only structural shape
471
498
  * — not the specific values used — drives a match. Set false for stricter, Type-1-only matching. */
472
499
  ignoreLiterals?: boolean | undefined;
500
+ /** Maximum fraction of a token-shingled block's window that may be object/array-literal
501
+ * structural punctuation (`{ } : , [ ]`) (default 0.5) — gates out blocks that are mostly
502
+ * schema/object-literal shape (e.g. MCP tool `inputSchema` boilerplate repeated across
503
+ * unrelated tool definitions) rather than substantive shared logic. Does not apply to the
504
+ * CSS/Less/SCSS structural comparator, which already matches on literal declaration content.
505
+ * Set to 1 to disable. See docs/adr-013-duplicate-detection-noise-reduction.md. */
506
+ maxPunctuationRatio?: number | undefined;
473
507
  /** Caps the number of duplicate blocks returned, largest-first (default 50). */
474
508
  limit?: number | undefined;
475
509
  /** Directory names to exclude, matched against any path segment (default `DEFAULT_IGNORE_DIRS`
@@ -478,17 +512,29 @@ interface FindDuplicatesOptions {
478
512
  }
479
513
  /**
480
514
  * @description Scans every file already present in `graph` for cross-file (and within-file)
481
- * duplicated code, using a language-agnostic token-shingling pipeline: comments are stripped
482
- * per `FileType`, identifiers (and, by default, literals) are normalized to placeholders so
483
- * renamed-variable copies still match, then a sliding token window is hashed and chain-merged
484
- * into contiguous blocks. Works uniformly across every language in `DEFAULT_EXTENSIONS`.
515
+ * duplicated code. CSS/Less/SCSS files are compared structurally by their rule bodies'
516
+ * literal, ordered `property: value` declarations, independent of selector name via
517
+ * {@link findStyleBlockDuplicates}. Every other language (TS/JS, Python, Go, CoffeeScript,
518
+ * LiveScript, Lua, Gherkin, Markdown, and Stylus, which has no shared PostCSS AST here) runs
519
+ * the generic token-shingling pipeline instead: comments are stripped per `FileType`,
520
+ * identifiers (and, by default, literals) are normalized to placeholders so renamed-variable
521
+ * copies still match, then a sliding token window is hashed and chain-merged into contiguous
522
+ * blocks. Token-shingled files are additionally partitioned into language families
523
+ * ({@link getDuplicateFamily} — `"style"` for Stylus, `"code"` for everything else) so
524
+ * matching never crosses that boundary — see docs/adr-013-duplicate-detection-noise-reduction.md.
485
525
  * @param graph - The graph to scan; its node paths (already ignore-rule-filtered) are the file
486
526
  * list, re-read from disk since duplication data isn't cached on `FileNode`.
487
527
  * @param rootDir - Absolute project root that graph paths are relative to.
488
- * @param options - `minLines`/`windowSize` tune sensitivity; `ignoreLiterals` toggles Type-2 vs
489
- * Type-1 matching; `ignoreDirs` excludes files under matching directory names; `limit` caps
528
+ * @param options - `minLines`/`windowSize` tune token-shingle sensitivity (`minLines` also caps
529
+ * CSS/Less/SCSS block size); `ignoreLiterals` toggles Type-2 vs Type-1 matching for the
530
+ * token-shingle path only (CSS/Less/SCSS always match on literal declaration content);
531
+ * `maxPunctuationRatio` gates out token-shingle blocks that are mostly object/array-literal
532
+ * structural punctuation (e.g. schema/object-literal boilerplate) rather than substantive
533
+ * shared logic; `ignoreDirs` excludes files under matching directory names; `limit` caps
490
534
  * results. Lock files are always excluded, independent of `ignoreDirs`.
491
- * @returns Duplicate blocks, each a pair of occurrences, sorted largest-first.
535
+ * @returns Duplicate blocks (each tagged with its `family`), two or more occurrences per block —
536
+ * every block that pairwise chain-matches another is clustered into one group instead of one
537
+ * per pair — sorted largest-first across all families.
492
538
  */
493
539
  declare function findDuplicates(graph: Graph, rootDir: string, options?: FindDuplicatesOptions): Promise<DuplicateGroup[]>;
494
540
 
@@ -1353,4 +1399,4 @@ declare function createWorkspaceGraph(rootDir: string, options?: {
1353
1399
  */
1354
1400
  declare function getAllProjectFiles(rootDir: string, options?: ScanOptions): string[];
1355
1401
 
1356
- export { type ApiSurface, type ApplyTagsFileResult, type ApplyTagsResult, CALL_EDGE_TYPES, CallEdge, type CalleeEntry, type CallerEntry$1 as CallerEntry, type ChangeImpactCache, type ComplexFunctionEntry, DEFAULT_EXTENSIONS, DEFAULT_IGNORE_DIRS, type DependencyGraph, type DuplicateGroup, type DuplicateOccurrence, EXPORT_TRACKING_TYPES, type ExportKind, type FeatureDetectionOptions, type FeatureDomain, type FeatureGraph, type FeatureGraphOptions, type FeatureInfo, FileNode, FileType, type FindComplexFunctionsOptions, type FindDuplicatesOptions, type FunctionCallInfo, type GetAffectedOptions, type GetCallersOptions, Graph, type CallerEntry as GraphCallerEntry, type GraphExporter, IMPORT_SYMBOL_TYPES, ImportEdge, type LanguageCoverage, MermaidExporter, type ModuleResponsibility, type ModuleRole, type MokoshConfig, type MonorepoDetector, type MonorepoLayout, NodeCategory, type NodeMeta, type NodeQuery, type ParallelParsingOption, type PathWithSymbols, type ProposeTagsOptions, type PublicExport, type ResponsibilityGraph, type ScanOptions, type SerializedGraph, type SerializedWorkspaceGraph, type SlimNode, type SlimSerializedGraph, StructuredTag, type SymbolCaller, type SymbolImporter, type SymbolMatch, type SymbolPrecision, SymbolTraversalContext, type TestNodeIdentifier, type TraversalOptions, type TraversalVisitor, type TypeEdge, type TypeGraph, type TypeKind, type TypeNode, type TypeQueryResult, WorkspaceGraph, type WorkspacePackage, type WorkspacePackageSummary, type WorkspacePackagesSummary, applyConfig, applyTags, buildApiSurface, buildChangeImpactCache, buildFeatureGraph, buildResponsibilityGraph, buildTypeGraph, computeGraphHash, configToGraphOptions, createImportMap, createWorkspaceGraph, detectAllEntryPoints, detectEntryPoint, detectFeatures, detectMonorepo, filterGraph, findComplexFunctions, findDuplicates, findSymbol, getAffected, getAllProjectFiles, getCallers, getDependencies, getDependents, getLanguageCoverage, getNodeMeta, hasCoverageData, isChangeImpactCacheValid, loadChangeImpactCache, loadCoverageMap, loadMokoshConfig, parseQuery, proposeAffectedTests, proposeTags, queryCallGraph, queryChangeImpact, queryTypeGraph, registerConfigMatcher, registerMonorepoDetector, registerParser, registerTestLibrary, registerTestPattern, saveChangeImpactCache, slimSerialize, summarizeWorkspacePackages, toMermaid };
1402
+ export { type ApiSurface, type ApplyTagsFileResult, type ApplyTagsResult, CALL_EDGE_TYPES, CallEdge, type CalleeEntry, type CallerEntry$1 as CallerEntry, type ChangeImpactCache, type ComplexFunctionEntry, DEFAULT_EXTENSIONS, DEFAULT_IGNORE_DIRS, type DependencyGraph, type DuplicateFamily, type DuplicateGroup, type DuplicateOccurrence, EXPORT_TRACKING_TYPES, type ExportKind, type FeatureDetectionOptions, type FeatureDomain, type FeatureGraph, type FeatureGraphOptions, type FeatureInfo, FileNode, FileType, type FindComplexFunctionsOptions, type FindDuplicatesOptions, type FunctionCallInfo, type GetAffectedOptions, type GetCallersOptions, Graph, type CallerEntry as GraphCallerEntry, type GraphExporter, IMPORT_SYMBOL_TYPES, ImportEdge, type LanguageCoverage, MermaidExporter, type ModuleResponsibility, type ModuleRole, type MokoshConfig, type MonorepoDetector, type MonorepoLayout, NodeCategory, type NodeMeta, type NodeQuery, type ParallelParsingOption, type PathWithSymbols, type ProposeTagsOptions, type PublicExport, type ResponsibilityGraph, type ScanOptions, type SerializedGraph, type SerializedWorkspaceGraph, type SlimNode, type SlimSerializedGraph, StructuredTag, type SymbolCaller, type SymbolImporter, type SymbolMatch, type SymbolPrecision, SymbolTraversalContext, type TestNodeIdentifier, type TraversalOptions, type TraversalVisitor, type TypeEdge, type TypeGraph, type TypeKind, type TypeNode, type TypeQueryResult, WorkspaceGraph, type WorkspacePackage, type WorkspacePackageSummary, type WorkspacePackagesSummary, applyConfig, applyTags, buildApiSurface, buildChangeImpactCache, buildFeatureGraph, buildResponsibilityGraph, buildTypeGraph, computeGraphHash, configToGraphOptions, createImportMap, createWorkspaceGraph, detectAllEntryPoints, detectEntryPoint, detectFeatures, detectMonorepo, filterGraph, findComplexFunctions, findDuplicates, findSymbol, getAffected, getAllProjectFiles, getCallers, getDependencies, getDependents, getLanguageCoverage, getNodeMeta, hasCoverageData, isChangeImpactCacheValid, loadChangeImpactCache, loadCoverageMap, loadMokoshConfig, parseQuery, proposeAffectedTests, proposeTags, queryCallGraph, queryChangeImpact, queryTypeGraph, registerConfigMatcher, registerMonorepoDetector, registerParser, registerTestLibrary, registerTestPattern, saveChangeImpactCache, slimSerialize, summarizeWorkspacePackages, toMermaid };
package/dist/index.d.ts CHANGED
@@ -442,10 +442,29 @@ declare function saveChangeImpactCache(cache: ChangeImpactCache, cachePath: stri
442
442
  */
443
443
  declare function loadChangeImpactCache(cachePath: string): ChangeImpactCache | null;
444
444
 
445
+ /**
446
+ * Language-family partitioning for duplicate detection. `findDuplicates` never compares files
447
+ * across a family boundary — see docs/adr-013-duplicate-detection-noise-reduction.md. The
448
+ * immediate driver is CSS-family declarations: they share a small, finite vocabulary (property
449
+ * names, common value keywords) that the shared `KEYWORDS` denylist in `tokenizer.ts` doesn't
450
+ * cover, so unrelated style rules with the same declaration *shape* but different selectors/
451
+ * properties/values were hashing identically to unrelated TS/JS/Python shapes too. Splitting by
452
+ * family also lets later phases tune `windowSize`/`minLines`/vocabulary per family without one
453
+ * family's tuning affecting another's.
454
+ */
455
+
456
+ /** One partition of `findDuplicates` matching — files in different families are never compared. */
457
+ type DuplicateFamily = "style" | "code";
458
+
445
459
  /**
446
460
  * Sliding-window (shingle) hashing over a normalized token stream, plus chain-merging of
447
- * consecutive matching windows into contiguous duplicate blocks. Shared by every language
448
- * `tokenize()` supports the shingling step itself has no language awareness at all.
461
+ * consecutive matching windows into contiguous duplicate blocks, a structural-punctuation-density
462
+ * gate that drops blocks that are mostly object/array-literal shape (e.g. MCP tool `inputSchema`
463
+ * boilerplate) rather than substantive shared logic, and exact-occurrence clustering of pair-
464
+ * matches into one N-occurrence group instead of reporting C(N,2) near-identical pairs for a block
465
+ * repeated N times. Shared by every language `tokenize()` supports — the shingling step itself has
466
+ * no language awareness at all. See docs/adr-013-duplicate-detection-noise-reduction.md for the
467
+ * noise this addresses.
449
468
  */
450
469
 
451
470
  interface DuplicateOccurrence {
@@ -454,12 +473,20 @@ interface DuplicateOccurrence {
454
473
  endLine: number;
455
474
  }
456
475
  interface DuplicateGroup {
457
- /** Two locations sharing this duplicated block. */
458
- occurrences: [DuplicateOccurrence, DuplicateOccurrence];
459
- /** Line span covered by the block (measured on the first occurrence). */
476
+ /** Every location sharing this duplicated block (two or more) — locations that pairwise
477
+ * chain-match are clustered into one group instead of being reported once per pair, so a
478
+ * block repeated N times produces one N-occurrence group, not C(N,2) near-identical ones. */
479
+ occurrences: DuplicateOccurrence[];
480
+ /** Line span of the largest single pairwise match clustered into this group (each pair's own
481
+ * span is the shorter of its two occurrences) — the best-verified size for this block, not an
482
+ * average or a value shrunk by a more weakly-matching cluster member. */
460
483
  lines: number;
461
484
  /** Token-window length backing this block, after chain-merging adjacent windows. */
462
485
  tokens: number;
486
+ /** Which language family both occurrences belong to (set by `findDuplicates`, which never
487
+ * matches across families — see docs/adr-013-duplicate-detection-noise-reduction.md).
488
+ * Absent when called directly with a token stream that isn't family-scoped, e.g. in tests. */
489
+ family?: DuplicateFamily | undefined;
463
490
  }
464
491
 
465
492
  interface FindDuplicatesOptions {
@@ -470,6 +497,13 @@ interface FindDuplicatesOptions {
470
497
  /** When true (default), string/number literals are normalized too, so only structural shape
471
498
  * — not the specific values used — drives a match. Set false for stricter, Type-1-only matching. */
472
499
  ignoreLiterals?: boolean | undefined;
500
+ /** Maximum fraction of a token-shingled block's window that may be object/array-literal
501
+ * structural punctuation (`{ } : , [ ]`) (default 0.5) — gates out blocks that are mostly
502
+ * schema/object-literal shape (e.g. MCP tool `inputSchema` boilerplate repeated across
503
+ * unrelated tool definitions) rather than substantive shared logic. Does not apply to the
504
+ * CSS/Less/SCSS structural comparator, which already matches on literal declaration content.
505
+ * Set to 1 to disable. See docs/adr-013-duplicate-detection-noise-reduction.md. */
506
+ maxPunctuationRatio?: number | undefined;
473
507
  /** Caps the number of duplicate blocks returned, largest-first (default 50). */
474
508
  limit?: number | undefined;
475
509
  /** Directory names to exclude, matched against any path segment (default `DEFAULT_IGNORE_DIRS`
@@ -478,17 +512,29 @@ interface FindDuplicatesOptions {
478
512
  }
479
513
  /**
480
514
  * @description Scans every file already present in `graph` for cross-file (and within-file)
481
- * duplicated code, using a language-agnostic token-shingling pipeline: comments are stripped
482
- * per `FileType`, identifiers (and, by default, literals) are normalized to placeholders so
483
- * renamed-variable copies still match, then a sliding token window is hashed and chain-merged
484
- * into contiguous blocks. Works uniformly across every language in `DEFAULT_EXTENSIONS`.
515
+ * duplicated code. CSS/Less/SCSS files are compared structurally by their rule bodies'
516
+ * literal, ordered `property: value` declarations, independent of selector name via
517
+ * {@link findStyleBlockDuplicates}. Every other language (TS/JS, Python, Go, CoffeeScript,
518
+ * LiveScript, Lua, Gherkin, Markdown, and Stylus, which has no shared PostCSS AST here) runs
519
+ * the generic token-shingling pipeline instead: comments are stripped per `FileType`,
520
+ * identifiers (and, by default, literals) are normalized to placeholders so renamed-variable
521
+ * copies still match, then a sliding token window is hashed and chain-merged into contiguous
522
+ * blocks. Token-shingled files are additionally partitioned into language families
523
+ * ({@link getDuplicateFamily} — `"style"` for Stylus, `"code"` for everything else) so
524
+ * matching never crosses that boundary — see docs/adr-013-duplicate-detection-noise-reduction.md.
485
525
  * @param graph - The graph to scan; its node paths (already ignore-rule-filtered) are the file
486
526
  * list, re-read from disk since duplication data isn't cached on `FileNode`.
487
527
  * @param rootDir - Absolute project root that graph paths are relative to.
488
- * @param options - `minLines`/`windowSize` tune sensitivity; `ignoreLiterals` toggles Type-2 vs
489
- * Type-1 matching; `ignoreDirs` excludes files under matching directory names; `limit` caps
528
+ * @param options - `minLines`/`windowSize` tune token-shingle sensitivity (`minLines` also caps
529
+ * CSS/Less/SCSS block size); `ignoreLiterals` toggles Type-2 vs Type-1 matching for the
530
+ * token-shingle path only (CSS/Less/SCSS always match on literal declaration content);
531
+ * `maxPunctuationRatio` gates out token-shingle blocks that are mostly object/array-literal
532
+ * structural punctuation (e.g. schema/object-literal boilerplate) rather than substantive
533
+ * shared logic; `ignoreDirs` excludes files under matching directory names; `limit` caps
490
534
  * results. Lock files are always excluded, independent of `ignoreDirs`.
491
- * @returns Duplicate blocks, each a pair of occurrences, sorted largest-first.
535
+ * @returns Duplicate blocks (each tagged with its `family`), two or more occurrences per block —
536
+ * every block that pairwise chain-matches another is clustered into one group instead of one
537
+ * per pair — sorted largest-first across all families.
492
538
  */
493
539
  declare function findDuplicates(graph: Graph, rootDir: string, options?: FindDuplicatesOptions): Promise<DuplicateGroup[]>;
494
540
 
@@ -1353,4 +1399,4 @@ declare function createWorkspaceGraph(rootDir: string, options?: {
1353
1399
  */
1354
1400
  declare function getAllProjectFiles(rootDir: string, options?: ScanOptions): string[];
1355
1401
 
1356
- export { type ApiSurface, type ApplyTagsFileResult, type ApplyTagsResult, CALL_EDGE_TYPES, CallEdge, type CalleeEntry, type CallerEntry$1 as CallerEntry, type ChangeImpactCache, type ComplexFunctionEntry, DEFAULT_EXTENSIONS, DEFAULT_IGNORE_DIRS, type DependencyGraph, type DuplicateGroup, type DuplicateOccurrence, EXPORT_TRACKING_TYPES, type ExportKind, type FeatureDetectionOptions, type FeatureDomain, type FeatureGraph, type FeatureGraphOptions, type FeatureInfo, FileNode, FileType, type FindComplexFunctionsOptions, type FindDuplicatesOptions, type FunctionCallInfo, type GetAffectedOptions, type GetCallersOptions, Graph, type CallerEntry as GraphCallerEntry, type GraphExporter, IMPORT_SYMBOL_TYPES, ImportEdge, type LanguageCoverage, MermaidExporter, type ModuleResponsibility, type ModuleRole, type MokoshConfig, type MonorepoDetector, type MonorepoLayout, NodeCategory, type NodeMeta, type NodeQuery, type ParallelParsingOption, type PathWithSymbols, type ProposeTagsOptions, type PublicExport, type ResponsibilityGraph, type ScanOptions, type SerializedGraph, type SerializedWorkspaceGraph, type SlimNode, type SlimSerializedGraph, StructuredTag, type SymbolCaller, type SymbolImporter, type SymbolMatch, type SymbolPrecision, SymbolTraversalContext, type TestNodeIdentifier, type TraversalOptions, type TraversalVisitor, type TypeEdge, type TypeGraph, type TypeKind, type TypeNode, type TypeQueryResult, WorkspaceGraph, type WorkspacePackage, type WorkspacePackageSummary, type WorkspacePackagesSummary, applyConfig, applyTags, buildApiSurface, buildChangeImpactCache, buildFeatureGraph, buildResponsibilityGraph, buildTypeGraph, computeGraphHash, configToGraphOptions, createImportMap, createWorkspaceGraph, detectAllEntryPoints, detectEntryPoint, detectFeatures, detectMonorepo, filterGraph, findComplexFunctions, findDuplicates, findSymbol, getAffected, getAllProjectFiles, getCallers, getDependencies, getDependents, getLanguageCoverage, getNodeMeta, hasCoverageData, isChangeImpactCacheValid, loadChangeImpactCache, loadCoverageMap, loadMokoshConfig, parseQuery, proposeAffectedTests, proposeTags, queryCallGraph, queryChangeImpact, queryTypeGraph, registerConfigMatcher, registerMonorepoDetector, registerParser, registerTestLibrary, registerTestPattern, saveChangeImpactCache, slimSerialize, summarizeWorkspacePackages, toMermaid };
1402
+ export { type ApiSurface, type ApplyTagsFileResult, type ApplyTagsResult, CALL_EDGE_TYPES, CallEdge, type CalleeEntry, type CallerEntry$1 as CallerEntry, type ChangeImpactCache, type ComplexFunctionEntry, DEFAULT_EXTENSIONS, DEFAULT_IGNORE_DIRS, type DependencyGraph, type DuplicateFamily, type DuplicateGroup, type DuplicateOccurrence, EXPORT_TRACKING_TYPES, type ExportKind, type FeatureDetectionOptions, type FeatureDomain, type FeatureGraph, type FeatureGraphOptions, type FeatureInfo, FileNode, FileType, type FindComplexFunctionsOptions, type FindDuplicatesOptions, type FunctionCallInfo, type GetAffectedOptions, type GetCallersOptions, Graph, type CallerEntry as GraphCallerEntry, type GraphExporter, IMPORT_SYMBOL_TYPES, ImportEdge, type LanguageCoverage, MermaidExporter, type ModuleResponsibility, type ModuleRole, type MokoshConfig, type MonorepoDetector, type MonorepoLayout, NodeCategory, type NodeMeta, type NodeQuery, type ParallelParsingOption, type PathWithSymbols, type ProposeTagsOptions, type PublicExport, type ResponsibilityGraph, type ScanOptions, type SerializedGraph, type SerializedWorkspaceGraph, type SlimNode, type SlimSerializedGraph, StructuredTag, type SymbolCaller, type SymbolImporter, type SymbolMatch, type SymbolPrecision, SymbolTraversalContext, type TestNodeIdentifier, type TraversalOptions, type TraversalVisitor, type TypeEdge, type TypeGraph, type TypeKind, type TypeNode, type TypeQueryResult, WorkspaceGraph, type WorkspacePackage, type WorkspacePackageSummary, type WorkspacePackagesSummary, applyConfig, applyTags, buildApiSurface, buildChangeImpactCache, buildFeatureGraph, buildResponsibilityGraph, buildTypeGraph, computeGraphHash, configToGraphOptions, createImportMap, createWorkspaceGraph, detectAllEntryPoints, detectEntryPoint, detectFeatures, detectMonorepo, filterGraph, findComplexFunctions, findDuplicates, findSymbol, getAffected, getAllProjectFiles, getCallers, getDependencies, getDependents, getLanguageCoverage, getNodeMeta, hasCoverageData, isChangeImpactCacheValid, loadChangeImpactCache, loadCoverageMap, loadMokoshConfig, parseQuery, proposeAffectedTests, proposeTags, queryCallGraph, queryChangeImpact, queryTypeGraph, registerConfigMatcher, registerMonorepoDetector, registerParser, registerTestLibrary, registerTestPattern, saveChangeImpactCache, slimSerialize, summarizeWorkspacePackages, toMermaid };