code-auditor-mcp 3.0.7 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +245 -0
  3. package/README.md +24 -0
  4. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +21 -0
  5. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +1 -0
  6. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +21 -0
  7. package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +1 -0
  8. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +13 -0
  9. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +1 -0
  10. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +12 -0
  11. package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +1 -0
  12. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +11 -0
  13. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +1 -0
  14. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +22 -0
  15. package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +1 -0
  16. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +9 -0
  17. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +1 -0
  18. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +13 -0
  19. package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +1 -0
  20. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +13 -0
  21. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +1 -0
  22. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +18 -0
  23. package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +1 -0
  24. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +10 -0
  25. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +1 -0
  26. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +16 -0
  27. package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +1 -0
  28. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +14 -0
  29. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +1 -0
  30. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +18 -0
  31. package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +1 -0
  32. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +13 -0
  33. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +1 -0
  34. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +22 -0
  35. package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +1 -0
  36. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +10 -0
  37. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +1 -0
  38. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +20 -0
  39. package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +1 -0
  40. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +18 -0
  41. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +1 -0
  42. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +28 -0
  43. package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +1 -0
  44. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +11 -0
  45. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +1 -0
  46. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +31 -0
  47. package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +1 -0
  48. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +11 -0
  49. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +1 -0
  50. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +18 -0
  51. package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +1 -0
  52. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +13 -0
  53. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +1 -0
  54. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +61 -0
  55. package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +1 -0
  56. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +10 -0
  57. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +1 -0
  58. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +15 -0
  59. package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +1 -0
  60. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +11 -0
  61. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +1 -0
  62. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +49 -0
  63. package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +1 -0
  64. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +10 -0
  65. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +1 -0
  66. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +19 -0
  67. package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +1 -0
  68. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +37 -0
  69. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +1 -0
  70. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +73 -0
  71. package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +1 -0
  72. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +12 -0
  73. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +1 -0
  74. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +82 -0
  75. package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +1 -0
  76. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +10 -0
  77. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +1 -0
  78. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +15 -0
  79. package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +1 -0
  80. package/dist/analyzers/cross-language/APIContractAnalyzer.js +3 -3
  81. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  82. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +1 -1
  83. package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
  84. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +2 -2
  85. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  86. package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
  87. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  88. package/dist/analyzers/reactAnalyzer.js +7 -22
  89. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  90. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +40 -2
  91. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  92. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +186 -29
  93. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  94. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +30 -0
  95. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  96. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +164 -11
  97. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  98. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +51 -7
  99. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  100. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +354 -48
  101. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  102. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +8 -4
  103. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  104. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +51 -38
  105. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  106. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +59 -39
  107. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  108. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +412 -153
  109. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  110. package/dist/auditRunner.d.ts.map +1 -1
  111. package/dist/auditRunner.js +26 -2
  112. package/dist/auditRunner.js.map +1 -1
  113. package/dist/cli.js.map +1 -1
  114. package/dist/config/defaults.d.ts +32 -0
  115. package/dist/config/defaults.d.ts.map +1 -1
  116. package/dist/config/defaults.js +62 -4
  117. package/dist/config/defaults.js.map +1 -1
  118. package/dist/index.d.ts +0 -3
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +2 -4
  121. package/dist/index.js.map +1 -1
  122. package/dist/languages/UniversalAnalyzer.d.ts +7 -0
  123. package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
  124. package/dist/languages/UniversalAnalyzer.js +16 -1
  125. package/dist/languages/UniversalAnalyzer.js.map +1 -1
  126. package/dist/mcp-tools/whitelistTools.d.ts +1 -1
  127. package/package.json +2 -1
  128. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -1,6 +1,11 @@
1
1
  /**
2
- * Universal DRY (Don't Repeat Yourself) Analyzer
3
- * Works across multiple programming languages using the adapter pattern
2
+ * Universal DRY (Don't Repeat Yourself) Analyzer — Spec 17 R3
3
+ *
4
+ * R3.1: Self-reference fix — span-overlap check prevents a block from citing itself.
5
+ * R3.2: Minimum block size 5 → 15.
6
+ * R3.3: Rule-id split — dry/duplicate (exact token match) + dry/structural-similarity
7
+ * (identical token-kind sequence with different identifiers/literals).
8
+ * R7: dry/duplicate → warning, dry/structural-similarity → suggestion.
4
9
  */
5
10
  import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
6
11
  import type { Violation, FunctionMetadata } from '../../types.js';
@@ -25,6 +30,33 @@ export declare class UniversalDRYAnalyzer extends UniversalAnalyzer {
25
30
  readonly description = "Detects code duplication across the codebase";
26
31
  readonly category = "maintainability";
27
32
  protected analyzeAST(ast: AST, adapter: LanguageAdapter, config: DRYAnalyzerConfig, sourceCode: string): Promise<Violation[]>;
33
+ /**
34
+ * Returns true if the two blocks share code spans (same file + overlapping lines).
35
+ */
36
+ private spansOverlap;
37
+ /**
38
+ * Sort comparator: earliest file+line first.
39
+ */
40
+ private byFileAndLine;
41
+ /**
42
+ * R3.1: Deduplicate overlapping blocks. Prefers the innermost block when
43
+ * one block fully contains another (nesting), and the earliest block when
44
+ * blocks only partially overlap.
45
+ *
46
+ * This ensures that blocks nested inside functions/classes (e.g. for-loops
47
+ * inside a function body) surface for duplicate detection instead of being
48
+ * silently deduplicated by their outer container.
49
+ */
50
+ private deduplicateBlocks;
51
+ /**
52
+ * Group blocks by a key field into a map of key→blocks[].
53
+ */
54
+ private groupByHash;
55
+ /**
56
+ * R3.3: Normalize code to its token-kind sequence.
57
+ * Identifiers → ID, string/number/regex literals → LIT.
58
+ */
59
+ private normalizeStructure;
28
60
  /**
29
61
  * Extract code blocks from AST
30
62
  */
@@ -33,6 +65,12 @@ export declare class UniversalDRYAnalyzer extends UniversalAnalyzer {
33
65
  * Create a code block from an AST node
34
66
  */
35
67
  private createCodeBlock;
68
+ /**
69
+ * R3.3: Normalize code for structural comparison.
70
+ * First applies standard normalization (whitespace/comments), then
71
+ * replaces identifiers and literals with placeholders.
72
+ */
73
+ private normalizeCodeForStructure;
36
74
  /**
37
75
  * Normalize code for comparison
38
76
  */
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalDRYAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0GAA0G;IAC1G,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAQhC,CAAC;AAoBF,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAsGtB;IAED;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,eAAe;CAGxB"}
1
+ {"version":3,"file":"UniversalDRYAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0GAA0G;IAC1G,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,kBAAkB,EAAE,iBAShC,CAAC;AAsBF,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,kDAAkD;IACtE,QAAQ,CAAC,QAAQ,qBAAqB;IAEtC,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAwItB;IAID;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiFzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAKjC;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;CAGxB"}
@@ -1,11 +1,17 @@
1
1
  /**
2
- * Universal DRY (Don't Repeat Yourself) Analyzer
3
- * Works across multiple programming languages using the adapter pattern
2
+ * Universal DRY (Don't Repeat Yourself) Analyzer — Spec 17 R3
3
+ *
4
+ * R3.1: Self-reference fix — span-overlap check prevents a block from citing itself.
5
+ * R3.2: Minimum block size 5 → 15.
6
+ * R3.3: Rule-id split — dry/duplicate (exact token match) + dry/structural-similarity
7
+ * (identical token-kind sequence with different identifiers/literals).
8
+ * R7: dry/duplicate → warning, dry/structural-similarity → suggestion.
4
9
  */
5
10
  import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
6
11
  import * as crypto from 'crypto';
7
12
  export const DEFAULT_DRY_CONFIG = {
8
- minLineThreshold: 5,
13
+ // R3.2: floor raised from 5 → 15
14
+ minLineThreshold: 15,
9
15
  similarityThreshold: 0.85,
10
16
  excludePatterns: ['**/*.test.ts', '**/*.spec.ts'],
11
17
  checkImports: true,
@@ -26,38 +32,62 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
26
32
  }
27
33
  // Extract code blocks from this file
28
34
  const blocks = this.extractCodeBlocks(ast, adapter, sourceCode, finalConfig);
29
- // Store blocks for cross-file comparison
30
- // Note: In a real implementation, we'd need to aggregate blocks across all files
31
- // For now, we'll just detect duplicates within the same file
32
- const localIndex = this.buildLocalIndex(blocks);
33
- // Find duplicates (local, within this file)
34
- for (const [hash, duplicateBlocks] of localIndex.hashMap) {
35
- if (duplicateBlocks.length > 1) {
36
- // Report all but the first occurrence
37
- for (let i = 1; i < duplicateBlocks.length; i++) {
38
- const block = duplicateBlocks[i];
39
- const original = duplicateBlocks[0];
40
- violations.push(this.createViolation(block.file, block.start, `Duplicate code block detected (${block.lineCount} lines). First occurrence at line ${original.start.line}`, 'warning', 'exact-duplicate', {
41
- oldText: block.text,
42
- newText: `// Consider extracting to a shared function`
43
- }));
44
- }
35
+ // R3.1: Deduplicate blocks sort by (file, startLine) and merge overlapping spans
36
+ const deduped = this.deduplicateBlocks(blocks);
37
+ // ── R3.3: dry/duplicate exact token-identical match (warning) ─────
38
+ const exactHashmap = this.groupByHash(deduped, 'hash');
39
+ for (const [, group] of exactHashmap) {
40
+ if (group.length < 2)
41
+ continue;
42
+ // R3.1: Find earliest occurrence as "original" — sort by (file, startLine)
43
+ const sorted = [...group].sort(this.byFileAndLine);
44
+ const original = sorted[0];
45
+ for (let i = 1; i < sorted.length; i++) {
46
+ const block = sorted[i];
47
+ // R3.1: Span-overlap check — skip if block overlaps with original
48
+ if (this.spansOverlap(original, block))
49
+ continue;
50
+ violations.push(this.createViolation(block.file, block.start, `Duplicate code block detected (${block.lineCount} lines). ` +
51
+ `First occurrence at ${original.file}:${original.start.line}`, 'warning', // R7
52
+ 'dry/duplicate', {
53
+ oldText: block.text,
54
+ newText: `// Consider extracting to a shared function`
55
+ }));
56
+ }
57
+ }
58
+ // ── R3.3: dry/structural-similarity — token-kind match (suggestion) ─
59
+ const structuralHashmap = this.groupByHash(deduped, 'structuralHash');
60
+ for (const [, group] of structuralHashmap) {
61
+ if (group.length < 2)
62
+ continue;
63
+ const sorted = [...group].sort(this.byFileAndLine);
64
+ const original = sorted[0];
65
+ for (let i = 1; i < sorted.length; i++) {
66
+ const block = sorted[i];
67
+ // Skip if these are already exact duplicates (reported above)
68
+ if (original.hash === block.hash)
69
+ continue;
70
+ // R3.1: Span-overlap check
71
+ if (this.spansOverlap(original, block))
72
+ continue;
73
+ violations.push(this.createViolation(block.file, block.start, `Structurally similar code block detected (${block.lineCount} lines). ` +
74
+ `First occurrence at ${original.file}:${original.start.line}`, 'suggestion', // R7
75
+ 'dry/structural-similarity', {
76
+ oldText: block.text,
77
+ newText: `// Consider extracting to a shared function`
78
+ }));
45
79
  }
46
80
  }
47
81
  // ── Cross-file duplicate detection (scoped audit) ──────────────────
48
- // When fullFunctionIndex is provided, check each scoped block against
49
- // the full codebase index to catch duplicates that span files (R2.2).
50
82
  if (finalConfig.fullFunctionIndex && finalConfig.fullFunctionIndex.length > 0) {
51
83
  const fullHashmap = new Map();
52
84
  for (const func of finalConfig.fullFunctionIndex) {
53
- // Get body content from either top-level or metadata
54
85
  const body = func.body ?? func.metadata?.body;
55
86
  if (!body)
56
87
  continue;
57
88
  try {
58
89
  const normalized = this.normalizeCode(body, finalConfig);
59
90
  const hash = this.hashCode(normalized);
60
- // Only store the first occurrence (the "original")
61
91
  if (!fullHashmap.has(hash)) {
62
92
  fullHashmap.set(hash, {
63
93
  file: func.filePath,
@@ -70,14 +100,13 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
70
100
  // Skip functions whose body can't be normalized
71
101
  }
72
102
  }
73
- // Check each block in this file against the full index
74
103
  for (const block of blocks) {
75
104
  if (!this.isBlockLargeEnough(block, finalConfig))
76
105
  continue;
77
106
  const fullMatch = fullHashmap.get(block.hash);
78
107
  if (fullMatch && fullMatch.file !== block.file) {
79
108
  violations.push(this.createViolation(block.file, block.start, `Duplicate code block detected (${block.lineCount} lines). ` +
80
- `First occurrence in ${fullMatch.file}:${fullMatch.line} (${fullMatch.name})`, 'warning', 'cross-file-duplicate', {
109
+ `First occurrence in ${fullMatch.file}:${fullMatch.line} (${fullMatch.name})`, 'warning', 'dry/duplicate', {
81
110
  oldText: block.text,
82
111
  newText: `// Consider extracting to a shared function`
83
112
  }));
@@ -96,6 +125,118 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
96
125
  }
97
126
  return violations;
98
127
  }
128
+ // ── R3.1: Span-overlap helpers ──────────────────────────────────────
129
+ /**
130
+ * Returns true if the two blocks share code spans (same file + overlapping lines).
131
+ */
132
+ spansOverlap(a, b) {
133
+ if (a.file !== b.file)
134
+ return false;
135
+ return !(a.end.line < b.start.line || b.end.line < a.start.line);
136
+ }
137
+ /**
138
+ * Sort comparator: earliest file+line first.
139
+ */
140
+ byFileAndLine(a, b) {
141
+ if (a.file !== b.file)
142
+ return a.file.localeCompare(b.file);
143
+ return a.start.line - b.start.line;
144
+ }
145
+ /**
146
+ * R3.1: Deduplicate overlapping blocks. Prefers the innermost block when
147
+ * one block fully contains another (nesting), and the earliest block when
148
+ * blocks only partially overlap.
149
+ *
150
+ * This ensures that blocks nested inside functions/classes (e.g. for-loops
151
+ * inside a function body) surface for duplicate detection instead of being
152
+ * silently deduplicated by their outer container.
153
+ */
154
+ deduplicateBlocks(blocks) {
155
+ if (blocks.length <= 1)
156
+ return blocks;
157
+ // Sort by (file, startLine)
158
+ const sorted = [...blocks].sort(this.byFileAndLine);
159
+ const result = [];
160
+ let last = null;
161
+ for (const block of sorted) {
162
+ if (last && last.file === block.file) {
163
+ // Same file — check for overlap
164
+ // Case 1: `last` fully contains `block` (nesting: last is outer, block is inner)
165
+ // Replace outer with inner — the inner block is more specific.
166
+ if (last.start.line <= block.start.line && last.end.line >= block.end.line) {
167
+ result.pop();
168
+ result.push(block);
169
+ last = block;
170
+ continue;
171
+ }
172
+ // Case 2: `block` fully contains `last` (nesting: block is outer, last is inner)
173
+ // Keep `last` (already inner in result), skip the outer block.
174
+ if (block.start.line <= last.start.line && block.end.line >= last.end.line) {
175
+ continue;
176
+ }
177
+ // Case 3: Partial overlap (neither fully contains the other)
178
+ // Keep the earlier block.
179
+ if (!(last.end.line < block.start.line)) {
180
+ continue;
181
+ }
182
+ }
183
+ result.push(block);
184
+ last = block;
185
+ }
186
+ return result;
187
+ }
188
+ // ── R3.3: Structural similarity helpers ──────────────────────────────
189
+ /**
190
+ * Group blocks by a key field into a map of key→blocks[].
191
+ */
192
+ groupByHash(blocks, key) {
193
+ const map = new Map();
194
+ for (const block of blocks) {
195
+ const hash = block[key];
196
+ const existing = map.get(hash) || [];
197
+ existing.push(block);
198
+ map.set(hash, existing);
199
+ }
200
+ return map;
201
+ }
202
+ /**
203
+ * R3.3: Normalize code to its token-kind sequence.
204
+ * Identifiers → ID, string/number/regex literals → LIT.
205
+ */
206
+ normalizeStructure(code) {
207
+ let normalized = code;
208
+ // Template expressions: strip dynamic parts for structural matching
209
+ normalized = normalized.replace(/\$\{[^}]*\}/g, 'ID');
210
+ // String literals (single, double, backtick) → LIT
211
+ normalized = normalized.replace(/(['"`])\1/g, 'LIT'); // empty strings
212
+ normalized = normalized.replace(/`[^`]*`/g, 'LIT');
213
+ normalized = normalized.replace(/'[^']*'/g, 'LIT');
214
+ normalized = normalized.replace(/"[^"]*"/g, 'LIT');
215
+ // Numeric literals → LIT
216
+ normalized = normalized.replace(/\b\d+\.?\d*\b/g, 'LIT');
217
+ // Regex literals → LIT (approximate — /pattern/flags)
218
+ normalized = normalized.replace(/\/[^/*][^/]*\/[gimsuy]*/g, 'LIT');
219
+ // Boolean/null literals
220
+ normalized = normalized.replace(/\b(true|false|null|undefined)\b/g, 'LIT');
221
+ // Identifiers → ID (after literals so we don't replace inside strings)
222
+ // Match camelCase, PascalCase, snake_case, dollar-prefixed, underscore-prefixed
223
+ normalized = normalized.replace(/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g, (match) => {
224
+ // Keep keywords intact
225
+ const keywords = new Set([
226
+ 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue',
227
+ 'return', 'throw', 'try', 'catch', 'finally', 'new', 'delete', 'typeof',
228
+ 'instanceof', 'in', 'of', 'class', 'extends', 'super', 'this', 'function',
229
+ 'const', 'let', 'var', 'async', 'await', 'yield', 'import', 'export',
230
+ 'default', 'from', 'as', 'static', 'get', 'set', 'enum', 'type', 'interface',
231
+ 'implements', 'abstract', 'public', 'private', 'protected', 'readonly',
232
+ 'ID', 'LIT',
233
+ ]);
234
+ if (keywords.has(match))
235
+ return match;
236
+ return 'ID';
237
+ });
238
+ return normalized;
239
+ }
99
240
  /**
100
241
  * Extract code blocks from AST
101
242
  */
@@ -154,6 +295,9 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
154
295
  return null;
155
296
  const normalizedText = this.normalizeCode(text, config);
156
297
  const lineCount = this.countLines(text);
298
+ // R3.3: Compute structural hash from token-kind sequence
299
+ const structuralNormalized = this.normalizeCodeForStructure(text, config);
300
+ const structuralHash = this.hashCode(structuralNormalized);
157
301
  return {
158
302
  file: filePath,
159
303
  start: node.location.start,
@@ -161,10 +305,20 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
161
305
  text,
162
306
  normalizedText,
163
307
  hash: this.hashCode(normalizedText),
308
+ structuralHash,
164
309
  nodeType: node.type,
165
310
  lineCount
166
311
  };
167
312
  }
313
+ /**
314
+ * R3.3: Normalize code for structural comparison.
315
+ * First applies standard normalization (whitespace/comments), then
316
+ * replaces identifiers and literals with placeholders.
317
+ */
318
+ normalizeCodeForStructure(code, config) {
319
+ const normalized = this.normalizeCode(code, config);
320
+ return this.normalizeStructure(normalized);
321
+ }
168
322
  /**
169
323
  * Normalize code for comparison
170
324
  */
@@ -305,12 +459,15 @@ export class UniversalDRYAnalyzer extends UniversalAnalyzer {
305
459
  }
306
460
  isSignificantBlock(node, adapter) {
307
461
  // Check if this is a block-like structure (if, for, while, etc.)
308
- const blockTypes = ['Block', 'IfStatement', 'ForStatement', 'WhileStatement',
309
- 'DoWhileStatement', 'SwitchStatement', 'TryStatement'];
310
- return blockTypes.some(type => node.type.includes(type));
462
+ // Uses exact snake_case matches against tree-sitter node types.
463
+ const blockTypes = new Set([
464
+ 'if_statement', 'for_statement', 'for_in_statement',
465
+ 'while_statement', 'do_statement', 'switch_statement', 'try_statement',
466
+ ]);
467
+ return blockTypes.has(node.type);
311
468
  }
312
469
  isStringLiteral(node, adapter) {
313
- return node.type.includes('StringLiteral') || node.type.includes('TemplateLiteral');
470
+ return node.type === 'string' || node.type === 'template_string';
314
471
  }
315
472
  }
316
473
  //# sourceMappingURL=UniversalDRYAnalyzer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalDRYAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UniversalDRYAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDRYAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ import type { AST, LanguageAdapter } from '../../languages/types.js';
12
12
  export interface DataAccessAnalyzerConfig {
13
13
  checkOrgFilters?: boolean;
14
14
  checkSQLInjection?: boolean;
15
+ directAccess?: 'flag' | 'allow';
15
16
  databases?: {
16
17
  [key: string]: {
17
18
  name: string;
@@ -78,5 +79,34 @@ export declare class UniversalDataAccessAnalyzer extends UniversalAnalyzer {
78
79
  private requiresOrgFilter;
79
80
  private isStringLiteral;
80
81
  private isConnectionString;
82
+ /**
83
+ * R4.1: Find database queries inside loops and flag them as N+1 risks.
84
+ * Each finding carries the query call location (never line 1).
85
+ */
86
+ private checkLoopQueries;
87
+ /**
88
+ * R4.1: Determine if a node is a database call expression.
89
+ * Lightweight check — reused from extractDatabaseCalls logic.
90
+ */
91
+ private isDbCallNode;
92
+ /**
93
+ * R4.1/R4.2: Walk the parent chain to find the innermost enclosing loop.
94
+ * Returns the loop node and nesting depth.
95
+ *
96
+ * Detects:
97
+ * - for / while / do loops via adapter.isLoop()
98
+ * - .forEach / .map / .filter callbacks via AST pattern matching
99
+ */
100
+ private findEnclosingLoop;
101
+ /**
102
+ * R4.1: Check if a node is a call_expression invoking an iterator method
103
+ * (.forEach, .map, .filter, .reduce, .some, .every) — these create
104
+ * implicit loops where a DB query inside the callback is an N+1 risk.
105
+ */
106
+ private isIteratorCallback;
107
+ /**
108
+ * Extract the property name from a property_identifier node.
109
+ */
110
+ private getPropertyName;
81
111
  }
82
112
  //# sourceMappingURL=UniversalDataAccessAnalyzer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalDataAccessAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDataAccessAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAEvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,SAAS,CAAC,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE,MAAM,EAAE,CAAC;YACzB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;SACxB,CAAC;KACH,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAGF,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;CACH;AAED,eAAO,MAAM,0BAA0B,EAAE,wBA2CxC,CAAC;AAuBF,qBAAa,2BAA4B,SAAQ,iBAAiB;IAChE,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,mEAAmE;IACvF,QAAQ,CAAC,QAAQ,cAAc;IAE/B,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,wBAAwB,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CA+BtB;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4I5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuDvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4C5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,qBAAqB;IAmF7B,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;CAW3B"}
1
+ {"version":3,"file":"UniversalDataAccessAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/universal/UniversalDataAccessAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,GAAG,EAAE,eAAe,EAAW,MAAM,0BAA0B,CAAC;AAG9E;;GAEG;AACH,MAAM,WAAW,wBAAwB;IAEvC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAGhC,SAAS,CAAC,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE,MAAM,EAAE,CAAC;YACzB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;SACxB,CAAC;KACH,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAGhC,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,qBAAqB,CAAC,EAAE;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAGF,gBAAgB,CAAC,EAAE;QACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;CACH;AAED,eAAO,MAAM,0BAA0B,EAAE,wBA6CxC,CAAC;AAuBF,qBAAa,2BAA4B,SAAQ,iBAAiB;IAChE,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,mEAAmE;IACvF,QAAQ,CAAC,QAAQ,cAAc;IAE/B,UAAgB,UAAU,CACxB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,wBAAwB,EAChC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,EAAE,CAAC,CAkCtB;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4I5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6DvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiD5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAyCrB,OAAO,CAAC,qBAAqB;IAmF7B,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;IAc1B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkDxB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAmBpB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACH,OAAO,CAAC,eAAe;CAcxB"}