@kevinrabun/judges 3.22.1 → 3.23.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.
Files changed (64) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/api.d.ts +18 -5
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +15 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +54 -36
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/auto-detect.d.ts +62 -0
  10. package/dist/commands/auto-detect.d.ts.map +1 -0
  11. package/dist/commands/auto-detect.js +329 -0
  12. package/dist/commands/auto-detect.js.map +1 -0
  13. package/dist/commands/baseline.d.ts +46 -0
  14. package/dist/commands/baseline.d.ts.map +1 -1
  15. package/dist/commands/baseline.js +290 -27
  16. package/dist/commands/baseline.js.map +1 -1
  17. package/dist/commands/benchmark.d.ts +21 -3
  18. package/dist/commands/benchmark.d.ts.map +1 -1
  19. package/dist/commands/benchmark.js +365 -6
  20. package/dist/commands/benchmark.js.map +1 -1
  21. package/dist/commands/coverage.d.ts +41 -0
  22. package/dist/commands/coverage.d.ts.map +1 -0
  23. package/dist/commands/coverage.js +184 -0
  24. package/dist/commands/coverage.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +56 -0
  26. package/dist/commands/doctor.d.ts.map +1 -0
  27. package/dist/commands/doctor.js +363 -0
  28. package/dist/commands/doctor.js.map +1 -0
  29. package/dist/commands/feedback.d.ts +42 -0
  30. package/dist/commands/feedback.d.ts.map +1 -1
  31. package/dist/commands/feedback.js +129 -0
  32. package/dist/commands/feedback.js.map +1 -1
  33. package/dist/commands/rule-metrics.d.ts +44 -0
  34. package/dist/commands/rule-metrics.d.ts.map +1 -0
  35. package/dist/commands/rule-metrics.js +114 -0
  36. package/dist/commands/rule-metrics.js.map +1 -0
  37. package/dist/commands/rule.d.ts +65 -0
  38. package/dist/commands/rule.d.ts.map +1 -1
  39. package/dist/commands/rule.js +94 -0
  40. package/dist/commands/rule.js.map +1 -1
  41. package/dist/commands/snapshot.d.ts +81 -0
  42. package/dist/commands/snapshot.d.ts.map +1 -0
  43. package/dist/commands/snapshot.js +189 -0
  44. package/dist/commands/snapshot.js.map +1 -0
  45. package/dist/config.d.ts +35 -3
  46. package/dist/config.d.ts.map +1 -1
  47. package/dist/config.js +187 -2
  48. package/dist/config.js.map +1 -1
  49. package/dist/dedup.d.ts +35 -0
  50. package/dist/dedup.d.ts.map +1 -1
  51. package/dist/dedup.js +96 -0
  52. package/dist/dedup.js.map +1 -1
  53. package/dist/evaluators/index.d.ts +22 -2
  54. package/dist/evaluators/index.d.ts.map +1 -1
  55. package/dist/evaluators/index.js +144 -52
  56. package/dist/evaluators/index.js.map +1 -1
  57. package/dist/patches/index.d.ts.map +1 -1
  58. package/dist/patches/index.js +426 -0
  59. package/dist/patches/index.js.map +1 -1
  60. package/dist/types.d.ts +43 -0
  61. package/dist/types.d.ts.map +1 -1
  62. package/judgesrc.schema.json +5 -0
  63. package/package.json +1 -1
  64. package/server.json +2 -2
@@ -30,6 +30,8 @@ export interface FeedbackEntry {
30
30
  title?: string;
31
31
  /** Finding severity at time of feedback */
32
32
  severity?: string;
33
+ /** Contributor identifier (username, email, etc.) for team aggregation */
34
+ contributor?: string;
33
35
  }
34
36
  export interface FeedbackStore {
35
37
  /** Schema version for migration support */
@@ -75,6 +77,30 @@ export interface JudgeFeedbackStats {
75
77
  wontfix: number;
76
78
  fpRate: number;
77
79
  }
80
+ /**
81
+ * Team-wide aggregated feedback statistics from multiple contributors.
82
+ */
83
+ export interface TeamFeedbackStats extends FeedbackStats {
84
+ /** Number of distinct feedback sources merged */
85
+ contributorCount: number;
86
+ /** Per-rule details including contributor consensus */
87
+ perRuleTeam: Map<string, RuleTeamStats>;
88
+ /** Rules where ≥2 contributors independently flagged as FP */
89
+ consensusFpRules: string[];
90
+ /** Rules where feedback is split (some say TP, others say FP) */
91
+ disputedRules: string[];
92
+ }
93
+ /**
94
+ * Per-rule stats with multi-contributor consensus data.
95
+ */
96
+ export interface RuleTeamStats extends RuleFeedbackStats {
97
+ /** Number of distinct contributors who provided feedback for this rule */
98
+ contributors: number;
99
+ /** How many distinct contributors marked this rule as FP */
100
+ fpContributors: number;
101
+ /** Consensus strength: fpContributors / contributors (0-1) */
102
+ consensus: number;
103
+ }
78
104
  export declare function loadFeedbackStore(feedbackPath?: string): FeedbackStore;
79
105
  export declare function saveFeedbackStore(store: FeedbackStore, feedbackPath?: string): void;
80
106
  export declare function addFeedback(store: FeedbackStore, entry: FeedbackEntry): FeedbackStore;
@@ -83,5 +109,21 @@ export declare function computeFeedbackStats(store: FeedbackStore): FeedbackStat
83
109
  * Get a lookup map of FP rates by rule ID, suitable for confidence calibration.
84
110
  */
85
111
  export declare function getFpRateByRule(store: FeedbackStore): Map<string, number>;
112
+ /**
113
+ * Merge multiple feedback stores into a single aggregate store.
114
+ * Entries are deduplicated by {ruleId + verdict + timestamp + filePath}.
115
+ * Each source can be tagged with a contributor identifier.
116
+ */
117
+ export declare function mergeFeedbackStores(stores: FeedbackStore[], contributorLabels?: string[]): FeedbackStore;
118
+ /**
119
+ * Compute team-wide feedback statistics with multi-contributor consensus.
120
+ * Identifies rules where multiple contributors independently flagged issues
121
+ * as FP (consensus) or where feedback is split between TP and FP (disputed).
122
+ */
123
+ export declare function computeTeamFeedbackStats(store: FeedbackStore): TeamFeedbackStats;
124
+ /**
125
+ * Format team feedback stats as a human-readable summary.
126
+ */
127
+ export declare function formatTeamStatsOutput(stats: TeamFeedbackStats): string;
86
128
  export declare function runFeedback(argv: string[]): void;
87
129
  //# sourceMappingURL=feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,EAAE,eAAe,CAAC;IACzB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,OAAO,EAAE,CAAC,CAAC;IACX,2BAA2B;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,eAAe;IACf,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxC,2CAA2C;IAC3C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CActE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAQnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,CAKrF;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CA4DxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUzE;AAqID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4EhD"}
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
@@ -141,6 +141,135 @@ export function getFpRateByRule(store) {
141
141
  }
142
142
  return result;
143
143
  }
144
+ // ─── Team-wide Feedback Aggregation ─────────────────────────────────────────
145
+ /**
146
+ * Merge multiple feedback stores into a single aggregate store.
147
+ * Entries are deduplicated by {ruleId + verdict + timestamp + filePath}.
148
+ * Each source can be tagged with a contributor identifier.
149
+ */
150
+ export function mergeFeedbackStores(stores, contributorLabels) {
151
+ const merged = createEmptyStore();
152
+ const seen = new Set();
153
+ for (let i = 0; i < stores.length; i++) {
154
+ const store = stores[i];
155
+ const label = contributorLabels?.[i];
156
+ for (const entry of store.entries) {
157
+ // Tag with contributor if not already set
158
+ const tagged = label && !entry.contributor ? { ...entry, contributor: label } : entry;
159
+ // Dedup key: ruleId + verdict + timestamp + filePath
160
+ const key = `${tagged.ruleId}::${tagged.verdict}::${tagged.timestamp}::${tagged.filePath || ""}`;
161
+ if (!seen.has(key)) {
162
+ seen.add(key);
163
+ merged.entries.push(tagged);
164
+ }
165
+ }
166
+ }
167
+ merged.metadata.totalSubmissions = merged.entries.length;
168
+ merged.metadata.lastUpdated = new Date().toISOString();
169
+ return merged;
170
+ }
171
+ /**
172
+ * Compute team-wide feedback statistics with multi-contributor consensus.
173
+ * Identifies rules where multiple contributors independently flagged issues
174
+ * as FP (consensus) or where feedback is split between TP and FP (disputed).
175
+ */
176
+ export function computeTeamFeedbackStats(store) {
177
+ const base = computeFeedbackStats(store);
178
+ // Track per-rule contributor data
179
+ const ruleContributors = new Map();
180
+ const ruleFpContributors = new Map();
181
+ for (const entry of store.entries) {
182
+ const contributor = entry.contributor || "anonymous";
183
+ const rc = ruleContributors.get(entry.ruleId) ?? new Set();
184
+ rc.add(contributor);
185
+ ruleContributors.set(entry.ruleId, rc);
186
+ if (entry.verdict === "fp") {
187
+ const fc = ruleFpContributors.get(entry.ruleId) ?? new Set();
188
+ fc.add(contributor);
189
+ ruleFpContributors.set(entry.ruleId, fc);
190
+ }
191
+ }
192
+ // Build per-rule team stats
193
+ const perRuleTeam = new Map();
194
+ for (const [ruleId, ruleStats] of base.perRule) {
195
+ const contributors = ruleContributors.get(ruleId)?.size ?? 1;
196
+ const fpContributors = ruleFpContributors.get(ruleId)?.size ?? 0;
197
+ perRuleTeam.set(ruleId, {
198
+ ...ruleStats,
199
+ contributors,
200
+ fpContributors,
201
+ consensus: contributors > 0 ? fpContributors / contributors : 0,
202
+ });
203
+ }
204
+ // Identify consensus FP rules (≥2 contributors independently flagged FP)
205
+ const consensusFpRules = [];
206
+ const disputedRules = [];
207
+ for (const [ruleId, teamStats] of perRuleTeam) {
208
+ if (teamStats.fpContributors >= 2) {
209
+ consensusFpRules.push(ruleId);
210
+ }
211
+ // Disputed: has both TP and FP verdicts from different contributors
212
+ if (teamStats.tp > 0 && teamStats.fp > 0 && teamStats.contributors >= 2) {
213
+ disputedRules.push(ruleId);
214
+ }
215
+ }
216
+ // Count distinct contributors across all entries
217
+ const allContributors = new Set(store.entries.map((e) => e.contributor || "anonymous"));
218
+ return {
219
+ ...base,
220
+ contributorCount: allContributors.size,
221
+ perRuleTeam,
222
+ consensusFpRules: consensusFpRules.sort(),
223
+ disputedRules: disputedRules.sort(),
224
+ };
225
+ }
226
+ /**
227
+ * Format team feedback stats as a human-readable summary.
228
+ */
229
+ export function formatTeamStatsOutput(stats) {
230
+ const lines = [];
231
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
232
+ lines.push("║ Judges Panel — Team Feedback Statistics ║");
233
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
234
+ lines.push("");
235
+ lines.push(` Contributors : ${stats.contributorCount}`);
236
+ lines.push(` Total Feedback : ${stats.total}`);
237
+ lines.push(` True Positives : ${stats.truePositives}`);
238
+ lines.push(` False Positives : ${stats.falsePositives}`);
239
+ lines.push(` Won't Fix : ${stats.wontFix}`);
240
+ lines.push(` Team FP Rate : ${(stats.falsePositiveRate * 100).toFixed(1)}%`);
241
+ lines.push("");
242
+ if (stats.consensusFpRules.length > 0) {
243
+ lines.push(" ⚠ Consensus FP Rules (≥2 contributors agree):");
244
+ lines.push(" " + "─".repeat(55));
245
+ for (const ruleId of stats.consensusFpRules) {
246
+ const rs = stats.perRuleTeam.get(ruleId);
247
+ lines.push(` ${ruleId.padEnd(12)} ${rs.fpContributors}/${rs.contributors} contributors flagged FP (${(rs.fpRate * 100).toFixed(0)}% FP rate)`);
248
+ }
249
+ lines.push("");
250
+ }
251
+ if (stats.disputedRules.length > 0) {
252
+ lines.push(" ⚡ Disputed Rules (mixed TP/FP verdicts):");
253
+ lines.push(" " + "─".repeat(55));
254
+ for (const ruleId of stats.disputedRules) {
255
+ const rs = stats.perRuleTeam.get(ruleId);
256
+ lines.push(` ${ruleId.padEnd(12)} ${rs.tp}tp / ${rs.fp}fp from ${rs.contributors} contributors`);
257
+ }
258
+ lines.push("");
259
+ }
260
+ if (stats.perJudge.size > 0) {
261
+ lines.push(" Per-Judge FP Rates:");
262
+ lines.push(" " + "─".repeat(55));
263
+ const sorted = [...stats.perJudge.values()].sort((a, b) => b.fpRate - a.fpRate);
264
+ for (const j of sorted) {
265
+ const prefix = j.judgePrefix.padEnd(12);
266
+ const rate = `${(j.fpRate * 100).toFixed(1)}%`.padStart(6);
267
+ lines.push(` ${prefix} FP: ${rate} (${j.tp}tp / ${j.fp}fp / ${j.wontfix}wf)`);
268
+ }
269
+ lines.push("");
270
+ }
271
+ return lines.join("\n");
272
+ }
144
273
  function parseFeedbackArgs(argv) {
145
274
  const args = {
146
275
  subcommand: argv[3] || "stats",
@@ -1 +1 @@
1
- {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAmGxC,+EAA+E;AAE/E,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAEtD,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE;YACR,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,GAAG;YAChB,gBAAgB,EAAE,CAAC;SACpB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAqB;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,GAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAoB,EAAE,YAAqB;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAoB,EAAE,KAAoB;IACpE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;IAClC,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,oBAAoB,CAAC,KAAoB;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEvD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,iBAAiB;QACjB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,EAAE,EAAE,CAAC;aAC5B,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,EAAE,EAAE,CAAC;aACjC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAEhD,iBAAiB;QACjB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;YAC7C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC;YACR,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;SACV,CAAC;QACF,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,CAAC;aACtC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,SAAS,CAAC,EAAE,EAAE,CAAC;aAC3C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC1D,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAErC,8DAA8D;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI;gBACzC,WAAW,EAAE,MAAM;gBACnB,KAAK,EAAE,CAAC;gBACR,EAAE,EAAE,CAAC;gBACL,EAAE,EAAE,CAAC;gBACL,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;aACV,CAAC;YACF,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,UAAU,CAAC,EAAE,EAAE,CAAC;iBACvC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,UAAU,CAAC,EAAE,EAAE,CAAC;iBAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;gBAAE,UAAU,CAAC,OAAO,EAAE,CAAC;YAC3D,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;IACnC,OAAO;QACL,KAAK;QACL,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,OAAO;QAChB,iBAAiB,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/C,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACxB,wCAAwC;YACxC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB,EAAE,iBAA4B;IACvF,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;QAErC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,0CAA0C;YAC1C,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAEtF,qDAAqD;YACrD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACjG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACzD,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAoB;IAC3D,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEzC,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,WAAW,CAAC;QAErD,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC3D,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpB,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEvC,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAC7D,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpB,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IACrD,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QACjE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE;YACtB,GAAG,SAAS;YACZ,YAAY;YACZ,cAAc;YACd,SAAS,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACzE,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YAClC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,oEAAoE;QACpE,IAAI,SAAS,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YACxE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC;IAExF,OAAO;QACL,GAAG,IAAI;QACP,gBAAgB,EAAE,eAAe,CAAC,IAAI;QACtC,WAAW;QACX,gBAAgB,EAAE,gBAAgB,CAAC,IAAI,EAAE;QACzC,aAAa,EAAE,aAAa,CAAC,IAAI,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CACR,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,YAAY,6BAA6B,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CACtI,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,YAAY,eAAe,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAgBD,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,IAAI,GAAiB;QACzB,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO;QAC9B,MAAM,EAAE,MAAM;KACf,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAoB,CAAC;gBAC5C,MAAM;YACR,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,iBAAiB;gBACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAoB,CAAC;gBAC3C,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAChF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,QAAQ,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5F,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,QAAQ,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7D,iBAAiB,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEnD,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrE,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,KAAK,GAAkB;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1B,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAE5C,MAAM,YAAY,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,mCAAmC;gBACnC,MAAM,SAAS,GAAG;oBAChB,GAAG,KAAK;oBACR,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC1C,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAC7C,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACR,CAAC;QAED;YACE,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Finding, JudgeDefinition } from "../types.js";
2
+ export interface RuleHitEntry {
3
+ /** The rule ID, e.g. "SEC-001" */
4
+ ruleId: string;
5
+ /** How many times this rule fired */
6
+ hitCount: number;
7
+ /** Severity distribution */
8
+ bySeverity: Record<string, number>;
9
+ /** Judge ID that owns this rule (if determinable from prefix) */
10
+ judgeId?: string;
11
+ }
12
+ export interface RuleHitMetrics {
13
+ /** Rules that fired at least once, sorted by hit count descending */
14
+ activeRules: RuleHitEntry[];
15
+ /** Rule prefixes from loaded judges that produced zero findings */
16
+ silentJudges: Array<{
17
+ judgeId: string;
18
+ name: string;
19
+ rulePrefix: string;
20
+ }>;
21
+ /** Total number of findings analyzed */
22
+ totalFindings: number;
23
+ /** Number of distinct rule IDs that fired */
24
+ uniqueRulesTriggered: number;
25
+ /** Top N noisiest rules */
26
+ noisiest: RuleHitEntry[];
27
+ }
28
+ /**
29
+ * Map a rule ID back to its owning judge by matching the prefix.
30
+ */
31
+ export declare function findJudgeForRule(ruleId: string, judges: JudgeDefinition[]): JudgeDefinition | undefined;
32
+ /**
33
+ * Compute metrics about which rules fired and which didn't.
34
+ *
35
+ * @param findings - All findings from one or more evaluation runs
36
+ * @param judges - The loaded judge definitions (to identify silent judges)
37
+ * @param topN - How many noisy rules to highlight (default: 5)
38
+ */
39
+ export declare function computeRuleHitMetrics(findings: Finding[], judges: JudgeDefinition[], topN?: number): RuleHitMetrics;
40
+ /**
41
+ * Format rule hit metrics as a human-readable report.
42
+ */
43
+ export declare function formatRuleHitReport(metrics: RuleHitMetrics): string;
44
+ //# sourceMappingURL=rule-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-metrics.d.ts","sourceRoot":"","sources":["../../src/commands/rule-metrics.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,mEAAmE;IACnE,YAAY,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,SAAS,CAIvG;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,eAAe,EAAE,EACzB,IAAI,GAAE,MAAU,GACf,cAAc,CAwChB;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAuDnE"}
@@ -0,0 +1,114 @@
1
+ // ─── Rule Hit Metrics ────────────────────────────────────────────────────────
2
+ // Track which rules fire frequently, which never fire, and identify noisy or
3
+ // silent rules. Helps teams tune their judge configuration for best signal.
4
+ //
5
+ // Usage (programmatic):
6
+ // const metrics = computeRuleHitMetrics(findings, judges);
7
+ // console.log(formatRuleHitReport(metrics));
8
+ // ──────────────────────────────────────────────────────────────────────────────
9
+ // ─── Computation ────────────────────────────────────────────────────────────
10
+ /**
11
+ * Map a rule ID back to its owning judge by matching the prefix.
12
+ */
13
+ export function findJudgeForRule(ruleId, judges) {
14
+ // Rule IDs look like "SEC-001", "AUTH-003". The prefix is everything before the dash+digits.
15
+ const prefix = ruleId.replace(/-\d+$/, "");
16
+ return judges.find((j) => j.rulePrefix === prefix);
17
+ }
18
+ /**
19
+ * Compute metrics about which rules fired and which didn't.
20
+ *
21
+ * @param findings - All findings from one or more evaluation runs
22
+ * @param judges - The loaded judge definitions (to identify silent judges)
23
+ * @param topN - How many noisy rules to highlight (default: 5)
24
+ */
25
+ export function computeRuleHitMetrics(findings, judges, topN = 5) {
26
+ // Count hits per rule
27
+ const hitMap = new Map();
28
+ for (const f of findings) {
29
+ let entry = hitMap.get(f.ruleId);
30
+ if (!entry) {
31
+ entry = {
32
+ ruleId: f.ruleId,
33
+ hitCount: 0,
34
+ bySeverity: {},
35
+ judgeId: findJudgeForRule(f.ruleId, judges)?.id,
36
+ };
37
+ hitMap.set(f.ruleId, entry);
38
+ }
39
+ entry.hitCount++;
40
+ entry.bySeverity[f.severity] = (entry.bySeverity[f.severity] ?? 0) + 1;
41
+ }
42
+ // Sort by hit count descending
43
+ const activeRules = [...hitMap.values()].sort((a, b) => b.hitCount - a.hitCount);
44
+ // Identify judges whose prefix never appeared in any finding
45
+ const triggeredPrefixes = new Set();
46
+ for (const ruleId of hitMap.keys()) {
47
+ const prefix = ruleId.replace(/-\d+$/, "");
48
+ triggeredPrefixes.add(prefix);
49
+ }
50
+ const silentJudges = judges
51
+ .filter((j) => !triggeredPrefixes.has(j.rulePrefix))
52
+ .map((j) => ({ judgeId: j.id, name: j.name, rulePrefix: j.rulePrefix }));
53
+ return {
54
+ activeRules,
55
+ silentJudges,
56
+ totalFindings: findings.length,
57
+ uniqueRulesTriggered: hitMap.size,
58
+ noisiest: activeRules.slice(0, topN),
59
+ };
60
+ }
61
+ // ─── Formatting ─────────────────────────────────────────────────────────────
62
+ /**
63
+ * Format rule hit metrics as a human-readable report.
64
+ */
65
+ export function formatRuleHitReport(metrics) {
66
+ const lines = [];
67
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
68
+ lines.push("║ Judges Panel — Rule Hit Metrics ║");
69
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
70
+ lines.push("");
71
+ if (metrics.totalFindings === 0) {
72
+ lines.push(" No findings to analyze. Run an evaluation first.");
73
+ return lines.join("\n");
74
+ }
75
+ lines.push(` Total findings : ${metrics.totalFindings}`);
76
+ lines.push(` Unique rules fired : ${metrics.uniqueRulesTriggered}`);
77
+ lines.push(` Silent judges : ${metrics.silentJudges.length}`);
78
+ lines.push("");
79
+ // Noisiest rules
80
+ if (metrics.noisiest.length > 0) {
81
+ lines.push(" 🔊 Noisiest Rules:");
82
+ lines.push(" " + "─".repeat(50));
83
+ for (const entry of metrics.noisiest) {
84
+ const pct = ((entry.hitCount / metrics.totalFindings) * 100).toFixed(1);
85
+ const judge = entry.judgeId ? ` (${entry.judgeId})` : "";
86
+ lines.push(` ${entry.ruleId.padEnd(16)} ${String(entry.hitCount).padStart(4)} hits ${pct}%${judge}`);
87
+ }
88
+ lines.push("");
89
+ }
90
+ // Silent judges
91
+ if (metrics.silentJudges.length > 0) {
92
+ lines.push(" 🔇 Silent Judges (zero findings):");
93
+ lines.push(" " + "─".repeat(50));
94
+ for (const j of metrics.silentJudges) {
95
+ lines.push(` ${j.rulePrefix.padEnd(10)} ${j.name}`);
96
+ }
97
+ lines.push("");
98
+ }
99
+ // Full breakdown
100
+ if (metrics.activeRules.length > 0) {
101
+ lines.push(" 📋 All Active Rules:");
102
+ lines.push(" " + "─".repeat(50));
103
+ for (const entry of metrics.activeRules) {
104
+ const sevParts = [];
105
+ for (const [sev, count] of Object.entries(entry.bySeverity)) {
106
+ sevParts.push(`${sev}:${count}`);
107
+ }
108
+ lines.push(` ${entry.ruleId.padEnd(16)} ${String(entry.hitCount).padStart(4)} hits [${sevParts.join(", ")}]`);
109
+ }
110
+ lines.push("");
111
+ }
112
+ return lines.join("\n");
113
+ }
114
+ //# sourceMappingURL=rule-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-metrics.js","sourceRoot":"","sources":["../../src/commands/rule-metrics.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,71 @@ export declare function generateRuleTemplate(id: string): SerializedRule;
41
41
  * Test a custom rule against sample code.
42
42
  */
43
43
  export declare function testRule(rule: CustomRule, code: string, language: string): Finding[];
44
+ /**
45
+ * A single test case for a custom rule.
46
+ * Specifies code input and what the rule should or should not flag.
47
+ */
48
+ export interface RuleTestCase {
49
+ /** Short name for the test case */
50
+ name: string;
51
+ /** Code snippet to evaluate */
52
+ code: string;
53
+ /** Language of the code snippet */
54
+ language?: string;
55
+ /** Minimum expected finding count (default: 1 for shouldMatch) */
56
+ expectedMinFindings?: number;
57
+ /** Maximum expected finding count (default: 0 for shouldNotMatch) */
58
+ expectedMaxFindings?: number;
59
+ /** Whether the rule should produce findings (true) or not (false) */
60
+ shouldMatch: boolean;
61
+ /** If shouldMatch, optionally assert a specific rule ID in findings */
62
+ expectedRuleId?: string;
63
+ /** If shouldMatch, optionally assert findings reference specific lines */
64
+ expectedLines?: number[];
65
+ }
66
+ /**
67
+ * Result of running a single rule test case.
68
+ */
69
+ export interface RuleTestResult {
70
+ /** Test case name */
71
+ name: string;
72
+ /** Whether the test passed */
73
+ passed: boolean;
74
+ /** Number of findings produced */
75
+ findingCount: number;
76
+ /** Failure reason if not passed */
77
+ reason?: string;
78
+ /** The actual findings for inspection */
79
+ findings: Finding[];
80
+ }
81
+ /**
82
+ * Summary of running a test suite for a rule.
83
+ */
84
+ export interface RuleTestSuiteResult {
85
+ /** Rule ID that was tested */
86
+ ruleId: string;
87
+ /** Total test cases run */
88
+ total: number;
89
+ /** Test cases that passed */
90
+ passed: number;
91
+ /** Test cases that failed */
92
+ failed: number;
93
+ /** Individual test results */
94
+ results: RuleTestResult[];
95
+ }
96
+ /**
97
+ * Run a set of test cases against a custom rule and return pass/fail results.
98
+ */
99
+ export declare function runRuleTests(rule: CustomRule, testCases: RuleTestCase[]): RuleTestSuiteResult;
100
+ /**
101
+ * Validate a set of test cases for structural correctness.
102
+ * Returns an array of error messages (empty if valid).
103
+ */
104
+ export declare function validateRuleTestSuite(testCases: RuleTestCase[]): string[];
105
+ /**
106
+ * Format test suite results as a human-readable report.
107
+ */
108
+ export declare function formatRuleTestResults(result: RuleTestSuiteResult): string;
44
109
  export declare function parseRuleArgs(argv: string[]): {
45
110
  subcommand: string;
46
111
  ruleId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/commands/rule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAY,GAAG,cAAc,CAUpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,GAAE,MAAY,GAAG,IAAI,CAGhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,GAAG,UAAU,CAY9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAa/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CA8BpF;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAepG;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4F5C"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/commands/rule.ts"],"names":[],"mappings":"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"}
@@ -94,6 +94,100 @@ export function testRule(rule, code, language) {
94
94
  }
95
95
  return findings;
96
96
  }
97
+ /**
98
+ * Run a set of test cases against a custom rule and return pass/fail results.
99
+ */
100
+ export function runRuleTests(rule, testCases) {
101
+ const results = [];
102
+ for (const tc of testCases) {
103
+ const lang = tc.language || "typescript";
104
+ const findings = testRule(rule, tc.code, lang);
105
+ let passed = true;
106
+ let reason;
107
+ if (tc.shouldMatch) {
108
+ const minExpected = tc.expectedMinFindings ?? 1;
109
+ if (findings.length < minExpected) {
110
+ passed = false;
111
+ reason = `Expected at least ${minExpected} finding(s) but got ${findings.length}`;
112
+ }
113
+ if (tc.expectedMaxFindings !== undefined && findings.length > tc.expectedMaxFindings) {
114
+ passed = false;
115
+ reason = `Expected at most ${tc.expectedMaxFindings} finding(s) but got ${findings.length}`;
116
+ }
117
+ if (passed && tc.expectedRuleId) {
118
+ if (!findings.some((f) => f.ruleId === tc.expectedRuleId)) {
119
+ passed = false;
120
+ reason = `Expected finding with ruleId "${tc.expectedRuleId}" not found`;
121
+ }
122
+ }
123
+ if (passed && tc.expectedLines && tc.expectedLines.length > 0) {
124
+ const actualLines = new Set(findings.flatMap((f) => f.lineNumbers || []));
125
+ const missing = tc.expectedLines.filter((l) => !actualLines.has(l));
126
+ if (missing.length > 0) {
127
+ passed = false;
128
+ reason = `Expected findings on line(s) ${missing.join(", ")} but not found`;
129
+ }
130
+ }
131
+ }
132
+ else {
133
+ const maxExpected = tc.expectedMaxFindings ?? 0;
134
+ if (findings.length > maxExpected) {
135
+ passed = false;
136
+ reason = `Expected no findings but got ${findings.length}`;
137
+ }
138
+ }
139
+ results.push({ name: tc.name, passed, findingCount: findings.length, reason, findings });
140
+ }
141
+ return {
142
+ ruleId: rule.id,
143
+ total: results.length,
144
+ passed: results.filter((r) => r.passed).length,
145
+ failed: results.filter((r) => !r.passed).length,
146
+ results,
147
+ };
148
+ }
149
+ /**
150
+ * Validate a set of test cases for structural correctness.
151
+ * Returns an array of error messages (empty if valid).
152
+ */
153
+ export function validateRuleTestSuite(testCases) {
154
+ const errors = [];
155
+ const names = new Set();
156
+ for (let i = 0; i < testCases.length; i++) {
157
+ const tc = testCases[i];
158
+ if (!tc.name || tc.name.trim().length === 0) {
159
+ errors.push(`Test case ${i}: missing name`);
160
+ }
161
+ if (names.has(tc.name)) {
162
+ errors.push(`Test case ${i}: duplicate name "${tc.name}"`);
163
+ }
164
+ names.add(tc.name);
165
+ if (!tc.code && tc.code !== "") {
166
+ errors.push(`Test case ${i} (${tc.name}): missing code`);
167
+ }
168
+ if (typeof tc.shouldMatch !== "boolean") {
169
+ errors.push(`Test case ${i} (${tc.name}): shouldMatch must be boolean`);
170
+ }
171
+ }
172
+ return errors;
173
+ }
174
+ /**
175
+ * Format test suite results as a human-readable report.
176
+ */
177
+ export function formatRuleTestResults(result) {
178
+ const lines = [];
179
+ const icon = result.failed === 0 ? "✅" : "❌";
180
+ lines.push(`${icon} Rule: ${result.ruleId} — ${result.passed}/${result.total} tests passed`);
181
+ lines.push("─".repeat(60));
182
+ for (const tr of result.results) {
183
+ const status = tr.passed ? " ✓" : " ✗";
184
+ lines.push(`${status} ${tr.name} (${tr.findingCount} finding${tr.findingCount !== 1 ? "s" : ""})`);
185
+ if (!tr.passed && tr.reason) {
186
+ lines.push(` → ${tr.reason}`);
187
+ }
188
+ }
189
+ return lines.join("\n");
190
+ }
97
191
  // ─── CLI Handler ─────────────────────────────────────────────────────────────
98
192
  export function parseRuleArgs(argv) {
99
193
  const subcommand = argv[3] || "list";