@kevinrabun/judges 3.45.0 → 3.47.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 +24 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/adoption-report.d.ts +8 -0
- package/dist/commands/adoption-report.d.ts.map +1 -0
- package/dist/commands/adoption-report.js +219 -0
- package/dist/commands/adoption-report.js.map +1 -0
- package/dist/commands/ai-model-trust.d.ts +17 -0
- package/dist/commands/ai-model-trust.d.ts.map +1 -0
- package/dist/commands/ai-model-trust.js +235 -0
- package/dist/commands/ai-model-trust.js.map +1 -0
- package/dist/commands/ai-prompt-audit.d.ts +23 -0
- package/dist/commands/ai-prompt-audit.d.ts.map +1 -0
- package/dist/commands/ai-prompt-audit.js +255 -0
- package/dist/commands/ai-prompt-audit.js.map +1 -0
- package/dist/commands/audit-bundle.d.ts +29 -0
- package/dist/commands/audit-bundle.d.ts.map +1 -0
- package/dist/commands/audit-bundle.js +235 -0
- package/dist/commands/audit-bundle.js.map +1 -0
- package/dist/commands/code-owner-suggest.d.ts +17 -0
- package/dist/commands/code-owner-suggest.d.ts.map +1 -0
- package/dist/commands/code-owner-suggest.js +215 -0
- package/dist/commands/code-owner-suggest.js.map +1 -0
- package/dist/commands/config-drift.d.ts +25 -0
- package/dist/commands/config-drift.d.ts.map +1 -0
- package/dist/commands/config-drift.js +214 -0
- package/dist/commands/config-drift.js.map +1 -0
- package/dist/commands/cost-forecast.d.ts +19 -0
- package/dist/commands/cost-forecast.d.ts.map +1 -0
- package/dist/commands/cost-forecast.js +194 -0
- package/dist/commands/cost-forecast.js.map +1 -0
- package/dist/commands/dev-score.d.ts +37 -0
- package/dist/commands/dev-score.d.ts.map +1 -0
- package/dist/commands/dev-score.js +204 -0
- package/dist/commands/dev-score.js.map +1 -0
- package/dist/commands/generate.d.ts +8 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +404 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/learn.d.ts +27 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +289 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/model-risk.d.ts +28 -0
- package/dist/commands/model-risk.d.ts.map +1 -0
- package/dist/commands/model-risk.js +221 -0
- package/dist/commands/model-risk.js.map +1 -0
- package/dist/commands/pr-quality-gate.d.ts +29 -0
- package/dist/commands/pr-quality-gate.d.ts.map +1 -0
- package/dist/commands/pr-quality-gate.js +208 -0
- package/dist/commands/pr-quality-gate.js.map +1 -0
- package/dist/commands/reg-watch.d.ts +21 -0
- package/dist/commands/reg-watch.d.ts.map +1 -0
- package/dist/commands/reg-watch.js +220 -0
- package/dist/commands/reg-watch.js.map +1 -0
- package/dist/commands/retro.d.ts +23 -0
- package/dist/commands/retro.d.ts.map +1 -0
- package/dist/commands/retro.js +217 -0
- package/dist/commands/retro.js.map +1 -0
- package/dist/commands/team-leaderboard.d.ts +25 -0
- package/dist/commands/team-leaderboard.d.ts.map +1 -0
- package/dist/commands/team-leaderboard.js +228 -0
- package/dist/commands/team-leaderboard.js.map +1 -0
- package/dist/commands/team-rules-sync.d.ts +8 -0
- package/dist/commands/team-rules-sync.d.ts.map +1 -0
- package/dist/commands/team-rules-sync.js +251 -0
- package/dist/commands/team-rules-sync.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adoption report — team-level adoption metrics dashboard
|
|
3
|
+
* showing PR coverage, remediation velocity, and cost savings.
|
|
4
|
+
*
|
|
5
|
+
* All data sourced from local history files.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, existsSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
// ─── Data loading ───────────────────────────────────────────────────────────
|
|
10
|
+
function loadJsonSafe(path, fallback) {
|
|
11
|
+
if (!existsSync(path))
|
|
12
|
+
return fallback;
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function countDevs() {
|
|
21
|
+
const scoreDir = ".judges-scores";
|
|
22
|
+
if (!existsSync(scoreDir))
|
|
23
|
+
return 0;
|
|
24
|
+
try {
|
|
25
|
+
const { readdirSync } = require("fs");
|
|
26
|
+
return readdirSync(scoreDir).filter((f) => f.endsWith(".json")).length;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function loadLeaderboard() {
|
|
33
|
+
const file = join(".judges-leaderboard", "leaderboard.json");
|
|
34
|
+
const data = loadJsonSafe(file, { developers: [] });
|
|
35
|
+
return data.developers || [];
|
|
36
|
+
}
|
|
37
|
+
function loadDigestData() {
|
|
38
|
+
const file = ".judges-digest.json";
|
|
39
|
+
const data = loadJsonSafe(file, { snapshots: [] });
|
|
40
|
+
return data.snapshots || [];
|
|
41
|
+
}
|
|
42
|
+
function loadCostData() {
|
|
43
|
+
const file = join(".judges-cost-forecast", "history.json");
|
|
44
|
+
return loadJsonSafe(file, { estimatedCost: 0, snapshots: [] });
|
|
45
|
+
}
|
|
46
|
+
function loadGateData() {
|
|
47
|
+
const file = join(".judges-quality-gate", "gate-history.json");
|
|
48
|
+
return loadJsonSafe(file, { results: [] });
|
|
49
|
+
}
|
|
50
|
+
// ─── Core ───────────────────────────────────────────────────────────────────
|
|
51
|
+
function computeMetrics() {
|
|
52
|
+
const devs = loadLeaderboard();
|
|
53
|
+
const digests = loadDigestData();
|
|
54
|
+
const costData = loadCostData();
|
|
55
|
+
const gateData = loadGateData();
|
|
56
|
+
const devCount = Math.max(countDevs(), devs.length);
|
|
57
|
+
const totalScans = devs.reduce((s, d) => s + d.scansRun, 0) || gateData.results.length;
|
|
58
|
+
const totalFindings = devs.reduce((s, d) => s + d.findingsReviewed, 0);
|
|
59
|
+
const findingsFixed = devs.reduce((s, d) => s + d.findingsFixed, 0);
|
|
60
|
+
const fixRate = totalFindings > 0 ? Math.round((findingsFixed / totalFindings) * 100) : 0;
|
|
61
|
+
// Category analysis from digest data
|
|
62
|
+
const categoryMap = new Map();
|
|
63
|
+
for (const d of digests) {
|
|
64
|
+
const count = d.findingCount || 0;
|
|
65
|
+
const existing = categoryMap.get("general") || 0;
|
|
66
|
+
categoryMap.set("general", existing + count);
|
|
67
|
+
}
|
|
68
|
+
const topCategories = [...categoryMap.entries()]
|
|
69
|
+
.map(([category, count]) => ({ category, count }))
|
|
70
|
+
.sort((a, b) => b.count - a.count)
|
|
71
|
+
.slice(0, 5);
|
|
72
|
+
// Weekly trend from gate data
|
|
73
|
+
const weeklyMap = new Map();
|
|
74
|
+
for (const r of gateData.results) {
|
|
75
|
+
const week = r.timestamp.slice(0, 10);
|
|
76
|
+
const entry = weeklyMap.get(week) || { scans: 0, findings: 0 };
|
|
77
|
+
entry.scans++;
|
|
78
|
+
entry.findings += r.total;
|
|
79
|
+
weeklyMap.set(week, entry);
|
|
80
|
+
}
|
|
81
|
+
const weeklyTrend = [...weeklyMap.entries()].map(([week, data]) => ({ week, ...data })).slice(-12);
|
|
82
|
+
// Cost saved estimate
|
|
83
|
+
const costSaved = costData.snapshots.length > 1
|
|
84
|
+
? Math.max(0, costData.snapshots[0].estimatedCost - costData.snapshots[costData.snapshots.length - 1].estimatedCost)
|
|
85
|
+
: 0;
|
|
86
|
+
// Adoption score: 0-100
|
|
87
|
+
let adoptionScore = 0;
|
|
88
|
+
if (totalScans > 0)
|
|
89
|
+
adoptionScore += 20;
|
|
90
|
+
if (totalScans > 50)
|
|
91
|
+
adoptionScore += 10;
|
|
92
|
+
if (devCount >= 3)
|
|
93
|
+
adoptionScore += 15;
|
|
94
|
+
if (devCount >= 10)
|
|
95
|
+
adoptionScore += 10;
|
|
96
|
+
if (fixRate >= 50)
|
|
97
|
+
adoptionScore += 15;
|
|
98
|
+
if (fixRate >= 80)
|
|
99
|
+
adoptionScore += 10;
|
|
100
|
+
if (gateData.results.length > 0)
|
|
101
|
+
adoptionScore += 10;
|
|
102
|
+
if (costData.snapshots.length > 0)
|
|
103
|
+
adoptionScore += 10;
|
|
104
|
+
return {
|
|
105
|
+
totalScans,
|
|
106
|
+
totalFindings,
|
|
107
|
+
findingsFixed,
|
|
108
|
+
fixRate,
|
|
109
|
+
avgRemediationDays: 0, // Would need timestamp analysis
|
|
110
|
+
activeDevelopers: devCount,
|
|
111
|
+
topCategories,
|
|
112
|
+
weeklyTrend,
|
|
113
|
+
costSaved,
|
|
114
|
+
adoptionScore: Math.min(100, adoptionScore),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
118
|
+
export function runAdoptionReport(argv) {
|
|
119
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
120
|
+
console.log(`
|
|
121
|
+
judges adoption-report — Team adoption metrics dashboard
|
|
122
|
+
|
|
123
|
+
Usage:
|
|
124
|
+
judges adoption-report
|
|
125
|
+
judges adoption-report --summary
|
|
126
|
+
judges adoption-report --trends
|
|
127
|
+
judges adoption-report --executive
|
|
128
|
+
|
|
129
|
+
Options:
|
|
130
|
+
--summary One-line adoption summary
|
|
131
|
+
--trends Show weekly scan/findings trends
|
|
132
|
+
--executive Executive summary (short, formatted for leadership)
|
|
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 metrics = computeMetrics();
|
|
140
|
+
// Summary
|
|
141
|
+
if (argv.includes("--summary")) {
|
|
142
|
+
if (format === "json") {
|
|
143
|
+
console.log(JSON.stringify({ adoptionScore: metrics.adoptionScore, totalScans: metrics.totalScans, fixRate: metrics.fixRate }, null, 2));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
console.log(` Adoption: ${metrics.adoptionScore}/100 | Scans: ${metrics.totalScans} | Fix rate: ${metrics.fixRate}% | Devs: ${metrics.activeDevelopers}`);
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Trends
|
|
151
|
+
if (argv.includes("--trends")) {
|
|
152
|
+
if (format === "json") {
|
|
153
|
+
console.log(JSON.stringify(metrics.weeklyTrend, null, 2));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(`\n Weekly Trends\n ──────────────────────────`);
|
|
157
|
+
if (metrics.weeklyTrend.length === 0) {
|
|
158
|
+
console.log(" No trend data yet. Use pr-quality-gate --check to record gate decisions.");
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
for (const w of metrics.weeklyTrend) {
|
|
162
|
+
const bar = "█".repeat(Math.min(40, w.scans));
|
|
163
|
+
console.log(` ${w.week} ${w.scans.toString().padEnd(4)} scans ${w.findings.toString().padEnd(4)} findings ${bar}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
console.log("");
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Executive summary
|
|
171
|
+
if (argv.includes("--executive")) {
|
|
172
|
+
if (format === "json") {
|
|
173
|
+
console.log(JSON.stringify(metrics, null, 2));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.log(`
|
|
177
|
+
╔══════════════════════════════════════════╗
|
|
178
|
+
║ Judges Adoption — Executive Report ║
|
|
179
|
+
╠══════════════════════════════════════════╣
|
|
180
|
+
║ Adoption Score: ${metrics.adoptionScore.toString().padEnd(3)}/100 ║
|
|
181
|
+
║ Active Devs: ${metrics.activeDevelopers.toString().padEnd(24)}║
|
|
182
|
+
║ Total Scans: ${metrics.totalScans.toString().padEnd(24)}║
|
|
183
|
+
║ Findings Caught: ${metrics.totalFindings.toString().padEnd(24)}║
|
|
184
|
+
║ Fix Rate: ${(metrics.fixRate + "%").padEnd(24)}║
|
|
185
|
+
║ Cost Saved: $${metrics.costSaved.toLocaleString().padEnd(23)}║
|
|
186
|
+
╚══════════════════════════════════════════╝
|
|
187
|
+
`);
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Full report
|
|
192
|
+
if (format === "json") {
|
|
193
|
+
console.log(JSON.stringify(metrics, null, 2));
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
console.log(`\n Judges Adoption Report\n ──────────────────────────`);
|
|
197
|
+
console.log(` Adoption Score: ${metrics.adoptionScore}/100`);
|
|
198
|
+
console.log(` Active Developers: ${metrics.activeDevelopers}`);
|
|
199
|
+
console.log(` Total Scans: ${metrics.totalScans}`);
|
|
200
|
+
console.log(` Total Findings: ${metrics.totalFindings}`);
|
|
201
|
+
console.log(` Findings Fixed: ${metrics.findingsFixed}`);
|
|
202
|
+
console.log(` Fix Rate: ${metrics.fixRate}%`);
|
|
203
|
+
console.log(` Cost Saved: $${metrics.costSaved.toLocaleString()}`);
|
|
204
|
+
if (metrics.topCategories.length > 0) {
|
|
205
|
+
console.log(`\n Top Categories:`);
|
|
206
|
+
for (const c of metrics.topCategories) {
|
|
207
|
+
console.log(` ${c.category.padEnd(15)} ${c.count} findings`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (metrics.weeklyTrend.length > 0) {
|
|
211
|
+
console.log(`\n Recent Trends:`);
|
|
212
|
+
for (const w of metrics.weeklyTrend.slice(-5)) {
|
|
213
|
+
console.log(` ${w.week} ${w.scans} scans, ${w.findings} findings`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
console.log("");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=adoption-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adoption-report.js","sourceRoot":"","sources":["../../src/commands/adoption-report.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAiB5B,+EAA+E;AAE/E,SAAS,YAAY,CAAI,IAAY,EAAE,QAAW;IAChD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,OAAQ,WAAW,CAAC,QAAQ,CAAc,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,YAAY,CAEtB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAoE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtH,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,CAAC;IAC/D,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,+EAA+E;AAE/E,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;IACvF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1F,qCAAqC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjD,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,aAAa,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+C,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnG,sBAAsB;IACtB,MAAM,SAAS,GACb,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,CAAC,EACD,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,CACtG;QACH,CAAC,CAAC,CAAC,CAAC;IAER,wBAAwB;IACxB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC;QAAE,aAAa,IAAI,EAAE,CAAC;IACxC,IAAI,UAAU,GAAG,EAAE;QAAE,aAAa,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ,IAAI,CAAC;QAAE,aAAa,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,IAAI,EAAE;QAAE,aAAa,IAAI,EAAE,CAAC;IACxC,IAAI,OAAO,IAAI,EAAE;QAAE,aAAa,IAAI,EAAE,CAAC;IACvC,IAAI,OAAO,IAAI,EAAE;QAAE,aAAa,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,aAAa,IAAI,EAAE,CAAC;IACrD,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,aAAa,IAAI,EAAE,CAAC;IAEvD,OAAO;QACL,UAAU;QACV,aAAa;QACb,aAAa;QACb,OAAO;QACP,kBAAkB,EAAE,CAAC,EAAE,gCAAgC;QACvD,gBAAgB,EAAE,QAAQ;QAC1B,aAAa;QACb,WAAW;QACX,SAAS;QACT,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAef,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC;IAC1F,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,UAAU;IACV,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAClG,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,eAAe,OAAO,CAAC,aAAa,iBAAiB,OAAO,CAAC,UAAU,gBAAgB,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,gBAAgB,EAAE,CAC9I,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,SAAS;IACT,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACpC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9C,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,EAAE,CAC5G,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC;;;;wBAIM,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;wBAC1C,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9C,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;wBACxC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC3C,CAAC,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;yBACjC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;;CAErE,CAAC,CAAC;QACC,CAAC;QACD,OAAO;IACT,CAAC;IAED,cAAc;IACd,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,aAAa,MAAM,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI model trust — per-model confidence scoring based on
|
|
3
|
+
* LLM source fingerprinting and finding patterns.
|
|
4
|
+
*
|
|
5
|
+
* All analysis is local — no telemetry or data upload.
|
|
6
|
+
*/
|
|
7
|
+
interface TrustRecord {
|
|
8
|
+
model: string;
|
|
9
|
+
file: string;
|
|
10
|
+
trustScore: number;
|
|
11
|
+
signals: string[];
|
|
12
|
+
timestamp: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function analyzeFileTrust(filePath: string): TrustRecord;
|
|
15
|
+
export declare function runAiModelTrust(argv: string[]): void;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=ai-model-trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model-trust.d.ts","sourceRoot":"","sources":["../../src/commands/ai-model-trust.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAiHD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAsB9D;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiHpD"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI model trust — per-model confidence scoring based on
|
|
3
|
+
* LLM source fingerprinting and finding patterns.
|
|
4
|
+
*
|
|
5
|
+
* All analysis is local — no telemetry or data upload.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
const TRUST_DIR = ".judges-model-trust";
|
|
10
|
+
const TRUST_FILE = join(TRUST_DIR, "trust-history.json");
|
|
11
|
+
// ─── Model fingerprint database ─────────────────────────────────────────────
|
|
12
|
+
const MODEL_PROFILES = [
|
|
13
|
+
{
|
|
14
|
+
id: "copilot",
|
|
15
|
+
name: "GitHub Copilot",
|
|
16
|
+
patterns: [
|
|
17
|
+
"// Generated by Copilot",
|
|
18
|
+
"// TODO: implement",
|
|
19
|
+
"function handle",
|
|
20
|
+
"const app = express()",
|
|
21
|
+
"module.exports",
|
|
22
|
+
],
|
|
23
|
+
trustScore: 72,
|
|
24
|
+
strengths: ["Fast boilerplate", "Good Express/Node patterns", "IDE-integrated"],
|
|
25
|
+
weaknesses: ["Weak input validation", "Often skips error handling", "May leak secrets in config"],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: "gpt-4o",
|
|
29
|
+
name: "GPT-4o (ChatGPT)",
|
|
30
|
+
patterns: [
|
|
31
|
+
"// This function",
|
|
32
|
+
"/**\n * @description",
|
|
33
|
+
"try {\n } catch (error)",
|
|
34
|
+
"console.error(error)",
|
|
35
|
+
"// Handle error gracefully",
|
|
36
|
+
],
|
|
37
|
+
trustScore: 68,
|
|
38
|
+
strengths: ["Verbose documentation", "Comprehensive try-catch", "Good API patterns"],
|
|
39
|
+
weaknesses: ["Over-engineered abstractions", "Inconsistent naming", "Template strings in SQL"],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "claude",
|
|
43
|
+
name: "Claude (Anthropic)",
|
|
44
|
+
patterns: ["// Note:", "// Important:", "// Safety check", "if (!input) throw", "// Validate input"],
|
|
45
|
+
trustScore: 76,
|
|
46
|
+
strengths: ["Input validation awareness", "Security-conscious", "Clear error messages"],
|
|
47
|
+
weaknesses: ["Overly defensive code", "Verbose comments", "Complex type hierarchies"],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "cursor",
|
|
51
|
+
name: "Cursor AI",
|
|
52
|
+
patterns: ["// @cursor", "// cursor:", "export default function", "useEffect(() =>", "'use client'"],
|
|
53
|
+
trustScore: 70,
|
|
54
|
+
strengths: ["React/Next.js patterns", "Modern TypeScript", "Component patterns"],
|
|
55
|
+
weaknesses: ["Client-side secrets risk", "Missing CSP headers", "Weak API validation"],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "gemini",
|
|
59
|
+
name: "Google Gemini",
|
|
60
|
+
patterns: ["// Generated", "async function main()", "const result =", ".then(response =>", "// Process"],
|
|
61
|
+
trustScore: 65,
|
|
62
|
+
strengths: ["Clean async patterns", "Good Promise chains", "Concise code"],
|
|
63
|
+
weaknesses: ["Missing error boundaries", "Weak auth patterns", "No rate limiting"],
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
// ─── Core ───────────────────────────────────────────────────────────────────
|
|
67
|
+
function ensureDir() {
|
|
68
|
+
if (!existsSync(TRUST_DIR))
|
|
69
|
+
mkdirSync(TRUST_DIR, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
function loadStore() {
|
|
72
|
+
if (!existsSync(TRUST_FILE))
|
|
73
|
+
return { records: [], updatedAt: new Date().toISOString() };
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(readFileSync(TRUST_FILE, "utf-8"));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { records: [], updatedAt: new Date().toISOString() };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function saveStore(store) {
|
|
82
|
+
ensureDir();
|
|
83
|
+
store.updatedAt = new Date().toISOString();
|
|
84
|
+
writeFileSync(TRUST_FILE, JSON.stringify(store, null, 2));
|
|
85
|
+
}
|
|
86
|
+
function detectModel(content) {
|
|
87
|
+
let bestMatch = MODEL_PROFILES[0];
|
|
88
|
+
let bestScore = 0;
|
|
89
|
+
let bestSignals = [];
|
|
90
|
+
for (const profile of MODEL_PROFILES) {
|
|
91
|
+
const signals = [];
|
|
92
|
+
let matchCount = 0;
|
|
93
|
+
for (const pattern of profile.patterns) {
|
|
94
|
+
if (content.includes(pattern)) {
|
|
95
|
+
matchCount++;
|
|
96
|
+
signals.push(pattern.slice(0, 40));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const score = matchCount / profile.patterns.length;
|
|
100
|
+
if (score > bestScore) {
|
|
101
|
+
bestScore = score;
|
|
102
|
+
bestMatch = profile;
|
|
103
|
+
bestSignals = signals;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { model: bestMatch, confidence: Math.round(bestScore * 100), signals: bestSignals };
|
|
107
|
+
}
|
|
108
|
+
export function analyzeFileTrust(filePath) {
|
|
109
|
+
const content = readFileSync(filePath, "utf-8");
|
|
110
|
+
const { model, confidence, signals } = detectModel(content);
|
|
111
|
+
// Adjust trust based on confidence
|
|
112
|
+
const adjustedTrust = Math.round(model.trustScore * (0.5 + confidence / 200));
|
|
113
|
+
const record = {
|
|
114
|
+
model: model.id,
|
|
115
|
+
file: filePath,
|
|
116
|
+
trustScore: adjustedTrust,
|
|
117
|
+
signals,
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
};
|
|
120
|
+
// Persist
|
|
121
|
+
const store = loadStore();
|
|
122
|
+
store.records.push(record);
|
|
123
|
+
if (store.records.length > 500)
|
|
124
|
+
store.records = store.records.slice(-500);
|
|
125
|
+
saveStore(store);
|
|
126
|
+
return record;
|
|
127
|
+
}
|
|
128
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
129
|
+
export function runAiModelTrust(argv) {
|
|
130
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
131
|
+
console.log(`
|
|
132
|
+
judges ai-model-trust — AI model confidence scoring
|
|
133
|
+
|
|
134
|
+
Usage:
|
|
135
|
+
judges ai-model-trust --file src/app.ts
|
|
136
|
+
judges ai-model-trust --profiles
|
|
137
|
+
judges ai-model-trust --compare copilot claude
|
|
138
|
+
judges ai-model-trust --history
|
|
139
|
+
|
|
140
|
+
Options:
|
|
141
|
+
--file <path> Analyze a file for likely AI model source
|
|
142
|
+
--profiles Show all model profiles and trust scores
|
|
143
|
+
--compare <a> <b> Compare two model profiles side by side
|
|
144
|
+
--history Show trust analysis history
|
|
145
|
+
--format json JSON output
|
|
146
|
+
--help, -h Show this help
|
|
147
|
+
`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
151
|
+
// Profiles
|
|
152
|
+
if (argv.includes("--profiles")) {
|
|
153
|
+
if (format === "json") {
|
|
154
|
+
console.log(JSON.stringify(MODEL_PROFILES, null, 2));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(`\n AI Model Trust Profiles\n ──────────────────────────`);
|
|
158
|
+
for (const p of MODEL_PROFILES) {
|
|
159
|
+
console.log(` ${p.name.padEnd(22)} Trust: ${p.trustScore}/100`);
|
|
160
|
+
console.log(` Strengths: ${p.strengths.join(", ")}`);
|
|
161
|
+
console.log(` Weaknesses: ${p.weaknesses.join(", ")}`);
|
|
162
|
+
console.log("");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Compare
|
|
168
|
+
if (argv.includes("--compare")) {
|
|
169
|
+
const idx = argv.indexOf("--compare");
|
|
170
|
+
const a = argv[idx + 1];
|
|
171
|
+
const b = argv[idx + 2];
|
|
172
|
+
const profA = MODEL_PROFILES.find((p) => p.id === a);
|
|
173
|
+
const profB = MODEL_PROFILES.find((p) => p.id === b);
|
|
174
|
+
if (!profA || !profB) {
|
|
175
|
+
console.error(` Model not found. Available: ${MODEL_PROFILES.map((p) => p.id).join(", ")}`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (format === "json") {
|
|
179
|
+
console.log(JSON.stringify({ a: profA, b: profB }, null, 2));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(`\n Model Comparison\n ──────────────────────────`);
|
|
183
|
+
console.log(` ${"".padEnd(20)} ${profA.name.padEnd(25)} ${profB.name}`);
|
|
184
|
+
console.log(` ${"Trust Score".padEnd(20)} ${String(profA.trustScore).padEnd(25)} ${profB.trustScore}`);
|
|
185
|
+
console.log(` ${"Strengths".padEnd(20)} ${profA.strengths.length.toString().padEnd(25)} ${profB.strengths.length}`);
|
|
186
|
+
console.log(` ${"Weaknesses".padEnd(20)} ${profA.weaknesses.length.toString().padEnd(25)} ${profB.weaknesses.length}`);
|
|
187
|
+
console.log("");
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// History
|
|
192
|
+
if (argv.includes("--history")) {
|
|
193
|
+
const store = loadStore();
|
|
194
|
+
if (format === "json") {
|
|
195
|
+
console.log(JSON.stringify(store, null, 2));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log(`\n Trust Analysis History (${store.records.length} records)\n ──────────────────────────`);
|
|
199
|
+
for (const r of store.records.slice(-20)) {
|
|
200
|
+
console.log(` ${r.timestamp.slice(0, 10)} ${r.model.padEnd(10)} ${r.trustScore}/100 ${r.file}`);
|
|
201
|
+
}
|
|
202
|
+
console.log("");
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// Analyze file
|
|
207
|
+
const filePath = argv.find((_a, i) => argv[i - 1] === "--file");
|
|
208
|
+
if (!filePath) {
|
|
209
|
+
console.error(" Use --file <path>, --profiles, or --history. --help for usage.");
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (!existsSync(filePath)) {
|
|
213
|
+
console.error(` File not found: ${filePath}`);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const result = analyzeFileTrust(filePath);
|
|
217
|
+
const profile = MODEL_PROFILES.find((p) => p.id === result.model);
|
|
218
|
+
if (format === "json") {
|
|
219
|
+
console.log(JSON.stringify({ ...result, profile }, null, 2));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
console.log(`\n AI Model Trust Analysis — ${filePath}`);
|
|
223
|
+
console.log(` ──────────────────────────`);
|
|
224
|
+
console.log(` Likely model: ${profile?.name || result.model}`);
|
|
225
|
+
console.log(` Trust score: ${result.trustScore}/100`);
|
|
226
|
+
console.log(` Signals: ${result.signals.length > 0 ? result.signals.join("; ") : "No strong signals"}`);
|
|
227
|
+
if (profile) {
|
|
228
|
+
console.log(`\n Model strengths: ${profile.strengths.join(", ")}`);
|
|
229
|
+
console.log(` Model weaknesses: ${profile.weaknesses.join(", ")}`);
|
|
230
|
+
}
|
|
231
|
+
console.log(`\n Recommendation: ${result.trustScore >= 70 ? "Standard review" : "Enhanced review recommended"}`);
|
|
232
|
+
console.log("");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=ai-model-trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model-trust.js","sourceRoot":"","sources":["../../src/commands/ai-model-trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI prompt audit — scans AI-generated code for prompt injection
|
|
3
|
+
* risks: user input echoed into SQL, shell, config, etc.
|
|
4
|
+
*
|
|
5
|
+
* Pattern-based analysis only — no data stored externally.
|
|
6
|
+
*/
|
|
7
|
+
interface PromptRisk {
|
|
8
|
+
line: number;
|
|
9
|
+
pattern: string;
|
|
10
|
+
severity: "critical" | "high" | "medium";
|
|
11
|
+
description: string;
|
|
12
|
+
recommendation: string;
|
|
13
|
+
}
|
|
14
|
+
interface AuditResult {
|
|
15
|
+
file: string;
|
|
16
|
+
risks: PromptRisk[];
|
|
17
|
+
riskScore: number;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function auditFile(filePath: string): AuditResult;
|
|
21
|
+
export declare function runAiPromptAudit(argv: string[]): void;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=ai-prompt-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-prompt-audit.d.ts","sourceRoot":"","sources":["../../src/commands/ai-prompt-audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqHD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAyCvD;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqHrD"}
|