@kevinrabun/judges 3.110.0 → 3.112.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 (78) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +126 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/finding-auto-priority.d.ts +2 -0
  6. package/dist/commands/finding-auto-priority.d.ts.map +1 -0
  7. package/dist/commands/finding-auto-priority.js +101 -0
  8. package/dist/commands/finding-auto-priority.js.map +1 -0
  9. package/dist/commands/finding-cluster-summary.d.ts +2 -0
  10. package/dist/commands/finding-cluster-summary.d.ts.map +1 -0
  11. package/dist/commands/finding-cluster-summary.js +86 -0
  12. package/dist/commands/finding-cluster-summary.js.map +1 -0
  13. package/dist/commands/finding-context-link.d.ts +2 -0
  14. package/dist/commands/finding-context-link.d.ts.map +1 -0
  15. package/dist/commands/finding-context-link.js +95 -0
  16. package/dist/commands/finding-context-link.js.map +1 -0
  17. package/dist/commands/finding-dependency-impact.d.ts +2 -0
  18. package/dist/commands/finding-dependency-impact.d.ts.map +1 -0
  19. package/dist/commands/finding-dependency-impact.js +98 -0
  20. package/dist/commands/finding-dependency-impact.js.map +1 -0
  21. package/dist/commands/finding-fix-estimate.d.ts +2 -0
  22. package/dist/commands/finding-fix-estimate.d.ts.map +1 -0
  23. package/dist/commands/finding-fix-estimate.js +96 -0
  24. package/dist/commands/finding-fix-estimate.js.map +1 -0
  25. package/dist/commands/finding-noise-score.d.ts +2 -0
  26. package/dist/commands/finding-noise-score.d.ts.map +1 -0
  27. package/dist/commands/finding-noise-score.js +94 -0
  28. package/dist/commands/finding-noise-score.js.map +1 -0
  29. package/dist/commands/finding-repeat-detect.d.ts +2 -0
  30. package/dist/commands/finding-repeat-detect.d.ts.map +1 -0
  31. package/dist/commands/finding-repeat-detect.js +93 -0
  32. package/dist/commands/finding-repeat-detect.js.map +1 -0
  33. package/dist/commands/finding-resolution-workflow.d.ts +2 -0
  34. package/dist/commands/finding-resolution-workflow.d.ts.map +1 -0
  35. package/dist/commands/finding-resolution-workflow.js +92 -0
  36. package/dist/commands/finding-resolution-workflow.js.map +1 -0
  37. package/dist/commands/finding-scope-impact.d.ts +2 -0
  38. package/dist/commands/finding-scope-impact.d.ts.map +1 -0
  39. package/dist/commands/finding-scope-impact.js +84 -0
  40. package/dist/commands/finding-scope-impact.js.map +1 -0
  41. package/dist/commands/finding-top-offender.d.ts +2 -0
  42. package/dist/commands/finding-top-offender.d.ts.map +1 -0
  43. package/dist/commands/finding-top-offender.js +76 -0
  44. package/dist/commands/finding-top-offender.js.map +1 -0
  45. package/dist/commands/review-health-trend.d.ts +2 -0
  46. package/dist/commands/review-health-trend.d.ts.map +1 -0
  47. package/dist/commands/review-health-trend.js +108 -0
  48. package/dist/commands/review-health-trend.js.map +1 -0
  49. package/dist/commands/review-mentor-suggest.d.ts +2 -0
  50. package/dist/commands/review-mentor-suggest.d.ts.map +1 -0
  51. package/dist/commands/review-mentor-suggest.js +113 -0
  52. package/dist/commands/review-mentor-suggest.js.map +1 -0
  53. package/dist/commands/review-quality-baseline.d.ts +2 -0
  54. package/dist/commands/review-quality-baseline.d.ts.map +1 -0
  55. package/dist/commands/review-quality-baseline.js +135 -0
  56. package/dist/commands/review-quality-baseline.js.map +1 -0
  57. package/dist/commands/review-readiness-check.d.ts +2 -0
  58. package/dist/commands/review-readiness-check.d.ts.map +1 -0
  59. package/dist/commands/review-readiness-check.js +99 -0
  60. package/dist/commands/review-readiness-check.js.map +1 -0
  61. package/dist/commands/review-retrospective.d.ts +2 -0
  62. package/dist/commands/review-retrospective.d.ts.map +1 -0
  63. package/dist/commands/review-retrospective.js +119 -0
  64. package/dist/commands/review-retrospective.js.map +1 -0
  65. package/dist/commands/review-team-skill-map.d.ts +2 -0
  66. package/dist/commands/review-team-skill-map.d.ts.map +1 -0
  67. package/dist/commands/review-team-skill-map.js +103 -0
  68. package/dist/commands/review-team-skill-map.js.map +1 -0
  69. package/dist/commands/review-team-velocity.d.ts +2 -0
  70. package/dist/commands/review-team-velocity.d.ts.map +1 -0
  71. package/dist/commands/review-team-velocity.js +104 -0
  72. package/dist/commands/review-team-velocity.js.map +1 -0
  73. package/dist/commands/review-workflow-suggest.d.ts +2 -0
  74. package/dist/commands/review-workflow-suggest.d.ts.map +1 -0
  75. package/dist/commands/review-workflow-suggest.js +130 -0
  76. package/dist/commands/review-workflow-suggest.js.map +1 -0
  77. package/package.json +1 -1
  78. package/server.json +2 -2
@@ -0,0 +1,2 @@
1
+ export declare function runFindingAutoPriority(argv: string[]): void;
2
+ //# sourceMappingURL=finding-auto-priority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-auto-priority.d.ts","sourceRoot":"","sources":["../../src/commands/finding-auto-priority.ts"],"names":[],"mappings":"AAqFA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkD3D"}
@@ -0,0 +1,101 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ const SEVERITY_WEIGHT = {
4
+ critical: 10,
5
+ high: 8,
6
+ medium: 5,
7
+ low: 3,
8
+ info: 1,
9
+ };
10
+ function prioritize(verdict) {
11
+ const results = [];
12
+ for (const f of verdict.findings ?? []) {
13
+ const factors = [];
14
+ let score = 0;
15
+ // Severity factor
16
+ const sevWeight = SEVERITY_WEIGHT[f.severity] ?? 3;
17
+ score += sevWeight;
18
+ factors.push(`severity=${f.severity} (+${sevWeight})`);
19
+ // Confidence factor
20
+ if (f.confidence !== undefined && f.confidence !== null) {
21
+ const confBoost = f.confidence >= 0.9 ? 3 : f.confidence >= 0.7 ? 2 : 1;
22
+ score += confBoost;
23
+ factors.push(`confidence=${f.confidence} (+${confBoost})`);
24
+ }
25
+ // Patch availability factor
26
+ if (f.patch !== undefined && f.patch !== null) {
27
+ score += 2;
28
+ factors.push("patch available (+2)");
29
+ }
30
+ // Short recommendation = likely simple fix = higher priority
31
+ if (f.recommendation.length < 100) {
32
+ score += 1;
33
+ factors.push("simple recommendation (+1)");
34
+ }
35
+ let priorityLabel;
36
+ if (score >= 12)
37
+ priorityLabel = "P0 — Immediate";
38
+ else if (score >= 9)
39
+ priorityLabel = "P1 — High";
40
+ else if (score >= 6)
41
+ priorityLabel = "P2 — Normal";
42
+ else if (score >= 3)
43
+ priorityLabel = "P3 — Low";
44
+ else
45
+ priorityLabel = "P4 — Backlog";
46
+ results.push({
47
+ rank: 0,
48
+ ruleId: f.ruleId,
49
+ title: f.title,
50
+ severity: f.severity,
51
+ priorityScore: score,
52
+ priorityLabel,
53
+ factors,
54
+ });
55
+ }
56
+ results.sort((a, b) => b.priorityScore - a.priorityScore);
57
+ for (let i = 0; i < results.length; i++) {
58
+ results[i].rank = i + 1;
59
+ }
60
+ return results;
61
+ }
62
+ export function runFindingAutoPriority(argv) {
63
+ if (argv.includes("--help") || argv.includes("-h")) {
64
+ console.log(`Usage: judges finding-auto-priority [options]
65
+
66
+ Auto-prioritize findings with multi-factor scoring.
67
+
68
+ Options:
69
+ --report <path> Path to verdict JSON
70
+ --format <fmt> Output format: table (default) or json
71
+ -h, --help Show this help message`);
72
+ return;
73
+ }
74
+ const formatIdx = argv.indexOf("--format");
75
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
76
+ const reportIdx = argv.indexOf("--report");
77
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
78
+ ? join(process.cwd(), argv[reportIdx + 1])
79
+ : join(process.cwd(), ".judges", "last-verdict.json");
80
+ if (!existsSync(reportPath)) {
81
+ console.log(`No report found at: ${reportPath}`);
82
+ return;
83
+ }
84
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
85
+ const prioritized = prioritize(data);
86
+ if (format === "json") {
87
+ console.log(JSON.stringify(prioritized, null, 2));
88
+ return;
89
+ }
90
+ console.log(`\n=== Auto Priority (${prioritized.length} findings) ===\n`);
91
+ if (prioritized.length === 0) {
92
+ console.log("No findings to prioritize.");
93
+ return;
94
+ }
95
+ console.log(" " + "#".padEnd(4) + "Score".padEnd(8) + "Priority".padEnd(18) + "Rule ID");
96
+ console.log(" " + "-".repeat(55));
97
+ for (const p of prioritized) {
98
+ console.log(" " + String(p.rank).padEnd(4) + String(p.priorityScore).padEnd(8) + p.priorityLabel.padEnd(18) + p.ruleId);
99
+ }
100
+ }
101
+ //# sourceMappingURL=finding-auto-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-auto-priority.js","sourceRoot":"","sources":["../../src/commands/finding-auto-priority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingClusterSummary(argv: string[]): void;
2
+ //# sourceMappingURL=finding-cluster-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cluster-summary.d.ts","sourceRoot":"","sources":["../../src/commands/finding-cluster-summary.ts"],"names":[],"mappings":"AA4EA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsD7D"}
@@ -0,0 +1,86 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function extractDomain(ruleId) {
4
+ const parts = ruleId.split("/");
5
+ return parts.length > 1 ? parts[0] : "general";
6
+ }
7
+ function clusterFindings(verdict) {
8
+ const domainMap = {};
9
+ for (const f of verdict.findings ?? []) {
10
+ const domain = extractDomain(f.ruleId);
11
+ if (!domainMap[domain]) {
12
+ domainMap[domain] = { count: 0, severities: {}, rules: {} };
13
+ }
14
+ domainMap[domain].count += 1;
15
+ domainMap[domain].severities[f.severity] = (domainMap[domain].severities[f.severity] ?? 0) + 1;
16
+ domainMap[domain].rules[f.ruleId] = (domainMap[domain].rules[f.ruleId] ?? 0) + 1;
17
+ }
18
+ const clusters = [];
19
+ for (const [domain, data] of Object.entries(domainMap)) {
20
+ const topRules = Object.entries(data.rules)
21
+ .map(([ruleId, count]) => ({ ruleId, count }))
22
+ .sort((a, b) => b.count - a.count)
23
+ .slice(0, 5);
24
+ const dominantSeverity = Object.entries(data.severities).sort((a, b) => b[1] - a[1])[0];
25
+ const summary = dominantSeverity
26
+ ? `${data.count} findings, predominantly ${dominantSeverity[0]} severity (${dominantSeverity[1]}). Top rule: ${topRules[0]?.ruleId ?? "unknown"}`
27
+ : `${data.count} findings in ${domain}`;
28
+ clusters.push({
29
+ domain,
30
+ count: data.count,
31
+ severityCounts: data.severities,
32
+ topRules,
33
+ summary,
34
+ });
35
+ }
36
+ clusters.sort((a, b) => b.count - a.count);
37
+ const total = verdict.findings?.length ?? 0;
38
+ return { totalFindings: total, clusterCount: clusters.length, clusters };
39
+ }
40
+ export function runFindingClusterSummary(argv) {
41
+ if (argv.includes("--help") || argv.includes("-h")) {
42
+ console.log(`Usage: judges finding-cluster-summary [options]
43
+
44
+ Summarise finding clusters by domain/rule-prefix.
45
+
46
+ Options:
47
+ --report <path> Path to verdict JSON
48
+ --format <fmt> Output format: table (default) or json
49
+ -h, --help Show this help message`);
50
+ return;
51
+ }
52
+ const formatIdx = argv.indexOf("--format");
53
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
54
+ const reportIdx = argv.indexOf("--report");
55
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
56
+ ? join(process.cwd(), argv[reportIdx + 1])
57
+ : join(process.cwd(), ".judges", "last-verdict.json");
58
+ if (!existsSync(reportPath)) {
59
+ console.log(`No report found at: ${reportPath}`);
60
+ return;
61
+ }
62
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
63
+ const report = clusterFindings(data);
64
+ if (format === "json") {
65
+ console.log(JSON.stringify(report, null, 2));
66
+ return;
67
+ }
68
+ console.log(`\n=== Finding Clusters (${report.clusterCount} domains, ${report.totalFindings} findings) ===\n`);
69
+ if (report.clusters.length === 0) {
70
+ console.log("No findings to cluster.");
71
+ return;
72
+ }
73
+ for (const c of report.clusters) {
74
+ const severityBar = Object.entries(c.severityCounts)
75
+ .map(([s, n]) => `${s}:${n}`)
76
+ .join(" ");
77
+ console.log(` [${c.domain}] ${c.count} findings (${severityBar})`);
78
+ console.log(` ${c.summary}`);
79
+ if (c.topRules.length > 1) {
80
+ const ruleList = c.topRules.map((r) => `${r.ruleId}(${r.count})`).join(", ");
81
+ console.log(` Top rules: ${ruleList}`);
82
+ }
83
+ console.log();
84
+ }
85
+ }
86
+ //# sourceMappingURL=finding-cluster-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-cluster-summary.js","sourceRoot":"","sources":["../../src/commands/finding-cluster-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAuB5B,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,OAAwB;IAC/C,MAAM,SAAS,GAGX,EAAE,CAAC;IAEP,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC9D,CAAC;QAED,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC7B,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/F,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAExF,MAAM,OAAO,GAAG,gBAAgB;YAC9B,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,4BAA4B,gBAAgB,CAAC,CAAC,CAAC,cAAc,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,SAAS,EAAE;YACjJ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,gBAAgB,MAAM,EAAE,CAAC;QAE1C,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,UAAU;YAC/B,QAAQ;YACR,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;IAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;8CAO8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEvF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GACd,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAoB,CAAC;IAC9E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,YAAY,aAAa,MAAM,CAAC,aAAa,kBAAkB,CAAC,CAAC;IAE/G,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,cAAc,WAAW,GAAG,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingContextLink(argv: string[]): void;
2
+ //# sourceMappingURL=finding-context-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-link.d.ts","sourceRoot":"","sources":["../../src/commands/finding-context-link.ts"],"names":[],"mappings":"AA8EA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkD1D"}
@@ -0,0 +1,95 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ const DEFAULT_DOC_INDEX = {
4
+ injection: [
5
+ { category: "OWASP", title: "Injection Prevention", path: "docs/owasp-injection.md" },
6
+ { category: "CWE", title: "CWE-89 SQL Injection", path: "docs/cwe-89.md" },
7
+ ],
8
+ xss: [
9
+ { category: "OWASP", title: "XSS Prevention", path: "docs/owasp-xss.md" },
10
+ { category: "CWE", title: "CWE-79 Cross-Site Scripting", path: "docs/cwe-79.md" },
11
+ ],
12
+ auth: [
13
+ { category: "OWASP", title: "Authentication Best Practices", path: "docs/owasp-auth.md" },
14
+ { category: "CWE", title: "CWE-287 Improper Authentication", path: "docs/cwe-287.md" },
15
+ ],
16
+ crypto: [
17
+ { category: "OWASP", title: "Cryptographic Failures", path: "docs/owasp-crypto.md" },
18
+ { category: "CWE", title: "CWE-327 Broken Crypto", path: "docs/cwe-327.md" },
19
+ ],
20
+ access: [
21
+ { category: "OWASP", title: "Broken Access Control", path: "docs/owasp-access.md" },
22
+ { category: "CWE", title: "CWE-284 Access Control", path: "docs/cwe-284.md" },
23
+ ],
24
+ quality: [{ category: "Guide", title: "Code Quality Guidelines", path: "docs/quality-guide.md" }],
25
+ };
26
+ function loadDocIndex(indexPath) {
27
+ if (indexPath && existsSync(indexPath)) {
28
+ try {
29
+ return JSON.parse(readFileSync(indexPath, "utf-8"));
30
+ }
31
+ catch {
32
+ console.log("Warning: could not parse doc index, using defaults");
33
+ }
34
+ }
35
+ return DEFAULT_DOC_INDEX;
36
+ }
37
+ function linkFindings(verdict, docIndex) {
38
+ const results = [];
39
+ for (const f of verdict.findings ?? []) {
40
+ const combined = (f.ruleId + " " + f.title).toLowerCase();
41
+ const refs = [];
42
+ for (const [keyword, docs] of Object.entries(docIndex)) {
43
+ if (combined.includes(keyword)) {
44
+ for (const doc of docs)
45
+ refs.push(doc);
46
+ }
47
+ }
48
+ results.push({ ruleId: f.ruleId, title: f.title, severity: f.severity, references: refs });
49
+ }
50
+ results.sort((a, b) => b.references.length - a.references.length);
51
+ return results;
52
+ }
53
+ export function runFindingContextLink(argv) {
54
+ if (argv.includes("--help") || argv.includes("-h")) {
55
+ console.log(`Usage: judges finding-context-link [options]
56
+
57
+ Link findings to relevant documentation.
58
+
59
+ Options:
60
+ --report <path> Path to verdict JSON
61
+ --docs <path> Path to custom documentation index JSON
62
+ --format <fmt> Output format: table (default) or json
63
+ -h, --help Show this help message`);
64
+ return;
65
+ }
66
+ const formatIdx = argv.indexOf("--format");
67
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
68
+ const reportIdx = argv.indexOf("--report");
69
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
70
+ ? join(process.cwd(), argv[reportIdx + 1])
71
+ : join(process.cwd(), ".judges", "last-verdict.json");
72
+ const docsIdx = argv.indexOf("--docs");
73
+ const docsPath = docsIdx !== -1 && argv[docsIdx + 1] ? join(process.cwd(), argv[docsIdx + 1]) : undefined;
74
+ if (!existsSync(reportPath)) {
75
+ console.log(`No report found at: ${reportPath}`);
76
+ return;
77
+ }
78
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
79
+ const docIndex = loadDocIndex(docsPath);
80
+ const linked = linkFindings(data, docIndex);
81
+ if (format === "json") {
82
+ console.log(JSON.stringify(linked, null, 2));
83
+ return;
84
+ }
85
+ const withRefs = linked.filter((l) => l.references.length > 0);
86
+ console.log(`\n=== Context Links (${withRefs.length} linked of ${linked.length} findings) ===\n`);
87
+ for (const entry of withRefs) {
88
+ console.log(` [${entry.severity.toUpperCase()}] ${entry.ruleId}: ${entry.title}`);
89
+ for (const ref of entry.references) {
90
+ console.log(` [${ref.category}] ${ref.title} — ${ref.path}`);
91
+ }
92
+ console.log();
93
+ }
94
+ }
95
+ //# sourceMappingURL=finding-context-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-context-link.js","sourceRoot":"","sources":["../../src/commands/finding-context-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingDependencyImpact(argv: string[]): void;
2
+ //# sourceMappingURL=finding-dependency-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-dependency-impact.d.ts","sourceRoot":"","sources":["../../src/commands/finding-dependency-impact.ts"],"names":[],"mappings":"AAiFA,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmD/D"}
@@ -0,0 +1,98 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ const DEP_PATTERNS = [
4
+ "dependency",
5
+ "dep-",
6
+ "package",
7
+ "npm",
8
+ "import",
9
+ "require",
10
+ "module",
11
+ "library",
12
+ "vendor",
13
+ "third-party",
14
+ "outdated",
15
+ "vulnerable",
16
+ "cve",
17
+ "supply-chain",
18
+ ];
19
+ function analyzeDependencyImpact(verdict) {
20
+ const findings = [];
21
+ for (const f of verdict.findings ?? []) {
22
+ const combined = (f.ruleId + " " + f.title + " " + f.recommendation).toLowerCase();
23
+ const isDep = DEP_PATTERNS.some((p) => combined.includes(p));
24
+ let impactLevel;
25
+ if (f.severity === "critical")
26
+ impactLevel = "Critical — immediate action required";
27
+ else if (f.severity === "high")
28
+ impactLevel = "High — affects production security";
29
+ else if (isDep)
30
+ impactLevel = "Moderate — dependency risk present";
31
+ else
32
+ impactLevel = "Low — minimal dependency impact";
33
+ findings.push({
34
+ ruleId: f.ruleId,
35
+ title: f.title,
36
+ severity: f.severity,
37
+ isDependencyRelated: isDep,
38
+ impactLevel,
39
+ recommendation: f.recommendation,
40
+ });
41
+ }
42
+ const depFindings = findings.filter((f) => f.isDependencyRelated);
43
+ findings.sort((a, b) => {
44
+ if (a.isDependencyRelated && !b.isDependencyRelated)
45
+ return -1;
46
+ if (!a.isDependencyRelated && b.isDependencyRelated)
47
+ return 1;
48
+ return 0;
49
+ });
50
+ return {
51
+ totalFindings: findings.length,
52
+ dependencyFindings: depFindings.length,
53
+ percentage: findings.length > 0 ? Math.round((depFindings.length / findings.length) * 100) : 0,
54
+ findings,
55
+ };
56
+ }
57
+ export function runFindingDependencyImpact(argv) {
58
+ if (argv.includes("--help") || argv.includes("-h")) {
59
+ console.log(`Usage: judges finding-dependency-impact [options]
60
+
61
+ Show impact of dependency-related findings.
62
+
63
+ Options:
64
+ --report <path> Path to verdict JSON
65
+ --format <fmt> Output format: table (default) or json
66
+ -h, --help Show this help message`);
67
+ return;
68
+ }
69
+ const formatIdx = argv.indexOf("--format");
70
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
71
+ const reportIdx = argv.indexOf("--report");
72
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
73
+ ? join(process.cwd(), argv[reportIdx + 1])
74
+ : join(process.cwd(), ".judges", "last-verdict.json");
75
+ if (!existsSync(reportPath)) {
76
+ console.log(`No report found at: ${reportPath}`);
77
+ return;
78
+ }
79
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
80
+ const impact = analyzeDependencyImpact(data);
81
+ if (format === "json") {
82
+ console.log(JSON.stringify(impact, null, 2));
83
+ return;
84
+ }
85
+ console.log(`\n=== Dependency Impact (${impact.dependencyFindings}/${impact.totalFindings} = ${impact.percentage}%) ===\n`);
86
+ const depFindings = impact.findings.filter((f) => f.isDependencyRelated);
87
+ if (depFindings.length === 0) {
88
+ console.log("No dependency-related findings detected.");
89
+ return;
90
+ }
91
+ for (const f of depFindings) {
92
+ console.log(` [${f.severity.toUpperCase()}] ${f.ruleId}`);
93
+ console.log(` ${f.title}`);
94
+ console.log(` Impact: ${f.impactLevel}`);
95
+ console.log();
96
+ }
97
+ }
98
+ //# sourceMappingURL=finding-dependency-impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-dependency-impact.js","sourceRoot":"","sources":["../../src/commands/finding-dependency-impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAyB5B,MAAM,YAAY,GAAG;IACnB,YAAY;IACZ,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,UAAU;IACV,YAAY;IACZ,KAAK;IACL,cAAc;CACf,CAAC;AAEF,SAAS,uBAAuB,CAAC,OAAwB;IACvD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU;YAAE,WAAW,GAAG,sCAAsC,CAAC;aAC/E,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;YAAE,WAAW,GAAG,oCAAoC,CAAC;aAC9E,IAAI,KAAK;YAAE,WAAW,GAAG,oCAAoC,CAAC;;YAC9D,WAAW,GAAG,iCAAiC,CAAC;QAErD,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,mBAAmB,EAAE,KAAK;YAC1B,WAAW;YACX,cAAc,EAAE,CAAC,CAAC,cAAc;SACjC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAClE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC,mBAAmB;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,mBAAmB;YAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,kBAAkB,EAAE,WAAW,CAAC,MAAM;QACtC,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAc;IACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;8CAO8B,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAEvF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,UAAU,GACd,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAoB,CAAC;IAC9E,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,4BAA4B,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,aAAa,MAAM,MAAM,CAAC,UAAU,UAAU,CAC/G,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACzE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingFixEstimate(argv: string[]): void;
2
+ //# sourceMappingURL=finding-fix-estimate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-estimate.d.ts","sourceRoot":"","sources":["../../src/commands/finding-fix-estimate.ts"],"names":[],"mappings":"AAsDA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA2E1D"}
@@ -0,0 +1,96 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ function estimateFixTime(finding) {
4
+ const hasPatch = finding.patch !== undefined && finding.patch !== null;
5
+ const recLength = finding.recommendation.length;
6
+ let baseMinutes;
7
+ if (finding.severity === "critical")
8
+ baseMinutes = 120;
9
+ else if (finding.severity === "high")
10
+ baseMinutes = 60;
11
+ else if (finding.severity === "medium")
12
+ baseMinutes = 30;
13
+ else if (finding.severity === "low")
14
+ baseMinutes = 15;
15
+ else
16
+ baseMinutes = 10;
17
+ if (hasPatch)
18
+ baseMinutes = Math.round(baseMinutes * 0.4);
19
+ if (recLength > 200)
20
+ baseMinutes = Math.round(baseMinutes * 1.2);
21
+ let label;
22
+ if (baseMinutes <= 10)
23
+ label = "trivial (~10 min)";
24
+ else if (baseMinutes <= 30)
25
+ label = "quick (~30 min)";
26
+ else if (baseMinutes <= 60)
27
+ label = "moderate (~1 hr)";
28
+ else if (baseMinutes <= 120)
29
+ label = "significant (~2 hr)";
30
+ else
31
+ label = "major (2+ hr)";
32
+ return { minutes: baseMinutes, label };
33
+ }
34
+ export function runFindingFixEstimate(argv) {
35
+ if (argv.includes("--help") || argv.includes("-h")) {
36
+ console.log(`Usage: judges finding-fix-estimate [options]
37
+
38
+ Estimate fix effort for each finding.
39
+
40
+ Options:
41
+ --report <path> Path to verdict JSON
42
+ --format <fmt> Output format: table (default) or json
43
+ -h, --help Show this help message`);
44
+ return;
45
+ }
46
+ const formatIdx = argv.indexOf("--format");
47
+ const format = formatIdx !== -1 && argv[formatIdx + 1] ? argv[formatIdx + 1] : "table";
48
+ const reportIdx = argv.indexOf("--report");
49
+ const reportPath = reportIdx !== -1 && argv[reportIdx + 1]
50
+ ? join(process.cwd(), argv[reportIdx + 1])
51
+ : join(process.cwd(), ".judges", "last-verdict.json");
52
+ if (!existsSync(reportPath)) {
53
+ console.log(`No report found at: ${reportPath}`);
54
+ return;
55
+ }
56
+ const data = JSON.parse(readFileSync(reportPath, "utf-8"));
57
+ const findings = data.findings ?? [];
58
+ const estimates = [];
59
+ let totalMinutes = 0;
60
+ for (const f of findings) {
61
+ const hasPatch = f.patch !== undefined && f.patch !== null;
62
+ const est = estimateFixTime(f);
63
+ totalMinutes += est.minutes;
64
+ estimates.push({
65
+ ruleId: f.ruleId,
66
+ title: f.title,
67
+ severity: f.severity,
68
+ hasPatch,
69
+ estimateMinutes: est.minutes,
70
+ estimateLabel: est.label,
71
+ recommendation: f.recommendation,
72
+ });
73
+ }
74
+ estimates.sort((a, b) => b.estimateMinutes - a.estimateMinutes);
75
+ const report = {
76
+ totalFindings: estimates.length,
77
+ totalMinutes,
78
+ totalHours: Math.round((totalMinutes / 60) * 10) / 10,
79
+ estimates,
80
+ };
81
+ if (format === "json") {
82
+ console.log(JSON.stringify(report, null, 2));
83
+ return;
84
+ }
85
+ console.log(`\n=== Fix Estimates (${report.totalFindings} findings, ~${report.totalHours} hours total) ===\n`);
86
+ if (estimates.length === 0) {
87
+ console.log("No findings to estimate.");
88
+ return;
89
+ }
90
+ for (const e of estimates) {
91
+ const patchTag = e.hasPatch ? " [patch]" : "";
92
+ console.log(` ${e.estimateLabel.padEnd(22)} [${e.severity}] ${e.ruleId}${patchTag}`);
93
+ console.log(` ${e.title}`);
94
+ }
95
+ }
96
+ //# sourceMappingURL=finding-fix-estimate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-fix-estimate.js","sourceRoot":"","sources":["../../src/commands/finding-fix-estimate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runFindingNoiseScore(argv: string[]): void;
2
+ //# sourceMappingURL=finding-noise-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-noise-score.d.ts","sourceRoot":"","sources":["../../src/commands/finding-noise-score.ts"],"names":[],"mappings":"AA2DA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAyEzD"}