@kevinrabun/judges 3.51.0 → 3.52.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.
- package/CHANGELOG.md +12 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/chat-notify.d.ts +9 -0
- package/dist/commands/chat-notify.d.ts.map +1 -0
- package/dist/commands/chat-notify.js +259 -0
- package/dist/commands/chat-notify.js.map +1 -0
- package/dist/commands/design-audit.d.ts +9 -0
- package/dist/commands/design-audit.d.ts.map +1 -0
- package/dist/commands/design-audit.js +302 -0
- package/dist/commands/design-audit.js.map +1 -0
- package/dist/commands/impact-scan.d.ts +9 -0
- package/dist/commands/impact-scan.d.ts.map +1 -0
- package/dist/commands/impact-scan.js +282 -0
- package/dist/commands/impact-scan.js.map +1 -0
- package/dist/commands/judge-learn.d.ts +9 -0
- package/dist/commands/judge-learn.d.ts.map +1 -0
- package/dist/commands/judge-learn.js +218 -0
- package/dist/commands/judge-learn.js.map +1 -0
- package/dist/commands/model-report.d.ts +9 -0
- package/dist/commands/model-report.d.ts.map +1 -0
- package/dist/commands/model-report.js +195 -0
- package/dist/commands/model-report.js.map +1 -0
- package/dist/commands/remediation-lib.d.ts +9 -0
- package/dist/commands/remediation-lib.d.ts.map +1 -0
- package/dist/commands/remediation-lib.js +266 -0
- package/dist/commands/remediation-lib.js.map +1 -0
- package/dist/commands/trust-adaptive.d.ts +9 -0
- package/dist/commands/trust-adaptive.d.ts.map +1 -0
- package/dist/commands/trust-adaptive.js +194 -0
- package/dist/commands/trust-adaptive.js.map +1 -0
- package/dist/commands/watch-judge.d.ts +8 -0
- package/dist/commands/watch-judge.d.ts.map +1 -0
- package/dist/commands/watch-judge.js +180 -0
- package/dist/commands/watch-judge.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model report — track which AI model/version produced each finding
|
|
3
|
+
* across evaluation runs. Generates model scorecards with pass rates,
|
|
4
|
+
* failure categories, and vendor-specific blind spots.
|
|
5
|
+
*
|
|
6
|
+
* All data stored locally in `.judges-model-reports/`.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
11
|
+
const DATA_DIR = ".judges-model-reports";
|
|
12
|
+
function ensureDir() {
|
|
13
|
+
if (!existsSync(DATA_DIR))
|
|
14
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
function loadEntries() {
|
|
17
|
+
const file = join(DATA_DIR, "history.json");
|
|
18
|
+
if (!existsSync(file))
|
|
19
|
+
return [];
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(readFileSync(file, "utf-8"));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function saveEntries(entries) {
|
|
28
|
+
ensureDir();
|
|
29
|
+
writeFileSync(join(DATA_DIR, "history.json"), JSON.stringify(entries, null, 2));
|
|
30
|
+
}
|
|
31
|
+
// ─── Analysis ───────────────────────────────────────────────────────────────
|
|
32
|
+
function categorizeFindings(content) {
|
|
33
|
+
const cats = {};
|
|
34
|
+
const patterns = [
|
|
35
|
+
["security", /injection|xss|csrf|auth|password|secret|token|key/gi],
|
|
36
|
+
["error-handling", /catch|error|exception|throw|reject|finally/gi],
|
|
37
|
+
["performance", /loop|recursion|allocation|memory|cache|lazy|eager/gi],
|
|
38
|
+
["naming", /naming|variable|identifier|abbreviation|convention/gi],
|
|
39
|
+
["complexity", /complex|nested|depth|cyclomatic|conditional/gi],
|
|
40
|
+
["duplication", /duplicate|copy|clone|repeat|redundant/gi],
|
|
41
|
+
["documentation", /comment|doc|readme|jsdoc|annotation/gi],
|
|
42
|
+
["testing", /test|assert|mock|stub|coverage|spec/gi],
|
|
43
|
+
];
|
|
44
|
+
for (const [cat, re] of patterns) {
|
|
45
|
+
const matches = (content.match(re) || []).length;
|
|
46
|
+
if (matches > 0)
|
|
47
|
+
cats[cat] = matches;
|
|
48
|
+
}
|
|
49
|
+
return cats;
|
|
50
|
+
}
|
|
51
|
+
function generateReports(entries) {
|
|
52
|
+
const models = new Map();
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const list = models.get(entry.model) || [];
|
|
55
|
+
list.push(entry);
|
|
56
|
+
models.set(entry.model, list);
|
|
57
|
+
}
|
|
58
|
+
const reports = [];
|
|
59
|
+
for (const [model, evalList] of models) {
|
|
60
|
+
const avgScore = Math.round(evalList.reduce((s, e) => s + e.score, 0) / evalList.length);
|
|
61
|
+
const avgFindings = Math.round(evalList.reduce((s, e) => s + e.totalFindings, 0) / evalList.length);
|
|
62
|
+
// Aggregate categories
|
|
63
|
+
const catTotals = {};
|
|
64
|
+
for (const e of evalList) {
|
|
65
|
+
for (const [cat, count] of Object.entries(e.categories)) {
|
|
66
|
+
catTotals[cat] = (catTotals[cat] || 0) + count;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const topCategories = Object.entries(catTotals)
|
|
70
|
+
.sort((a, b) => b[1] - a[1])
|
|
71
|
+
.slice(0, 5)
|
|
72
|
+
.map(([category, count]) => ({ category, count }));
|
|
73
|
+
// Trend
|
|
74
|
+
let trend = "stable";
|
|
75
|
+
if (evalList.length >= 3) {
|
|
76
|
+
const recent = evalList.slice(-3);
|
|
77
|
+
const scoreDiff = recent[recent.length - 1].score - recent[0].score;
|
|
78
|
+
if (scoreDiff > 5)
|
|
79
|
+
trend = "improving";
|
|
80
|
+
else if (scoreDiff < -5)
|
|
81
|
+
trend = "declining";
|
|
82
|
+
}
|
|
83
|
+
reports.push({ model, evaluations: evalList.length, avgScore, avgFindings, topCategories, trend });
|
|
84
|
+
}
|
|
85
|
+
return reports.sort((a, b) => b.avgScore - a.avgScore);
|
|
86
|
+
}
|
|
87
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
88
|
+
export function runModelReport(argv) {
|
|
89
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
90
|
+
console.log(`
|
|
91
|
+
judges model-report — AI model scorecard and comparison
|
|
92
|
+
|
|
93
|
+
Usage:
|
|
94
|
+
judges model-report --record --model "gpt-4" --score 85 --findings 3
|
|
95
|
+
judges model-report --record --model "claude-4" --file eval-output.json
|
|
96
|
+
judges model-report --show
|
|
97
|
+
judges model-report --compare
|
|
98
|
+
|
|
99
|
+
Options:
|
|
100
|
+
--record Record a new evaluation entry
|
|
101
|
+
--model <name> Model name/version
|
|
102
|
+
--score <n> Evaluation score (0-100)
|
|
103
|
+
--findings <n> Number of findings
|
|
104
|
+
--file <path> Import findings from evaluation output
|
|
105
|
+
--show Display model scorecards
|
|
106
|
+
--compare Side-by-side model comparison
|
|
107
|
+
--format json JSON output
|
|
108
|
+
--help, -h Show this help
|
|
109
|
+
`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
113
|
+
const record = argv.includes("--record");
|
|
114
|
+
const show = argv.includes("--show");
|
|
115
|
+
const compare = argv.includes("--compare");
|
|
116
|
+
const modelName = argv.find((_a, i) => argv[i - 1] === "--model") || "";
|
|
117
|
+
const scoreArg = argv.find((_a, i) => argv[i - 1] === "--score");
|
|
118
|
+
const findingsArg = argv.find((_a, i) => argv[i - 1] === "--findings");
|
|
119
|
+
const fileArg = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
120
|
+
if (record) {
|
|
121
|
+
if (!modelName) {
|
|
122
|
+
console.error(" --model is required for --record");
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
let totalFindings = parseInt(findingsArg || "0");
|
|
126
|
+
let score = parseInt(scoreArg || "0");
|
|
127
|
+
let categories = {};
|
|
128
|
+
if (fileArg && existsSync(fileArg)) {
|
|
129
|
+
try {
|
|
130
|
+
const data = readFileSync(fileArg, "utf-8");
|
|
131
|
+
categories = categorizeFindings(data);
|
|
132
|
+
const parsed = JSON.parse(data);
|
|
133
|
+
if (parsed.findings)
|
|
134
|
+
totalFindings = Array.isArray(parsed.findings) ? parsed.findings.length : totalFindings;
|
|
135
|
+
if (parsed.overallScore)
|
|
136
|
+
score = parsed.overallScore;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* use manual values */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const entry = {
|
|
143
|
+
model: modelName,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
totalFindings,
|
|
146
|
+
criticalCount: 0,
|
|
147
|
+
highCount: 0,
|
|
148
|
+
mediumCount: Math.round(totalFindings * 0.6),
|
|
149
|
+
lowCount: Math.round(totalFindings * 0.4),
|
|
150
|
+
score,
|
|
151
|
+
categories,
|
|
152
|
+
};
|
|
153
|
+
const entries = loadEntries();
|
|
154
|
+
entries.push(entry);
|
|
155
|
+
saveEntries(entries);
|
|
156
|
+
console.log(` ✅ Recorded evaluation for ${modelName} (score: ${score}, findings: ${totalFindings})`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const entries = loadEntries();
|
|
160
|
+
if (entries.length === 0) {
|
|
161
|
+
console.log(" No model data recorded yet. Use --record to add evaluations.");
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const reports = generateReports(entries);
|
|
165
|
+
if (format === "json") {
|
|
166
|
+
console.log(JSON.stringify({ reports, totalEntries: entries.length, timestamp: new Date().toISOString() }, null, 2));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (compare) {
|
|
170
|
+
console.log(`\n Model Comparison — ${reports.length} models\n ──────────────────────────`);
|
|
171
|
+
console.log(` ${"Model".padEnd(25)} ${"Evals".padEnd(8)} ${"Avg Score".padEnd(12)} ${"Avg Findings".padEnd(14)} Trend`);
|
|
172
|
+
console.log(` ${"─".repeat(25)} ${"─".repeat(8)} ${"─".repeat(12)} ${"─".repeat(14)} ${"─".repeat(10)}`);
|
|
173
|
+
for (const r of reports) {
|
|
174
|
+
const trendIcon = r.trend === "improving" ? "📈" : r.trend === "declining" ? "📉" : "➡️";
|
|
175
|
+
console.log(` ${r.model.padEnd(25)} ${String(r.evaluations).padEnd(8)} ${String(r.avgScore).padEnd(12)} ${String(r.avgFindings).padEnd(14)} ${trendIcon} ${r.trend}`);
|
|
176
|
+
}
|
|
177
|
+
console.log("");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Show (default)
|
|
181
|
+
if (show || !compare) {
|
|
182
|
+
console.log(`\n Model Report Cards — ${entries.length} evaluations across ${reports.length} models\n ──────────────────────────`);
|
|
183
|
+
for (const r of reports) {
|
|
184
|
+
const icon = r.avgScore >= 80 ? "🟢" : r.avgScore >= 60 ? "🟡" : "🔴";
|
|
185
|
+
const trendIcon = r.trend === "improving" ? "📈" : r.trend === "declining" ? "📉" : "➡️";
|
|
186
|
+
console.log(`\n ${icon} ${r.model}`);
|
|
187
|
+
console.log(` Score: ${r.avgScore}/100 | Findings: ${r.avgFindings} avg | Evals: ${r.evaluations} | ${trendIcon} ${r.trend}`);
|
|
188
|
+
if (r.topCategories.length > 0) {
|
|
189
|
+
console.log(` Top issues: ${r.topCategories.map((c) => `${c.category}(${c.count})`).join(", ")}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
console.log("");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=model-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-report.js","sourceRoot":"","sources":["../../src/commands/model-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remediation library — stores proven fixes as parameterized
|
|
3
|
+
* templates ranked by effectiveness. Auto-applies top-ranked
|
|
4
|
+
* templates to new instances of the same finding pattern.
|
|
5
|
+
*
|
|
6
|
+
* All data stored locally in `.judges-remediation/`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runRemediationLib(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=remediation-lib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation-lib.d.ts","sourceRoot":"","sources":["../../src/commands/remediation-lib.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiIH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmLtD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remediation library — stores proven fixes as parameterized
|
|
3
|
+
* templates ranked by effectiveness. Auto-applies top-ranked
|
|
4
|
+
* templates to new instances of the same finding pattern.
|
|
5
|
+
*
|
|
6
|
+
* All data stored locally in `.judges-remediation/`.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
// ─── Storage ────────────────────────────────────────────────────────────────
|
|
11
|
+
const DATA_DIR = ".judges-remediation";
|
|
12
|
+
const LIB_FILE = join(DATA_DIR, "library.json");
|
|
13
|
+
function ensureDir() {
|
|
14
|
+
if (!existsSync(DATA_DIR))
|
|
15
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
function loadLibrary() {
|
|
18
|
+
if (!existsSync(LIB_FILE))
|
|
19
|
+
return { templates: [], totalApplied: 0, lastUpdated: new Date().toISOString() };
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(readFileSync(LIB_FILE, "utf-8"));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { templates: [], totalApplied: 0, lastUpdated: new Date().toISOString() };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function saveLibrary(lib) {
|
|
28
|
+
ensureDir();
|
|
29
|
+
lib.lastUpdated = new Date().toISOString();
|
|
30
|
+
writeFileSync(LIB_FILE, JSON.stringify(lib, null, 2));
|
|
31
|
+
}
|
|
32
|
+
// ─── Built-in templates ─────────────────────────────────────────────────────
|
|
33
|
+
const BUILTIN_TEMPLATES = [
|
|
34
|
+
{
|
|
35
|
+
id: "builtin-empty-catch",
|
|
36
|
+
ruleId: "empty-catch",
|
|
37
|
+
name: "Add error logging to empty catch",
|
|
38
|
+
description: "Replace empty catch blocks with console.error or logger",
|
|
39
|
+
language: "typescript",
|
|
40
|
+
before: "catch (err) {}",
|
|
41
|
+
after: 'catch (err) { console.error("Unhandled error:", err); }',
|
|
42
|
+
votes: 10,
|
|
43
|
+
applied: 0,
|
|
44
|
+
successRate: 95,
|
|
45
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
46
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: "builtin-sql-injection",
|
|
50
|
+
ruleId: "sql-injection",
|
|
51
|
+
name: "Use parameterized query",
|
|
52
|
+
description: "Replace string concatenation with parameterized queries",
|
|
53
|
+
language: "typescript",
|
|
54
|
+
before: "`SELECT * FROM users WHERE id = ${userId}`",
|
|
55
|
+
after: '"SELECT * FROM users WHERE id = $1", [userId]',
|
|
56
|
+
votes: 15,
|
|
57
|
+
applied: 0,
|
|
58
|
+
successRate: 98,
|
|
59
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
60
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "builtin-xss",
|
|
64
|
+
ruleId: "xss",
|
|
65
|
+
name: "Sanitize HTML output",
|
|
66
|
+
description: "Escape user input before inserting into HTML",
|
|
67
|
+
language: "javascript",
|
|
68
|
+
before: "element.innerHTML = userInput",
|
|
69
|
+
after: "element.textContent = userInput",
|
|
70
|
+
votes: 12,
|
|
71
|
+
applied: 0,
|
|
72
|
+
successRate: 92,
|
|
73
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
74
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "builtin-hardcoded-secret",
|
|
78
|
+
ruleId: "hardcoded-secret",
|
|
79
|
+
name: "Move to environment variable",
|
|
80
|
+
description: "Replace hardcoded secrets with environment variable references",
|
|
81
|
+
language: "any",
|
|
82
|
+
before: 'const API_KEY = "sk-abc123..."',
|
|
83
|
+
after: "const API_KEY = process.env.API_KEY || ''",
|
|
84
|
+
votes: 14,
|
|
85
|
+
applied: 0,
|
|
86
|
+
successRate: 96,
|
|
87
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
88
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "builtin-todo-placeholder",
|
|
92
|
+
ruleId: "todo-placeholder",
|
|
93
|
+
name: "Replace TODO with implementation",
|
|
94
|
+
description: "Flag TODO comments that AI generators leave behind",
|
|
95
|
+
language: "any",
|
|
96
|
+
before: "// TODO: implement this",
|
|
97
|
+
after: "// Implementation required — see ticket #XXX",
|
|
98
|
+
votes: 8,
|
|
99
|
+
applied: 0,
|
|
100
|
+
successRate: 70,
|
|
101
|
+
createdAt: "2025-01-01T00:00:00Z",
|
|
102
|
+
updatedAt: "2025-01-01T00:00:00Z",
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
106
|
+
export function runRemediationLib(argv) {
|
|
107
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
108
|
+
console.log(`
|
|
109
|
+
judges remediation-lib — Proven fix templates for common findings
|
|
110
|
+
|
|
111
|
+
Usage:
|
|
112
|
+
judges remediation-lib --list
|
|
113
|
+
judges remediation-lib --search "empty-catch"
|
|
114
|
+
judges remediation-lib --add --rule "my-rule" --name "Fix name" --before "bad" --after "good" --lang ts
|
|
115
|
+
judges remediation-lib --vote --id "builtin-empty-catch"
|
|
116
|
+
judges remediation-lib --apply --id "builtin-sql-injection" --file src/db.ts
|
|
117
|
+
judges remediation-lib --init (seed with built-in templates)
|
|
118
|
+
|
|
119
|
+
Options:
|
|
120
|
+
--list List all templates (ranked by votes)
|
|
121
|
+
--search <pattern> Search templates by rule or name
|
|
122
|
+
--add Add a new template
|
|
123
|
+
--rule <ruleId> Rule ID for the template
|
|
124
|
+
--name <name> Template name
|
|
125
|
+
--before <code> Code pattern to match
|
|
126
|
+
--after <code> Replacement code
|
|
127
|
+
--lang <language> Language (default: any)
|
|
128
|
+
--vote Upvote a template
|
|
129
|
+
--id <template-id> Template ID (for vote/apply)
|
|
130
|
+
--apply Apply template to file
|
|
131
|
+
--file <path> Target file for apply
|
|
132
|
+
--init Initialize with built-in templates
|
|
133
|
+
--format json JSON output
|
|
134
|
+
--help, -h Show this help
|
|
135
|
+
`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
139
|
+
const _isList = argv.includes("--list");
|
|
140
|
+
const isSearch = argv.includes("--search");
|
|
141
|
+
const isAdd = argv.includes("--add");
|
|
142
|
+
const isVote = argv.includes("--vote");
|
|
143
|
+
const isApply = argv.includes("--apply");
|
|
144
|
+
const isInit = argv.includes("--init");
|
|
145
|
+
const id = argv.find((_a, i) => argv[i - 1] === "--id") || "";
|
|
146
|
+
const ruleId = argv.find((_a, i) => argv[i - 1] === "--rule") || "";
|
|
147
|
+
const name = argv.find((_a, i) => argv[i - 1] === "--name") || "";
|
|
148
|
+
const before = argv.find((_a, i) => argv[i - 1] === "--before") || "";
|
|
149
|
+
const after = argv.find((_a, i) => argv[i - 1] === "--after") || "";
|
|
150
|
+
const lang = argv.find((_a, i) => argv[i - 1] === "--lang") || "any";
|
|
151
|
+
const searchTerm = argv.find((_a, i) => argv[i - 1] === "--search") || "";
|
|
152
|
+
const file = argv.find((_a, i) => argv[i - 1] === "--file") || "";
|
|
153
|
+
if (isInit) {
|
|
154
|
+
const lib = loadLibrary();
|
|
155
|
+
let added = 0;
|
|
156
|
+
for (const bt of BUILTIN_TEMPLATES) {
|
|
157
|
+
if (!lib.templates.some((t) => t.id === bt.id)) {
|
|
158
|
+
lib.templates.push({ ...bt });
|
|
159
|
+
added++;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
saveLibrary(lib);
|
|
163
|
+
console.log(` ✅ Initialized with ${added} built-in templates (${lib.templates.length} total)`);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (isAdd) {
|
|
167
|
+
if (!ruleId || !name || !before || !after) {
|
|
168
|
+
console.error(" --rule, --name, --before, and --after are required");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const lib = loadLibrary();
|
|
172
|
+
const template = {
|
|
173
|
+
id: `custom-${Date.now()}`,
|
|
174
|
+
ruleId,
|
|
175
|
+
name,
|
|
176
|
+
description: name,
|
|
177
|
+
language: lang,
|
|
178
|
+
before,
|
|
179
|
+
after,
|
|
180
|
+
votes: 0,
|
|
181
|
+
applied: 0,
|
|
182
|
+
successRate: 0,
|
|
183
|
+
createdAt: new Date().toISOString(),
|
|
184
|
+
updatedAt: new Date().toISOString(),
|
|
185
|
+
};
|
|
186
|
+
lib.templates.push(template);
|
|
187
|
+
saveLibrary(lib);
|
|
188
|
+
console.log(` ✅ Added template "${name}" for rule "${ruleId}"`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (isVote) {
|
|
192
|
+
if (!id) {
|
|
193
|
+
console.error(" --id is required");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const lib = loadLibrary();
|
|
197
|
+
const tmpl = lib.templates.find((t) => t.id === id);
|
|
198
|
+
if (!tmpl) {
|
|
199
|
+
console.error(` Template "${id}" not found`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
tmpl.votes++;
|
|
203
|
+
tmpl.updatedAt = new Date().toISOString();
|
|
204
|
+
saveLibrary(lib);
|
|
205
|
+
console.log(` ✅ Upvoted "${tmpl.name}" (${tmpl.votes} votes)`);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (isApply) {
|
|
209
|
+
if (!id || !file) {
|
|
210
|
+
console.error(" --id and --file are required");
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (!existsSync(file)) {
|
|
214
|
+
console.error(` File not found: ${file}`);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const lib = loadLibrary();
|
|
218
|
+
const tmpl = lib.templates.find((t) => t.id === id);
|
|
219
|
+
if (!tmpl) {
|
|
220
|
+
console.error(` Template "${id}" not found`);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const content = readFileSync(file, "utf-8");
|
|
224
|
+
if (!content.includes(tmpl.before)) {
|
|
225
|
+
console.log(` ⚠ Pattern not found in ${file}`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const updated = content.replace(tmpl.before, tmpl.after);
|
|
229
|
+
writeFileSync(file, updated);
|
|
230
|
+
tmpl.applied++;
|
|
231
|
+
lib.totalApplied++;
|
|
232
|
+
saveLibrary(lib);
|
|
233
|
+
console.log(` ✅ Applied "${tmpl.name}" to ${file}`);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// List / Search
|
|
237
|
+
const lib = loadLibrary();
|
|
238
|
+
let templates = lib.templates;
|
|
239
|
+
if (isSearch && searchTerm) {
|
|
240
|
+
const term = searchTerm.toLowerCase();
|
|
241
|
+
templates = templates.filter((t) => t.ruleId.toLowerCase().includes(term) ||
|
|
242
|
+
t.name.toLowerCase().includes(term) ||
|
|
243
|
+
t.description.toLowerCase().includes(term));
|
|
244
|
+
}
|
|
245
|
+
templates.sort((a, b) => b.votes - a.votes);
|
|
246
|
+
if (format === "json") {
|
|
247
|
+
console.log(JSON.stringify({ templates, totalApplied: lib.totalApplied, timestamp: new Date().toISOString() }, null, 2));
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.log(`\n Remediation Library — ${templates.length} templates\n ──────────────────────────`);
|
|
251
|
+
if (templates.length === 0) {
|
|
252
|
+
console.log(" No templates found. Use --init to seed built-ins or --add to create.");
|
|
253
|
+
console.log("");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
for (const t of templates) {
|
|
257
|
+
const effIcon = t.successRate >= 90 ? "🟢" : t.successRate >= 70 ? "🟡" : "🔴";
|
|
258
|
+
console.log(`\n ${effIcon} ${t.name} [${t.id}]`);
|
|
259
|
+
console.log(` Rule: ${t.ruleId} | Lang: ${t.language} | Votes: ${t.votes} | Applied: ${t.applied} | Success: ${t.successRate}%`);
|
|
260
|
+
console.log(` Before: ${t.before}`);
|
|
261
|
+
console.log(` After: ${t.after}`);
|
|
262
|
+
}
|
|
263
|
+
console.log(`\n Total applied: ${lib.totalApplied}\n`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=remediation-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remediation-lib.js","sourceRoot":"","sources":["../../src/commands/remediation-lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust-adaptive — adjust judge sensitivity based on historical
|
|
3
|
+
* accuracy of developers or AI models. High-trust actors skip
|
|
4
|
+
* non-critical judges; low-trust get stricter scrutiny.
|
|
5
|
+
*
|
|
6
|
+
* All data stored locally in `.judges-trust/`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runTrustAdaptive(argv: string[]): void;
|
|
9
|
+
//# sourceMappingURL=trust-adaptive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust-adaptive.d.ts","sourceRoot":"","sources":["../../src/commands/trust-adaptive.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsGH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAoIrD"}
|