@kevinrabun/judges 3.43.0 → 3.45.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 (70) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +112 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/burndown.d.ts +27 -0
  6. package/dist/commands/burndown.d.ts.map +1 -0
  7. package/dist/commands/burndown.js +180 -0
  8. package/dist/commands/burndown.js.map +1 -0
  9. package/dist/commands/compare-runs.d.ts +38 -0
  10. package/dist/commands/compare-runs.d.ts.map +1 -0
  11. package/dist/commands/compare-runs.js +229 -0
  12. package/dist/commands/compare-runs.js.map +1 -0
  13. package/dist/commands/correlate.d.ts +28 -0
  14. package/dist/commands/correlate.d.ts.map +1 -0
  15. package/dist/commands/correlate.js +242 -0
  16. package/dist/commands/correlate.js.map +1 -0
  17. package/dist/commands/digest.d.ts +20 -0
  18. package/dist/commands/digest.d.ts.map +1 -0
  19. package/dist/commands/digest.js +222 -0
  20. package/dist/commands/digest.js.map +1 -0
  21. package/dist/commands/explain-finding.d.ts +8 -0
  22. package/dist/commands/explain-finding.d.ts.map +1 -0
  23. package/dist/commands/explain-finding.js +279 -0
  24. package/dist/commands/explain-finding.js.map +1 -0
  25. package/dist/commands/judge-reputation.d.ts +29 -0
  26. package/dist/commands/judge-reputation.d.ts.map +1 -0
  27. package/dist/commands/judge-reputation.js +199 -0
  28. package/dist/commands/judge-reputation.js.map +1 -0
  29. package/dist/commands/kb.d.ts +41 -0
  30. package/dist/commands/kb.d.ts.map +1 -0
  31. package/dist/commands/kb.js +231 -0
  32. package/dist/commands/kb.js.map +1 -0
  33. package/dist/commands/noise-advisor.d.ts +30 -0
  34. package/dist/commands/noise-advisor.d.ts.map +1 -0
  35. package/dist/commands/noise-advisor.js +171 -0
  36. package/dist/commands/noise-advisor.js.map +1 -0
  37. package/dist/commands/query.d.ts +20 -0
  38. package/dist/commands/query.d.ts.map +1 -0
  39. package/dist/commands/query.js +230 -0
  40. package/dist/commands/query.js.map +1 -0
  41. package/dist/commands/recommend.d.ts +21 -0
  42. package/dist/commands/recommend.d.ts.map +1 -0
  43. package/dist/commands/recommend.js +283 -0
  44. package/dist/commands/recommend.js.map +1 -0
  45. package/dist/commands/report-template.d.ts +17 -0
  46. package/dist/commands/report-template.d.ts.map +1 -0
  47. package/dist/commands/report-template.js +291 -0
  48. package/dist/commands/report-template.js.map +1 -0
  49. package/dist/commands/review-queue.d.ts +34 -0
  50. package/dist/commands/review-queue.d.ts.map +1 -0
  51. package/dist/commands/review-queue.js +226 -0
  52. package/dist/commands/review-queue.js.map +1 -0
  53. package/dist/commands/rule-owner.d.ts +31 -0
  54. package/dist/commands/rule-owner.d.ts.map +1 -0
  55. package/dist/commands/rule-owner.js +182 -0
  56. package/dist/commands/rule-owner.js.map +1 -0
  57. package/dist/commands/rule-share.d.ts +35 -0
  58. package/dist/commands/rule-share.d.ts.map +1 -0
  59. package/dist/commands/rule-share.js +203 -0
  60. package/dist/commands/rule-share.js.map +1 -0
  61. package/dist/commands/suppress.d.ts +40 -0
  62. package/dist/commands/suppress.d.ts.map +1 -0
  63. package/dist/commands/suppress.js +209 -0
  64. package/dist/commands/suppress.js.map +1 -0
  65. package/dist/commands/vote.d.ts +32 -0
  66. package/dist/commands/vote.d.ts.map +1 -0
  67. package/dist/commands/vote.js +201 -0
  68. package/dist/commands/vote.js.map +1 -0
  69. package/package.json +1 -1
  70. package/server.json +2 -2
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Rule ownership — map rules/categories to team owners for
3
+ * accountability, escalation, and expertise routing.
4
+ *
5
+ * Stored locally in .judges-owners.json.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync } from "fs";
8
+ const OWNER_FILE = ".judges-owners.json";
9
+ // ─── Core ───────────────────────────────────────────────────────────────────
10
+ function loadDb(file = OWNER_FILE) {
11
+ if (!existsSync(file))
12
+ return { owners: [] };
13
+ return JSON.parse(readFileSync(file, "utf-8"));
14
+ }
15
+ function saveDb(db, file = OWNER_FILE) {
16
+ writeFileSync(file, JSON.stringify(db, null, 2));
17
+ }
18
+ export function assignOwner(pattern, owner, opts) {
19
+ const db = loadDb();
20
+ const existing = db.owners.find((o) => o.pattern === pattern);
21
+ const entry = {
22
+ pattern,
23
+ owner,
24
+ contact: opts?.contact,
25
+ expertise: opts?.expertise || "familiar",
26
+ assignedIso: new Date().toISOString(),
27
+ };
28
+ if (existing) {
29
+ Object.assign(existing, entry);
30
+ }
31
+ else {
32
+ db.owners.push(entry);
33
+ }
34
+ saveDb(db);
35
+ return entry;
36
+ }
37
+ export function removeOwner(pattern) {
38
+ const db = loadDb();
39
+ const idx = db.owners.findIndex((o) => o.pattern === pattern);
40
+ if (idx < 0)
41
+ return false;
42
+ db.owners.splice(idx, 1);
43
+ saveDb(db);
44
+ return true;
45
+ }
46
+ export function findOwner(ruleId) {
47
+ const db = loadDb();
48
+ // Exact match first, then prefix match (longest prefix wins)
49
+ const exact = db.owners.find((o) => o.pattern === ruleId);
50
+ if (exact)
51
+ return exact;
52
+ let best;
53
+ for (const o of db.owners) {
54
+ if (ruleId.startsWith(o.pattern) && (!best || o.pattern.length > best.pattern.length)) {
55
+ best = o;
56
+ }
57
+ }
58
+ return best;
59
+ }
60
+ export function getOwnerStats() {
61
+ const db = loadDb();
62
+ const byOwner = {};
63
+ const byExpertise = {};
64
+ for (const o of db.owners) {
65
+ byOwner[o.owner] = (byOwner[o.owner] || 0) + 1;
66
+ byExpertise[o.expertise] = (byExpertise[o.expertise] || 0) + 1;
67
+ }
68
+ return { totalPatterns: db.owners.length, byOwner, byExpertise };
69
+ }
70
+ // ─── CLI ────────────────────────────────────────────────────────────────────
71
+ export function runRuleOwner(argv) {
72
+ if (argv.includes("--help") || argv.includes("-h")) {
73
+ console.log(`
74
+ judges rule-owner — Map rules to team owners for accountability
75
+
76
+ Usage:
77
+ judges rule-owner --set SEC --owner "Security Team" --contact "#sec-channel"
78
+ judges rule-owner --set AUTH-003 --owner "Alice" --expertise expert
79
+ judges rule-owner --find SEC-001 Find who owns a rule
80
+ judges rule-owner --list List all ownership mappings
81
+ judges rule-owner --remove SEC Remove ownership
82
+ judges rule-owner --stats Show ownership statistics
83
+
84
+ Options:
85
+ --set <pattern> Rule ID or prefix to assign
86
+ --owner <name> Owner name or team (required with --set)
87
+ --contact <info> Contact info (email/Slack)
88
+ --expertise <level> expert | familiar | learning
89
+ --find <rule-id> Find owner for a rule
90
+ --remove <pattern> Remove ownership mapping
91
+ --list List all mappings
92
+ --stats Show statistics
93
+ --format json JSON output
94
+ --help, -h Show this help
95
+ `);
96
+ return;
97
+ }
98
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
99
+ // Set ownership
100
+ const setPattern = argv.find((_a, i) => argv[i - 1] === "--set");
101
+ if (setPattern) {
102
+ const owner = argv.find((_a, i) => argv[i - 1] === "--owner");
103
+ if (!owner) {
104
+ console.error("Error: --owner required with --set");
105
+ process.exit(1);
106
+ }
107
+ const contact = argv.find((_a, i) => argv[i - 1] === "--contact");
108
+ const expertise = argv.find((_a, i) => argv[i - 1] === "--expertise");
109
+ const entry = assignOwner(setPattern, owner, { contact, expertise });
110
+ if (format === "json") {
111
+ console.log(JSON.stringify(entry, null, 2));
112
+ }
113
+ else {
114
+ console.log(` ✅ ${entry.pattern} → ${entry.owner} (${entry.expertise})`);
115
+ }
116
+ return;
117
+ }
118
+ // Find owner
119
+ const findRule = argv.find((_a, i) => argv[i - 1] === "--find");
120
+ if (findRule) {
121
+ const owner = findOwner(findRule);
122
+ if (!owner) {
123
+ console.log(` No owner found for ${findRule}`);
124
+ }
125
+ else if (format === "json") {
126
+ console.log(JSON.stringify(owner, null, 2));
127
+ }
128
+ else {
129
+ console.log(` ${findRule} → ${owner.owner} (${owner.expertise})${owner.contact ? ` — ${owner.contact}` : ""}`);
130
+ }
131
+ return;
132
+ }
133
+ // Remove
134
+ const removePattern = argv.find((_a, i) => argv[i - 1] === "--remove");
135
+ if (removePattern) {
136
+ if (removeOwner(removePattern)) {
137
+ console.log(` Removed: ${removePattern}`);
138
+ }
139
+ else {
140
+ console.error(` Not found: ${removePattern}`);
141
+ }
142
+ return;
143
+ }
144
+ // Stats
145
+ if (argv.includes("--stats")) {
146
+ const s = getOwnerStats();
147
+ if (format === "json") {
148
+ console.log(JSON.stringify(s, null, 2));
149
+ }
150
+ else {
151
+ console.log(`\n Rule Ownership\n ──────────────`);
152
+ console.log(` Total mappings: ${s.totalPatterns}\n`);
153
+ console.log(" By owner:");
154
+ for (const [name, count] of Object.entries(s.byOwner)) {
155
+ console.log(` ${name.padEnd(20)} ${count} rule(s)`);
156
+ }
157
+ console.log("\n By expertise:");
158
+ for (const [level, count] of Object.entries(s.byExpertise)) {
159
+ console.log(` ${level.padEnd(12)} ${count}`);
160
+ }
161
+ console.log("");
162
+ }
163
+ return;
164
+ }
165
+ // Default: list all
166
+ const db = loadDb();
167
+ if (db.owners.length === 0) {
168
+ console.log("\n No ownership mappings. Use --set to add one.\n");
169
+ return;
170
+ }
171
+ if (format === "json") {
172
+ console.log(JSON.stringify(db.owners, null, 2));
173
+ }
174
+ else {
175
+ console.log("\n Rule Ownership Mappings\n ──────────────────────");
176
+ for (const o of db.owners) {
177
+ console.log(` ${o.pattern.padEnd(15)} → ${o.owner} (${o.expertise})${o.contact ? ` — ${o.contact}` : ""}`);
178
+ }
179
+ console.log("");
180
+ }
181
+ }
182
+ //# sourceMappingURL=rule-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-owner.js","sourceRoot":"","sources":["../../src/commands/rule-owner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Custom rule sharing — export/import custom rule configurations
3
+ * across teams and organizations.
4
+ *
5
+ * Stored locally in .judges-shared-rules/ directory.
6
+ */
7
+ interface SharedRuleOverride {
8
+ ruleId: string;
9
+ severity?: string;
10
+ enabled?: boolean;
11
+ threshold?: number;
12
+ notes?: string;
13
+ }
14
+ interface SharedRulePackage {
15
+ name: string;
16
+ version: string;
17
+ description: string;
18
+ author: string;
19
+ rules: SharedRuleOverride[];
20
+ disabledRules?: string[];
21
+ disabledJudges?: string[];
22
+ preset?: string;
23
+ tags?: string[];
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
27
+ export declare function exportRules(name: string, description: string, author: string, configFile?: string): SharedRulePackage;
28
+ export declare function importRules(packageFile: string, configFile?: string): {
29
+ applied: number;
30
+ skipped: number;
31
+ };
32
+ export declare function listPackages(): SharedRulePackage[];
33
+ export declare function runRuleShare(argv: string[]): void;
34
+ export {};
35
+ //# sourceMappingURL=rule-share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-share.d.ts","sourceRoot":"","sources":["../../src/commands/rule-share.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,SAAc,GACvB,iBAAiB,CAmCnB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,SAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqD/G;AAED,wBAAgB,YAAY,IAAI,iBAAiB,EAAE,CAIlD;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAkGjD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Custom rule sharing — export/import custom rule configurations
3
+ * across teams and organizations.
4
+ *
5
+ * Stored locally in .judges-shared-rules/ directory.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "fs";
8
+ import { join } from "path";
9
+ const SHARE_DIR = ".judges-shared-rules";
10
+ // ─── Core ───────────────────────────────────────────────────────────────────
11
+ function ensureDir() {
12
+ if (!existsSync(SHARE_DIR))
13
+ mkdirSync(SHARE_DIR, { recursive: true });
14
+ }
15
+ export function exportRules(name, description, author, configFile = ".judgesrc") {
16
+ let config = {};
17
+ if (existsSync(configFile)) {
18
+ config = JSON.parse(readFileSync(configFile, "utf-8"));
19
+ }
20
+ const rules = [];
21
+ if (config.ruleOverrides && typeof config.ruleOverrides === "object") {
22
+ for (const [ruleId, override] of Object.entries(config.ruleOverrides)) {
23
+ rules.push({
24
+ ruleId,
25
+ severity: override.severity,
26
+ enabled: override.enabled,
27
+ threshold: override.threshold,
28
+ });
29
+ }
30
+ }
31
+ const pkg = {
32
+ name,
33
+ version: "1.0.0",
34
+ description,
35
+ author,
36
+ rules,
37
+ disabledRules: config.disabledRules || [],
38
+ disabledJudges: config.disabledJudges || [],
39
+ preset: config.preset,
40
+ tags: [],
41
+ createdAt: new Date().toISOString(),
42
+ updatedAt: new Date().toISOString(),
43
+ };
44
+ ensureDir();
45
+ writeFileSync(join(SHARE_DIR, `${name}.json`), JSON.stringify(pkg, null, 2));
46
+ return pkg;
47
+ }
48
+ export function importRules(packageFile, configFile = ".judgesrc") {
49
+ const pkg = JSON.parse(readFileSync(packageFile, "utf-8"));
50
+ let config = {};
51
+ if (existsSync(configFile)) {
52
+ config = JSON.parse(readFileSync(configFile, "utf-8"));
53
+ }
54
+ let applied = 0;
55
+ let skipped = 0;
56
+ // Merge rule overrides
57
+ if (!config.ruleOverrides)
58
+ config.ruleOverrides = {};
59
+ const overrides = config.ruleOverrides;
60
+ for (const rule of pkg.rules) {
61
+ if (overrides[rule.ruleId]) {
62
+ skipped++;
63
+ continue;
64
+ }
65
+ overrides[rule.ruleId] = {};
66
+ if (rule.severity)
67
+ overrides[rule.ruleId].severity = rule.severity;
68
+ if (rule.enabled !== undefined)
69
+ overrides[rule.ruleId].enabled = rule.enabled;
70
+ if (rule.threshold !== undefined)
71
+ overrides[rule.ruleId].threshold = rule.threshold;
72
+ applied++;
73
+ }
74
+ // Merge disabled rules
75
+ if (pkg.disabledRules && pkg.disabledRules.length > 0) {
76
+ const existing = new Set(config.disabledRules || []);
77
+ for (const r of pkg.disabledRules) {
78
+ if (!existing.has(r)) {
79
+ existing.add(r);
80
+ applied++;
81
+ }
82
+ }
83
+ config.disabledRules = [...existing];
84
+ }
85
+ // Merge disabled judges
86
+ if (pkg.disabledJudges && pkg.disabledJudges.length > 0) {
87
+ const existing = new Set(config.disabledJudges || []);
88
+ for (const j of pkg.disabledJudges) {
89
+ if (!existing.has(j)) {
90
+ existing.add(j);
91
+ applied++;
92
+ }
93
+ }
94
+ config.disabledJudges = [...existing];
95
+ }
96
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
97
+ return { applied, skipped };
98
+ }
99
+ export function listPackages() {
100
+ ensureDir();
101
+ const files = readdirSync(SHARE_DIR).filter((f) => f.endsWith(".json"));
102
+ return files.map((f) => JSON.parse(readFileSync(join(SHARE_DIR, f), "utf-8")));
103
+ }
104
+ // ─── CLI ────────────────────────────────────────────────────────────────────
105
+ export function runRuleShare(argv) {
106
+ if (argv.includes("--help") || argv.includes("-h")) {
107
+ console.log(`
108
+ judges rule-share — Export and import custom rule configurations
109
+
110
+ Usage:
111
+ judges rule-share --export "my-rules" --description "Team security rules" --author "Alice"
112
+ judges rule-share --import .judges-shared-rules/my-rules.json
113
+ judges rule-share --list
114
+ judges rule-share --inspect .judges-shared-rules/my-rules.json
115
+
116
+ Options:
117
+ --export <name> Export current config as a shareable package
118
+ --description <text> Package description
119
+ --author <name> Package author
120
+ --import <file> Import a rule package into .judgesrc
121
+ --list List available packages
122
+ --inspect <file> Show package contents
123
+ --format json JSON output
124
+ --help, -h Show this help
125
+ `);
126
+ return;
127
+ }
128
+ const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
129
+ // Export
130
+ const exportName = argv.find((_a, i) => argv[i - 1] === "--export");
131
+ if (exportName) {
132
+ const desc = argv.find((_a, i) => argv[i - 1] === "--description") || "";
133
+ const author = argv.find((_a, i) => argv[i - 1] === "--author") || "unknown";
134
+ const pkg = exportRules(exportName, desc, author);
135
+ if (format === "json") {
136
+ console.log(JSON.stringify(pkg, null, 2));
137
+ }
138
+ else {
139
+ console.log(` ✅ Exported "${exportName}" → ${SHARE_DIR}/${exportName}.json`);
140
+ console.log(` ${pkg.rules.length} rule override(s), ${(pkg.disabledRules || []).length} disabled rule(s)`);
141
+ }
142
+ return;
143
+ }
144
+ // Import
145
+ const importFile = argv.find((_a, i) => argv[i - 1] === "--import");
146
+ if (importFile) {
147
+ if (!existsSync(importFile)) {
148
+ console.error(` ❌ File not found: ${importFile}`);
149
+ return;
150
+ }
151
+ const result = importRules(importFile);
152
+ if (format === "json") {
153
+ console.log(JSON.stringify(result, null, 2));
154
+ }
155
+ else {
156
+ console.log(` ✅ Imported: ${result.applied} applied, ${result.skipped} skipped (existing)`);
157
+ }
158
+ return;
159
+ }
160
+ // Inspect
161
+ const inspectFile = argv.find((_a, i) => argv[i - 1] === "--inspect");
162
+ if (inspectFile) {
163
+ if (!existsSync(inspectFile)) {
164
+ console.error(` ❌ File not found: ${inspectFile}`);
165
+ return;
166
+ }
167
+ const pkg = JSON.parse(readFileSync(inspectFile, "utf-8"));
168
+ if (format === "json") {
169
+ console.log(JSON.stringify(pkg, null, 2));
170
+ }
171
+ else {
172
+ console.log(`\n Package: ${pkg.name} v${pkg.version}`);
173
+ console.log(` Author: ${pkg.author}`);
174
+ console.log(` Description: ${pkg.description}`);
175
+ console.log(` ──────────────────────`);
176
+ console.log(` Rule overrides: ${pkg.rules.length}`);
177
+ for (const r of pkg.rules) {
178
+ console.log(` ${r.ruleId.padEnd(20)} sev: ${r.severity || "—"} enabled: ${r.enabled ?? "—"}`);
179
+ }
180
+ console.log(` Disabled rules: ${(pkg.disabledRules || []).length}`);
181
+ console.log(` Disabled judges: ${(pkg.disabledJudges || []).length}`);
182
+ console.log(` Preset: ${pkg.preset || "—"}\n`);
183
+ }
184
+ return;
185
+ }
186
+ // List
187
+ const packages = listPackages();
188
+ if (packages.length === 0) {
189
+ console.log("\n No shared rule packages. Use --export to create one.\n");
190
+ return;
191
+ }
192
+ if (format === "json") {
193
+ console.log(JSON.stringify(packages, null, 2));
194
+ }
195
+ else {
196
+ console.log(`\n Shared Rule Packages (${packages.length})\n ────────────────────────`);
197
+ for (const p of packages) {
198
+ console.log(` ${p.name.padEnd(20)} v${p.version.padEnd(8)} by ${p.author} (${p.rules.length} rules)`);
199
+ }
200
+ console.log("");
201
+ }
202
+ }
203
+ //# sourceMappingURL=rule-share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-share.js","sourceRoot":"","sources":["../../src/commands/rule-share.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Batch false-positive suppression — suppress findings by glob, rule
3
+ * prefix, severity, or pattern with a full audit trail.
4
+ *
5
+ * Suppressions stored locally in .judges-suppressions.json.
6
+ */
7
+ export interface SuppressionRule {
8
+ id: string;
9
+ /** Glob pattern for file paths (e.g., **\/*.test.ts) */
10
+ fileGlob?: string;
11
+ /** Rule ID prefix to suppress (e.g., AUTH) */
12
+ rulePrefix?: string;
13
+ /** Exact rule IDs to suppress */
14
+ ruleIds?: string[];
15
+ /** Minimum severity to suppress (suppress this level and below) */
16
+ maxSeverity?: string;
17
+ /** Reason for suppression */
18
+ reason: string;
19
+ /** Who created this suppression */
20
+ author: string;
21
+ /** When this suppression was created */
22
+ createdIso: string;
23
+ /** Optional expiry date */
24
+ expiresIso?: string;
25
+ /** Whether this suppression is active */
26
+ active: boolean;
27
+ }
28
+ export declare function addSuppression(opts: {
29
+ fileGlob?: string;
30
+ rulePrefix?: string;
31
+ ruleIds?: string[];
32
+ maxSeverity?: string;
33
+ reason: string;
34
+ author?: string;
35
+ expiresIn?: number;
36
+ }): SuppressionRule;
37
+ export declare function removeSuppression(id: string): boolean;
38
+ export declare function isFindiingSuppressed(ruleId: string, severity: string, filePath?: string): boolean;
39
+ export declare function runSuppress(argv: string[]): void;
40
+ //# sourceMappingURL=suppress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress.d.ts","sourceRoot":"","sources":["../../src/commands/suppress.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,MAAM,EAAE,OAAO,CAAC;CACjB;AAkCD,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,eAAe,CAqBlB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAiCjG;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA+GhD"}