@aiready/pattern-detect 0.6.1 → 0.7.1

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/cli.js CHANGED
@@ -446,7 +446,7 @@ var import_fs = require("fs");
446
446
  var import_path = require("path");
447
447
  var import_core3 = require("@aiready/core");
448
448
  var program = new import_commander.Command();
449
- program.name("aiready-patterns").description("Detect duplicate patterns in your codebase").version("0.1.0").addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings").argument("<directory>", "Directory to analyze").option("-s, --similarity <number>", "Minimum similarity score (0-1)", "0.40").option("-l, --min-lines <number>", "Minimum lines to consider", "5").option("--batch-size <number>", "Batch size for comparisons", "100").option("--no-approx", "Disable approximate candidate selection (faster on small repos, slower on large)").option("--min-shared-tokens <number>", "Minimum shared tokens to consider a candidate", "8").option("--max-candidates <number>", "Maximum candidates per block", "100").option("--no-stream-results", "Disable incremental output (default: enabled)").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("--severity <level>", "Filter by severity: critical|high|medium|all", "all").option("--include-tests", "Include test files in analysis (excluded by default)").option(
449
+ program.name("aiready-patterns").description("Detect duplicate patterns in your codebase").version("0.1.0").addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings").argument("<directory>", "Directory to analyze").option("-s, --similarity <number>", "Minimum similarity score (0-1)").option("-l, --min-lines <number>", "Minimum lines to consider").option("--batch-size <number>", "Batch size for comparisons").option("--no-approx", "Disable approximate candidate selection (faster on small repos, slower on large)").option("--min-shared-tokens <number>", "Minimum shared tokens to consider a candidate").option("--max-candidates <number>", "Maximum candidates per block").option("--no-stream-results", "Disable incremental output (default: enabled)").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("--severity <level>", "Filter by severity: critical|high|medium|all").option("--include-tests", "Include test files in analysis (excluded by default)").option("--max-results <number>", "Maximum number of results to show in console output").option(
450
450
  "-o, --output <format>",
451
451
  "Output format: console, json, html",
452
452
  "console"
@@ -465,7 +465,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
465
465
  include: void 0,
466
466
  exclude: void 0,
467
467
  severity: "all",
468
- includeTests: false
468
+ includeTests: false,
469
+ maxResults: 10
469
470
  };
470
471
  const mergedConfig = (0, import_core3.mergeConfigWithDefaults)(config, defaults);
471
472
  const finalOptions = {
@@ -481,7 +482,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
481
482
  include: options.include?.split(",") || mergedConfig.include,
482
483
  exclude: options.exclude?.split(",") || mergedConfig.exclude,
483
484
  severity: options.severity || mergedConfig.severity,
484
- includeTests: options.includeTests || mergedConfig.includeTests
485
+ includeTests: options.includeTests || mergedConfig.includeTests,
486
+ maxResults: options.maxResults ? parseInt(options.maxResults) : mergedConfig.maxResults
485
487
  };
486
488
  if (!finalOptions.includeTests) {
487
489
  const testPatterns = [
@@ -510,7 +512,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
510
512
  approx: finalOptions.approx,
511
513
  minSharedTokens: finalOptions.minSharedTokens,
512
514
  maxCandidatesPerBlock: finalOptions.maxCandidatesPerBlock,
513
- streamResults: finalOptions.streamResults
515
+ streamResults: false
516
+ // Don't stream again for summary display
514
517
  });
515
518
  const elapsedTime = ((Date.now() - startTime) / 1e3).toFixed(2);
516
519
  const summary = generateSummary(results);
@@ -582,7 +585,7 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
582
585
  const threshold = severityThresholds[finalOptions.severity] || 0.4;
583
586
  filteredDuplicates = rawDuplicates.filter((dup) => dup.similarity >= threshold);
584
587
  }
585
- const topDuplicates = filteredDuplicates.sort((a, b) => b.similarity - a.similarity).slice(0, 10);
588
+ const topDuplicates = filteredDuplicates.sort((a, b) => b.similarity - a.similarity).slice(0, finalOptions.maxResults);
586
589
  topDuplicates.forEach((dup, idx) => {
587
590
  const severity = dup.similarity > 0.95 ? "CRITICAL" : dup.similarity > 0.9 ? "HIGH" : "MEDIUM";
588
591
  const severityIcon = dup.similarity > 0.95 ? "\u{1F534}" : dup.similarity > 0.9 ? "\u{1F7E1}" : "\u{1F535}";
package/dist/cli.mjs CHANGED
@@ -12,7 +12,7 @@ import { writeFileSync } from "fs";
12
12
  import { join } from "path";
13
13
  import { loadConfig, mergeConfigWithDefaults } from "@aiready/core";
14
14
  var program = new Command();
15
- program.name("aiready-patterns").description("Detect duplicate patterns in your codebase").version("0.1.0").addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings").argument("<directory>", "Directory to analyze").option("-s, --similarity <number>", "Minimum similarity score (0-1)", "0.40").option("-l, --min-lines <number>", "Minimum lines to consider", "5").option("--batch-size <number>", "Batch size for comparisons", "100").option("--no-approx", "Disable approximate candidate selection (faster on small repos, slower on large)").option("--min-shared-tokens <number>", "Minimum shared tokens to consider a candidate", "8").option("--max-candidates <number>", "Maximum candidates per block", "100").option("--no-stream-results", "Disable incremental output (default: enabled)").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("--severity <level>", "Filter by severity: critical|high|medium|all", "all").option("--include-tests", "Include test files in analysis (excluded by default)").option(
15
+ program.name("aiready-patterns").description("Detect duplicate patterns in your codebase").version("0.1.0").addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings").argument("<directory>", "Directory to analyze").option("-s, --similarity <number>", "Minimum similarity score (0-1)").option("-l, --min-lines <number>", "Minimum lines to consider").option("--batch-size <number>", "Batch size for comparisons").option("--no-approx", "Disable approximate candidate selection (faster on small repos, slower on large)").option("--min-shared-tokens <number>", "Minimum shared tokens to consider a candidate").option("--max-candidates <number>", "Maximum candidates per block").option("--no-stream-results", "Disable incremental output (default: enabled)").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("--severity <level>", "Filter by severity: critical|high|medium|all").option("--include-tests", "Include test files in analysis (excluded by default)").option("--max-results <number>", "Maximum number of results to show in console output").option(
16
16
  "-o, --output <format>",
17
17
  "Output format: console, json, html",
18
18
  "console"
@@ -31,7 +31,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
31
31
  include: void 0,
32
32
  exclude: void 0,
33
33
  severity: "all",
34
- includeTests: false
34
+ includeTests: false,
35
+ maxResults: 10
35
36
  };
36
37
  const mergedConfig = mergeConfigWithDefaults(config, defaults);
37
38
  const finalOptions = {
@@ -47,7 +48,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
47
48
  include: options.include?.split(",") || mergedConfig.include,
48
49
  exclude: options.exclude?.split(",") || mergedConfig.exclude,
49
50
  severity: options.severity || mergedConfig.severity,
50
- includeTests: options.includeTests || mergedConfig.includeTests
51
+ includeTests: options.includeTests || mergedConfig.includeTests,
52
+ maxResults: options.maxResults ? parseInt(options.maxResults) : mergedConfig.maxResults
51
53
  };
52
54
  if (!finalOptions.includeTests) {
53
55
  const testPatterns = [
@@ -76,7 +78,8 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
76
78
  approx: finalOptions.approx,
77
79
  minSharedTokens: finalOptions.minSharedTokens,
78
80
  maxCandidatesPerBlock: finalOptions.maxCandidatesPerBlock,
79
- streamResults: finalOptions.streamResults
81
+ streamResults: false
82
+ // Don't stream again for summary display
80
83
  });
81
84
  const elapsedTime = ((Date.now() - startTime) / 1e3).toFixed(2);
82
85
  const summary = generateSummary(results);
@@ -148,7 +151,7 @@ program.name("aiready-patterns").description("Detect duplicate patterns in your
148
151
  const threshold = severityThresholds[finalOptions.severity] || 0.4;
149
152
  filteredDuplicates = rawDuplicates.filter((dup) => dup.similarity >= threshold);
150
153
  }
151
- const topDuplicates = filteredDuplicates.sort((a, b) => b.similarity - a.similarity).slice(0, 10);
154
+ const topDuplicates = filteredDuplicates.sort((a, b) => b.similarity - a.similarity).slice(0, finalOptions.maxResults);
152
155
  topDuplicates.forEach((dup, idx) => {
153
156
  const severity = dup.similarity > 0.95 ? "CRITICAL" : dup.similarity > 0.9 ? "HIGH" : "MEDIUM";
154
157
  const severityIcon = dup.similarity > 0.95 ? "\u{1F534}" : dup.similarity > 0.9 ? "\u{1F7E1}" : "\u{1F535}";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiready/pattern-detect",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
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",
@@ -45,7 +45,7 @@
45
45
  "dependencies": {
46
46
  "commander": "^14.0.0",
47
47
  "chalk": "^5.3.0",
48
- "@aiready/core": "0.2.5"
48
+ "@aiready/core": "0.3.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "tsup": "^8.3.5",