@aiready/pattern-detect 0.17.13 → 0.17.14

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.js CHANGED
@@ -183,7 +183,8 @@ var INFRA_RULES = [
183
183
  {
184
184
  name: "cli-command-definitions",
185
185
  detect: (file, code) => {
186
- const isCliFile = file.includes("/commands/") || file.includes("/cli/") || file.endsWith(".command.ts");
186
+ const basename = file.split("/").pop() || "";
187
+ const isCliFile = file.includes("/commands/") || file.includes("/cli/") || file.endsWith(".command.ts") || basename === "cli.ts" || basename === "cli.js" || basename === "cli.tsx" || basename === "cli-action.ts";
187
188
  const hasCommandPattern = (code.includes(".command(") || code.includes("defineCommand")) && (code.includes(".description(") || code.includes(".option(")) && (code.includes(".action(") || code.includes("async"));
188
189
  return isCliFile && hasCommandPattern;
189
190
  },
@@ -196,6 +197,22 @@ var INFRA_RULES = [
196
197
  // src/rules/categories/logic-rules.ts
197
198
  var import_core4 = require("@aiready/core");
198
199
  var LOGIC_RULES = [
200
+ // Re-export / Barrel files - Intentional API surface consolidation
201
+ {
202
+ name: "re-export-files",
203
+ detect: (file, code) => {
204
+ const isIndexFile = file.endsWith("/index.ts") || file.endsWith("/index.js") || file.endsWith("/index.tsx") || file.endsWith("/index.jsx");
205
+ const lines = code.split("\n").filter((l) => l.trim());
206
+ if (lines.length === 0) return false;
207
+ const reExportLines = lines.filter(
208
+ (l) => /^export\s+(\{[^}]+\}|\*)\s+from\s+/.test(l.trim()) || /^export\s+\*\s+as\s+\w+\s+from\s+/.test(l.trim())
209
+ ).length;
210
+ return isIndexFile && reExportLines > 0 && reExportLines / lines.length > 0.5;
211
+ },
212
+ severity: import_core4.Severity.Info,
213
+ reason: "Barrel/index files intentionally re-export for API surface consolidation",
214
+ suggestion: "Re-exports in barrel files are expected and not true duplication"
215
+ },
199
216
  // Type Definitions - Duplication for type safety and module independence
200
217
  {
201
218
  name: "type-definitions",
@@ -759,6 +776,22 @@ function getRefactoringSuggestion(patternType, similarity) {
759
776
  return baseMessages[patternType] + urgency;
760
777
  }
761
778
  function generateSummary(results) {
779
+ if (!Array.isArray(results)) {
780
+ return {
781
+ totalPatterns: 0,
782
+ totalTokenCost: 0,
783
+ patternsByType: {
784
+ "api-handler": 0,
785
+ validator: 0,
786
+ utility: 0,
787
+ "class-method": 0,
788
+ component: 0,
789
+ function: 0,
790
+ unknown: 0
791
+ },
792
+ topDuplicates: []
793
+ };
794
+ }
762
795
  const allIssues = results.flatMap((r) => r.issues || []);
763
796
  const totalTokenCost = results.reduce(
764
797
  (sum, r) => sum + (r.metrics?.tokenCost || 0),
@@ -847,7 +880,35 @@ function calculateSeverity2(similarity) {
847
880
  // src/scoring.ts
848
881
  var import_core10 = require("@aiready/core");
849
882
  function calculatePatternScore(duplicates, totalFilesAnalyzed, costConfig) {
850
- const actionableDuplicates = duplicates.filter((d) => d.severity !== "info");
883
+ const actionableDuplicates = duplicates.filter((d) => {
884
+ if (d.severity === "info") return false;
885
+ const acceptableRules = [
886
+ // Logic rules (logic-rules.ts)
887
+ "type-definitions",
888
+ "utility-functions",
889
+ "shared-hooks",
890
+ "score-helpers",
891
+ "visualization-handlers",
892
+ "switch-helpers",
893
+ "common-api-functions",
894
+ "validation-functions",
895
+ // Infrastructure rules (infra-rules.ts)
896
+ "config-files",
897
+ "migration-scripts",
898
+ "tool-implementations",
899
+ "cli-command-definitions",
900
+ // Web rules (web-rules.ts)
901
+ "templates",
902
+ "common-ui-handlers",
903
+ "nextjs-route-handlers",
904
+ // Test rules (test-rules.ts)
905
+ "test-fixtures",
906
+ "e2e-page-objects",
907
+ "mock-data"
908
+ ];
909
+ if (d.matchedRule && acceptableRules.includes(d.matchedRule)) return false;
910
+ return true;
911
+ });
851
912
  const totalDuplicates = actionableDuplicates.length;
852
913
  const totalTokenCost = actionableDuplicates.reduce(
853
914
  (sum, d) => sum + d.tokenCost,
package/dist/index.mjs CHANGED
@@ -12,16 +12,16 @@ import {
12
12
  getSmartDefaults,
13
13
  groupDuplicatesByFilePair,
14
14
  logConfiguration
15
- } from "./chunk-P3BOCGVV.mjs";
15
+ } from "./chunk-C4ZGC4KA.mjs";
16
16
  import {
17
17
  detectDuplicatePatterns
18
- } from "./chunk-IPBGVPUX.mjs";
19
- import {
20
- filterBySeverity
21
- } from "./chunk-2P7BQHGR.mjs";
18
+ } from "./chunk-RH5JPWEC.mjs";
22
19
  import {
23
20
  calculatePatternScore
24
- } from "./chunk-PHJE6A3J.mjs";
21
+ } from "./chunk-G3GZFYRI.mjs";
22
+ import {
23
+ filterBySeverity
24
+ } from "./chunk-UKQFCUQA.mjs";
25
25
 
26
26
  // src/index.ts
27
27
  import { ToolRegistry } from "@aiready/core";
@@ -27,7 +27,35 @@ module.exports = __toCommonJS(scoring_entry_exports);
27
27
  // src/scoring.ts
28
28
  var import_core = require("@aiready/core");
29
29
  function calculatePatternScore(duplicates, totalFilesAnalyzed, costConfig) {
30
- const actionableDuplicates = duplicates.filter((d) => d.severity !== "info");
30
+ const actionableDuplicates = duplicates.filter((d) => {
31
+ if (d.severity === "info") return false;
32
+ const acceptableRules = [
33
+ // Logic rules (logic-rules.ts)
34
+ "type-definitions",
35
+ "utility-functions",
36
+ "shared-hooks",
37
+ "score-helpers",
38
+ "visualization-handlers",
39
+ "switch-helpers",
40
+ "common-api-functions",
41
+ "validation-functions",
42
+ // Infrastructure rules (infra-rules.ts)
43
+ "config-files",
44
+ "migration-scripts",
45
+ "tool-implementations",
46
+ "cli-command-definitions",
47
+ // Web rules (web-rules.ts)
48
+ "templates",
49
+ "common-ui-handlers",
50
+ "nextjs-route-handlers",
51
+ // Test rules (test-rules.ts)
52
+ "test-fixtures",
53
+ "e2e-page-objects",
54
+ "mock-data"
55
+ ];
56
+ if (d.matchedRule && acceptableRules.includes(d.matchedRule)) return false;
57
+ return true;
58
+ });
31
59
  const totalDuplicates = actionableDuplicates.length;
32
60
  const totalTokenCost = actionableDuplicates.reduce(
33
61
  (sum, d) => sum + d.tokenCost,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  calculatePatternScore
3
- } from "../chunk-PHJE6A3J.mjs";
3
+ } from "../chunk-G3GZFYRI.mjs";
4
4
  export {
5
5
  calculatePatternScore
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/pattern-detect",
3
- "version": "0.17.13",
3
+ "version": "0.17.14",
4
4
  "description": "Semantic duplicate pattern detection for AI-generated code - finds similar implementations that waste AI context tokens",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -65,7 +65,7 @@
65
65
  "dependencies": {
66
66
  "commander": "^14.0.0",
67
67
  "chalk": "^5.3.0",
68
- "@aiready/core": "0.24.14"
68
+ "@aiready/core": "0.24.15"
69
69
  },
70
70
  "devDependencies": {
71
71
  "tsup": "^8.3.5",