@kevinrabun/judges 3.41.0 → 3.43.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 +30 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +126 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/assign-findings.d.ts +37 -0
- package/dist/commands/assign-findings.d.ts.map +1 -0
- package/dist/commands/assign-findings.js +178 -0
- package/dist/commands/assign-findings.js.map +1 -0
- package/dist/commands/auto-triage.d.ts +32 -0
- package/dist/commands/auto-triage.d.ts.map +1 -0
- package/dist/commands/auto-triage.js +126 -0
- package/dist/commands/auto-triage.js.map +1 -0
- package/dist/commands/ci-template.d.ts +15 -0
- package/dist/commands/ci-template.d.ts.map +1 -0
- package/dist/commands/ci-template.js +212 -0
- package/dist/commands/ci-template.js.map +1 -0
- package/dist/commands/coverage-map.d.ts +23 -0
- package/dist/commands/coverage-map.d.ts.map +1 -0
- package/dist/commands/coverage-map.js +223 -0
- package/dist/commands/coverage-map.js.map +1 -0
- package/dist/commands/diff-only.d.ts +34 -0
- package/dist/commands/diff-only.d.ts.map +1 -0
- package/dist/commands/diff-only.js +152 -0
- package/dist/commands/diff-only.js.map +1 -0
- package/dist/commands/false-negatives.d.ts +35 -0
- package/dist/commands/false-negatives.d.ts.map +1 -0
- package/dist/commands/false-negatives.js +166 -0
- package/dist/commands/false-negatives.js.map +1 -0
- package/dist/commands/group-findings.d.ts +23 -0
- package/dist/commands/group-findings.d.ts.map +1 -0
- package/dist/commands/group-findings.js +155 -0
- package/dist/commands/group-findings.js.map +1 -0
- package/dist/commands/hook-install.d.ts +22 -0
- package/dist/commands/hook-install.d.ts.map +1 -0
- package/dist/commands/hook-install.js +143 -0
- package/dist/commands/hook-install.js.map +1 -0
- package/dist/commands/policy-audit.d.ts +53 -0
- package/dist/commands/policy-audit.d.ts.map +1 -0
- package/dist/commands/policy-audit.js +161 -0
- package/dist/commands/policy-audit.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +26 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +188 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/profile.d.ts +38 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +102 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/regression-alert.d.ts +32 -0
- package/dist/commands/regression-alert.d.ts.map +1 -0
- package/dist/commands/regression-alert.js +216 -0
- package/dist/commands/regression-alert.js.map +1 -0
- package/dist/commands/remediation.d.ts +21 -0
- package/dist/commands/remediation.d.ts.map +1 -0
- package/dist/commands/remediation.js +257 -0
- package/dist/commands/remediation.js.map +1 -0
- package/dist/commands/sla-track.d.ts +57 -0
- package/dist/commands/sla-track.d.ts.map +1 -0
- package/dist/commands/sla-track.js +269 -0
- package/dist/commands/sla-track.js.map +1 -0
- package/dist/commands/smart-select.d.ts +27 -0
- package/dist/commands/smart-select.d.ts.map +1 -0
- package/dist/commands/smart-select.js +346 -0
- package/dist/commands/smart-select.js.map +1 -0
- package/dist/commands/ticket-sync.d.ts +26 -0
- package/dist/commands/ticket-sync.d.ts.map +1 -0
- package/dist/commands/ticket-sync.js +236 -0
- package/dist/commands/ticket-sync.js.map +1 -0
- package/dist/commands/upload.d.ts +14 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +173 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/validate-config.d.ts +17 -0
- package/dist/commands/validate-config.d.ts.map +1 -0
- package/dist/commands/validate-config.js +268 -0
- package/dist/commands/validate-config.js.map +1 -0
- package/dist/commands/warm-cache.d.ts +31 -0
- package/dist/commands/warm-cache.d.ts.map +1 -0
- package/dist/commands/warm-cache.js +166 -0
- package/dist/commands/warm-cache.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges upload` — Upload SARIF results to GitHub Code Scanning.
|
|
3
|
+
*
|
|
4
|
+
* Pushes evaluation results directly to GitHub's Code Scanning API,
|
|
5
|
+
* making findings visible in the Security tab without needing
|
|
6
|
+
* github/codeql-action/upload-sarif in CI.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges upload results.sarif.json Upload SARIF file
|
|
10
|
+
* judges upload --file results.json --repo owner/repo Convert + upload
|
|
11
|
+
* judges upload --ref refs/heads/main --sha abc123 Specify git ref
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from "fs";
|
|
14
|
+
import { execSync } from "child_process";
|
|
15
|
+
import { resolve, basename } from "path";
|
|
16
|
+
import { gzipSync } from "zlib";
|
|
17
|
+
// ─── Git Helpers ────────────────────────────────────────────────────────────
|
|
18
|
+
function detectGitRef() {
|
|
19
|
+
try {
|
|
20
|
+
const branch = execSync("git rev-parse --abbrev-ref HEAD", { encoding: "utf-8" }).trim();
|
|
21
|
+
return `refs/heads/${branch}`;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return "refs/heads/main";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function detectGitSha() {
|
|
28
|
+
try {
|
|
29
|
+
return execSync("git rev-parse HEAD", { encoding: "utf-8" }).trim();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function detectRepo() {
|
|
36
|
+
try {
|
|
37
|
+
const remote = execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
38
|
+
const match = remote.match(/github\.com[/:]([^/]+\/[^/.]+)/);
|
|
39
|
+
return match?.[1]?.replace(/\.git$/, "") || "";
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ─── Upload ────────────────────────────────────────────────────────────────
|
|
46
|
+
async function uploadSarif(options) {
|
|
47
|
+
const { sarifPath, repo, ref, commitSha, token } = options;
|
|
48
|
+
if (!existsSync(sarifPath)) {
|
|
49
|
+
return { success: false, error: `File not found: ${sarifPath}` };
|
|
50
|
+
}
|
|
51
|
+
const sarifContent = readFileSync(sarifPath, "utf-8");
|
|
52
|
+
// Validate it's valid JSON
|
|
53
|
+
try {
|
|
54
|
+
JSON.parse(sarifContent);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { success: false, error: "Invalid JSON in SARIF file" };
|
|
58
|
+
}
|
|
59
|
+
// GitHub requires gzip + base64 encoding
|
|
60
|
+
const compressed = gzipSync(Buffer.from(sarifContent, "utf-8"));
|
|
61
|
+
const encoded = compressed.toString("base64");
|
|
62
|
+
const apiUrl = `https://api.github.com/repos/${repo}/code-scanning/sarifs`;
|
|
63
|
+
const body = JSON.stringify({
|
|
64
|
+
commit_sha: commitSha,
|
|
65
|
+
ref,
|
|
66
|
+
sarif: encoded,
|
|
67
|
+
tool_name: "Judges Panel",
|
|
68
|
+
});
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(apiUrl, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: {
|
|
73
|
+
Authorization: `Bearer ${token}`,
|
|
74
|
+
Accept: "application/vnd.github+json",
|
|
75
|
+
"Content-Type": "application/json",
|
|
76
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
77
|
+
},
|
|
78
|
+
body,
|
|
79
|
+
});
|
|
80
|
+
if (response.ok || response.status === 202) {
|
|
81
|
+
const data = (await response.json());
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
id: data.id,
|
|
85
|
+
url: data.url,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const errorData = (await response.json().catch(() => ({})));
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
error: `GitHub API ${response.status}: ${errorData.message || response.statusText}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
error: `Upload failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ─── CLI Runner ─────────────────────────────────────────────────────────────
|
|
102
|
+
export async function runUpload(argv) {
|
|
103
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
104
|
+
console.log(`
|
|
105
|
+
judges upload — Upload SARIF results to GitHub Code Scanning
|
|
106
|
+
|
|
107
|
+
Usage:
|
|
108
|
+
judges upload <sarif-file> Upload SARIF file
|
|
109
|
+
judges upload --file <sarif-file> Upload SARIF file (alternate)
|
|
110
|
+
judges upload --repo <owner/repo> Specify target repository
|
|
111
|
+
judges upload --ref <git-ref> Git ref (default: current branch)
|
|
112
|
+
judges upload --sha <commit-sha> Git commit SHA (default: HEAD)
|
|
113
|
+
judges upload --token <github-token> GitHub token (default: GITHUB_TOKEN env)
|
|
114
|
+
|
|
115
|
+
The SARIF file is gzipped and base64-encoded before upload, as required by
|
|
116
|
+
the GitHub Code Scanning API.
|
|
117
|
+
|
|
118
|
+
Environment Variables:
|
|
119
|
+
GITHUB_TOKEN GitHub API token with security_events scope
|
|
120
|
+
|
|
121
|
+
Options:
|
|
122
|
+
--file <path> Path to SARIF file
|
|
123
|
+
--repo <owner/repo> GitHub repository (auto-detected from git remote)
|
|
124
|
+
--ref <ref> Git ref (auto-detected from current branch)
|
|
125
|
+
--sha <sha> Commit SHA (auto-detected from HEAD)
|
|
126
|
+
--token <token> GitHub token (or set GITHUB_TOKEN env var)
|
|
127
|
+
--help, -h Show this help
|
|
128
|
+
`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Parse args
|
|
132
|
+
const sarifPath = resolve(argv.find((_a, i) => argv[i - 1] === "--file") ||
|
|
133
|
+
argv.find((a, i) => i > 1 && !a.startsWith("-") && a.endsWith(".json")) ||
|
|
134
|
+
"");
|
|
135
|
+
if (!sarifPath || !existsSync(sarifPath)) {
|
|
136
|
+
console.error("\n Error: Please provide a SARIF file path.\n");
|
|
137
|
+
console.error(" Usage: judges upload <sarif-file>\n");
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const repo = argv.find((_a, i) => argv[i - 1] === "--repo") || detectRepo();
|
|
141
|
+
const ref = argv.find((_a, i) => argv[i - 1] === "--ref") || detectGitRef();
|
|
142
|
+
const commitSha = argv.find((_a, i) => argv[i - 1] === "--sha") || detectGitSha();
|
|
143
|
+
const token = argv.find((_a, i) => argv[i - 1] === "--token") || process.env.GITHUB_TOKEN || "";
|
|
144
|
+
if (!repo) {
|
|
145
|
+
console.error("\n Error: Could not detect repository. Use --repo owner/repo\n");
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (!commitSha) {
|
|
149
|
+
console.error("\n Error: Could not detect commit SHA. Use --sha <sha>\n");
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
if (!token) {
|
|
153
|
+
console.error("\n Error: No GitHub token found. Set GITHUB_TOKEN env var or use --token\n");
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
console.log(`\n Uploading SARIF to GitHub Code Scanning...`);
|
|
157
|
+
console.log(` Repository: ${repo}`);
|
|
158
|
+
console.log(` Ref: ${ref}`);
|
|
159
|
+
console.log(` Commit: ${commitSha.slice(0, 7)}`);
|
|
160
|
+
console.log(` File: ${basename(sarifPath)}\n`);
|
|
161
|
+
const result = await uploadSarif({ sarifPath, repo, ref, commitSha, token });
|
|
162
|
+
if (result.success) {
|
|
163
|
+
console.log(" ✅ SARIF uploaded successfully.");
|
|
164
|
+
if (result.id)
|
|
165
|
+
console.log(` Analysis ID: ${result.id}`);
|
|
166
|
+
console.log(` View results: https://github.com/${repo}/security/code-scanning\n`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.error(` ❌ Upload failed: ${result.error}\n`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config validation — validate .judgesrc against the JSON schema
|
|
3
|
+
* and report errors with line numbers and fix suggestions.
|
|
4
|
+
*/
|
|
5
|
+
export interface ValidationError {
|
|
6
|
+
path: string;
|
|
7
|
+
message: string;
|
|
8
|
+
suggestion?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ValidationResult {
|
|
11
|
+
valid: boolean;
|
|
12
|
+
errors: ValidationError[];
|
|
13
|
+
warnings: ValidationError[];
|
|
14
|
+
}
|
|
15
|
+
export declare function validateConfig(config: Record<string, unknown>): ValidationResult;
|
|
16
|
+
export declare function runValidateConfig(argv: string[]): void;
|
|
17
|
+
//# sourceMappingURL=validate-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../src/commands/validate-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAqDD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAuIhF;AAiCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA6EtD"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config validation — validate .judgesrc against the JSON schema
|
|
3
|
+
* and report errors with line numbers and fix suggestions.
|
|
4
|
+
*/
|
|
5
|
+
// ─── Known Fields ───────────────────────────────────────────────────────────
|
|
6
|
+
const KNOWN_TOP_FIELDS = new Set([
|
|
7
|
+
"preset",
|
|
8
|
+
"presets",
|
|
9
|
+
"severity",
|
|
10
|
+
"minSeverity",
|
|
11
|
+
"format",
|
|
12
|
+
"disabledJudges",
|
|
13
|
+
"disabledRules",
|
|
14
|
+
"ruleOverrides",
|
|
15
|
+
"parallel",
|
|
16
|
+
"concurrency",
|
|
17
|
+
"failOnFindings",
|
|
18
|
+
"summary",
|
|
19
|
+
"baseline",
|
|
20
|
+
"exclude",
|
|
21
|
+
"include",
|
|
22
|
+
"judges",
|
|
23
|
+
"notifications",
|
|
24
|
+
"qualityGate",
|
|
25
|
+
"plugins",
|
|
26
|
+
"extends",
|
|
27
|
+
"language",
|
|
28
|
+
"framework",
|
|
29
|
+
"dataAdapter",
|
|
30
|
+
"smartSelect",
|
|
31
|
+
"customRules",
|
|
32
|
+
"organizationPolicy",
|
|
33
|
+
"cache",
|
|
34
|
+
"autoFix",
|
|
35
|
+
"triage",
|
|
36
|
+
"deprecated",
|
|
37
|
+
"ignorePatterns",
|
|
38
|
+
]);
|
|
39
|
+
const KNOWN_SEVERITIES = new Set(["critical", "high", "medium", "low", "info"]);
|
|
40
|
+
const KNOWN_FORMATS = new Set([
|
|
41
|
+
"text",
|
|
42
|
+
"json",
|
|
43
|
+
"sarif",
|
|
44
|
+
"markdown",
|
|
45
|
+
"html",
|
|
46
|
+
"pdf",
|
|
47
|
+
"junit",
|
|
48
|
+
"codeclimate",
|
|
49
|
+
"github-actions",
|
|
50
|
+
]);
|
|
51
|
+
// ─── Validation Logic ───────────────────────────────────────────────────────
|
|
52
|
+
export function validateConfig(config) {
|
|
53
|
+
const errors = [];
|
|
54
|
+
const warnings = [];
|
|
55
|
+
// Check for unknown top-level fields
|
|
56
|
+
for (const key of Object.keys(config)) {
|
|
57
|
+
if (!KNOWN_TOP_FIELDS.has(key)) {
|
|
58
|
+
warnings.push({
|
|
59
|
+
path: key,
|
|
60
|
+
message: `Unknown field "${key}"`,
|
|
61
|
+
suggestion: findClosestMatch(key, KNOWN_TOP_FIELDS),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Validate severity
|
|
66
|
+
if (config.minSeverity !== undefined) {
|
|
67
|
+
if (typeof config.minSeverity !== "string" || !KNOWN_SEVERITIES.has(config.minSeverity)) {
|
|
68
|
+
errors.push({
|
|
69
|
+
path: "minSeverity",
|
|
70
|
+
message: `Invalid severity "${config.minSeverity}". Must be one of: ${[...KNOWN_SEVERITIES].join(", ")}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Validate format
|
|
75
|
+
if (config.format !== undefined) {
|
|
76
|
+
if (typeof config.format !== "string" || !KNOWN_FORMATS.has(config.format)) {
|
|
77
|
+
errors.push({
|
|
78
|
+
path: "format",
|
|
79
|
+
message: `Invalid format "${config.format}". Must be one of: ${[...KNOWN_FORMATS].join(", ")}`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Validate disabledJudges is array of strings
|
|
84
|
+
if (config.disabledJudges !== undefined) {
|
|
85
|
+
if (!Array.isArray(config.disabledJudges)) {
|
|
86
|
+
errors.push({
|
|
87
|
+
path: "disabledJudges",
|
|
88
|
+
message: "disabledJudges must be an array of strings",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Validate disabledRules is array of strings
|
|
93
|
+
if (config.disabledRules !== undefined) {
|
|
94
|
+
if (!Array.isArray(config.disabledRules)) {
|
|
95
|
+
errors.push({
|
|
96
|
+
path: "disabledRules",
|
|
97
|
+
message: "disabledRules must be an array of strings",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Validate ruleOverrides
|
|
102
|
+
if (config.ruleOverrides !== undefined) {
|
|
103
|
+
if (typeof config.ruleOverrides !== "object" || config.ruleOverrides === null) {
|
|
104
|
+
errors.push({
|
|
105
|
+
path: "ruleOverrides",
|
|
106
|
+
message: "ruleOverrides must be an object",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
for (const [rule, override] of Object.entries(config.ruleOverrides)) {
|
|
111
|
+
if (typeof override === "object" && override !== null) {
|
|
112
|
+
const ov = override;
|
|
113
|
+
if (ov.severity && !KNOWN_SEVERITIES.has(ov.severity)) {
|
|
114
|
+
errors.push({
|
|
115
|
+
path: `ruleOverrides.${rule}.severity`,
|
|
116
|
+
message: `Invalid severity "${ov.severity}"`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Validate concurrency
|
|
124
|
+
if (config.concurrency !== undefined) {
|
|
125
|
+
if (typeof config.concurrency !== "number" || config.concurrency < 1) {
|
|
126
|
+
errors.push({
|
|
127
|
+
path: "concurrency",
|
|
128
|
+
message: "concurrency must be a positive number",
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Validate exclude/include patterns
|
|
133
|
+
for (const field of ["exclude", "include"]) {
|
|
134
|
+
if (config[field] !== undefined) {
|
|
135
|
+
if (!Array.isArray(config[field])) {
|
|
136
|
+
errors.push({
|
|
137
|
+
path: field,
|
|
138
|
+
message: `${field} must be an array of glob patterns`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Validate notifications
|
|
144
|
+
if (config.notifications !== undefined) {
|
|
145
|
+
const notifs = config.notifications;
|
|
146
|
+
if (notifs.channels && !Array.isArray(notifs.channels)) {
|
|
147
|
+
errors.push({
|
|
148
|
+
path: "notifications.channels",
|
|
149
|
+
message: "notifications.channels must be an array",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Validate qualityGate
|
|
154
|
+
if (config.qualityGate !== undefined) {
|
|
155
|
+
const qg = config.qualityGate;
|
|
156
|
+
if (qg.maxFindings !== undefined && (typeof qg.maxFindings !== "number" || qg.maxFindings < 0)) {
|
|
157
|
+
errors.push({
|
|
158
|
+
path: "qualityGate.maxFindings",
|
|
159
|
+
message: "qualityGate.maxFindings must be a non-negative number",
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
if (qg.minScore !== undefined &&
|
|
163
|
+
(typeof qg.minScore !== "number" || qg.minScore < 0 || qg.minScore > 100)) {
|
|
164
|
+
errors.push({
|
|
165
|
+
path: "qualityGate.minScore",
|
|
166
|
+
message: "qualityGate.minScore must be between 0 and 100",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
valid: errors.length === 0,
|
|
172
|
+
errors,
|
|
173
|
+
warnings,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function findClosestMatch(input, candidates) {
|
|
177
|
+
let best;
|
|
178
|
+
let bestDist = Infinity;
|
|
179
|
+
for (const c of candidates) {
|
|
180
|
+
const dist = levenshtein(input.toLowerCase(), c.toLowerCase());
|
|
181
|
+
if (dist < bestDist && dist <= 3) {
|
|
182
|
+
bestDist = dist;
|
|
183
|
+
best = c;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return best ? `Did you mean "${best}"?` : undefined;
|
|
187
|
+
}
|
|
188
|
+
function levenshtein(a, b) {
|
|
189
|
+
const m = a.length, n = b.length;
|
|
190
|
+
const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
|
|
191
|
+
for (let i = 1; i <= m; i++) {
|
|
192
|
+
for (let j = 1; j <= n; j++) {
|
|
193
|
+
dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return dp[m][n];
|
|
197
|
+
}
|
|
198
|
+
// ─── CLI ────────────────────────────────────────────────────────────────────
|
|
199
|
+
export function runValidateConfig(argv) {
|
|
200
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
201
|
+
console.log(`
|
|
202
|
+
judges validate-config — Validate .judgesrc configuration
|
|
203
|
+
|
|
204
|
+
Usage:
|
|
205
|
+
judges validate-config Validate .judgesrc in current directory
|
|
206
|
+
judges validate-config --config path/to/.judgesrc Validate specific file
|
|
207
|
+
|
|
208
|
+
Options:
|
|
209
|
+
--config <path> Config file to validate (default: .judgesrc)
|
|
210
|
+
--format json JSON output
|
|
211
|
+
--strict Treat warnings as errors
|
|
212
|
+
--help, -h Show this help
|
|
213
|
+
`);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const { readFileSync, existsSync } = require("fs");
|
|
217
|
+
const { resolve } = require("path");
|
|
218
|
+
const configPath = argv.find((_a, i) => argv[i - 1] === "--config") || ".judgesrc";
|
|
219
|
+
const format = argv.find((_a, i) => argv[i - 1] === "--format") || "text";
|
|
220
|
+
const strict = argv.includes("--strict");
|
|
221
|
+
const resolved = resolve(configPath);
|
|
222
|
+
if (!existsSync(resolved)) {
|
|
223
|
+
console.error(`Error: config file not found: ${resolved}`);
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
let config;
|
|
227
|
+
try {
|
|
228
|
+
config = JSON.parse(readFileSync(resolved, "utf-8"));
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
console.error(`Error: invalid JSON in ${resolved}: ${e instanceof Error ? e.message : e}`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
const result = validateConfig(config);
|
|
235
|
+
if (strict && result.warnings.length > 0) {
|
|
236
|
+
result.valid = false;
|
|
237
|
+
result.errors.push(...result.warnings);
|
|
238
|
+
}
|
|
239
|
+
if (format === "json") {
|
|
240
|
+
console.log(JSON.stringify(result, null, 2));
|
|
241
|
+
process.exit(result.valid ? 0 : 1);
|
|
242
|
+
}
|
|
243
|
+
if (result.valid && result.warnings.length === 0) {
|
|
244
|
+
console.log(`\n ✅ Config is valid: ${resolved}\n`);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
console.log(`\n Config Validation: ${resolved}\n`);
|
|
248
|
+
if (result.errors.length > 0) {
|
|
249
|
+
console.log(` ❌ Errors (${result.errors.length}):`);
|
|
250
|
+
for (const e of result.errors) {
|
|
251
|
+
console.log(` ${e.path}: ${e.message}`);
|
|
252
|
+
if (e.suggestion)
|
|
253
|
+
console.log(` 💡 ${e.suggestion}`);
|
|
254
|
+
}
|
|
255
|
+
console.log("");
|
|
256
|
+
}
|
|
257
|
+
if (result.warnings.length > 0) {
|
|
258
|
+
console.log(` ⚠️ Warnings (${result.warnings.length}):`);
|
|
259
|
+
for (const w of result.warnings) {
|
|
260
|
+
console.log(` ${w.path}: ${w.message}`);
|
|
261
|
+
if (w.suggestion)
|
|
262
|
+
console.log(` 💡 ${w.suggestion}`);
|
|
263
|
+
}
|
|
264
|
+
console.log("");
|
|
265
|
+
}
|
|
266
|
+
process.exit(result.valid ? 0 : 1);
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=validate-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-config.js","sourceRoot":"","sources":["../../src/commands/validate-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,SAAS;IACT,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,eAAe;IACf,aAAa;IACb,SAAS;IACT,SAAS;IACT,UAAU;IACV,WAAW;IACX,aAAa;IACb,aAAa;IACb,aAAa;IACb,oBAAoB;IACpB,OAAO;IACP,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAChF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,MAAM;IACN,OAAO;IACP,UAAU;IACV,MAAM;IACN,KAAK;IACL,OAAO;IACP,aAAa;IACb,gBAAgB;CACjB,CAAC,CAAC;AAEH,+EAA+E;AAE/E,MAAM,UAAU,cAAc,CAAC,MAA+B;IAC5D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,qCAAqC;IACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,kBAAkB,GAAG,GAAG;gBACjC,UAAU,EAAE,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAqB,CAAC,EAAE,CAAC;YAClG,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,qBAAqB,MAAM,CAAC,WAAW,sBAAsB,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACzG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAgB,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mBAAmB,MAAM,CAAC,MAAM,sBAAsB,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC/F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,4CAA4C;aACtD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,2CAA2C;aACrD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,iCAAiC;aAC3C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAwC,CAAC,EAAE,CAAC;gBAC/F,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACtD,MAAM,EAAE,GAAG,QAAmC,CAAC;oBAC/C,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAkB,CAAC,EAAE,CAAC;wBAChE,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,iBAAiB,IAAI,WAAW;4BACtC,OAAO,EAAE,qBAAqB,EAAE,CAAC,QAAQ,GAAG;yBAC7C,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAK,MAAM,CAAC,WAAsB,GAAG,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,SAAS,CAAU,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,GAAG,KAAK,oCAAoC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,aAAwC,CAAC;QAC/D,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,yCAAyC;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAsC,CAAC;QACzD,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,KAAK,QAAQ,IAAK,EAAE,CAAC,WAAsB,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3G,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,uDAAuD;aACjE,CAAC,CAAC;QACL,CAAC;QACD,IACE,EAAE,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,OAAO,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAK,EAAE,CAAC,QAAmB,GAAG,CAAC,IAAK,EAAE,CAAC,QAAmB,GAAG,GAAG,CAAC,EACjG,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,gDAAgD;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,UAAuB;IAC9D,IAAI,IAAwB,CAAC;IAC7B,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAExB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/D,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACjC,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAChB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACf,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACzE,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,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;;;;;;;;;;;;CAYf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAU,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,WAAW,CAAC;IACnG,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,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAErC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,QAAQ,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,MAA4C,CAAC,CAAC;IAE5E,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,IAAI,CAAC,CAAC;IAEpD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,UAAU;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,UAAU;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval cache warming — pre-populate the evaluation cache with
|
|
3
|
+
* common patterns so CI runs start warm and skip known-good files.
|
|
4
|
+
*
|
|
5
|
+
* Works with the existing disk-cache system: scans the project,
|
|
6
|
+
* evaluates files, and stores results. Subsequent CI runs check
|
|
7
|
+
* the cache first and skip files whose hash hasn't changed.
|
|
8
|
+
*/
|
|
9
|
+
export interface WarmingResult {
|
|
10
|
+
filesScanned: number;
|
|
11
|
+
filesCached: number;
|
|
12
|
+
filesSkipped: number;
|
|
13
|
+
durationMs: number;
|
|
14
|
+
cacheDir: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WarmingOptions {
|
|
17
|
+
/** Root directory to scan */
|
|
18
|
+
root: string;
|
|
19
|
+
/** File extensions to include */
|
|
20
|
+
extensions: string[];
|
|
21
|
+
/** Glob patterns to exclude */
|
|
22
|
+
exclude: string[];
|
|
23
|
+
/** Maximum files to warm */
|
|
24
|
+
maxFiles: number;
|
|
25
|
+
/** Cache directory */
|
|
26
|
+
cacheDir?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function computeFileHash(content: string): string;
|
|
29
|
+
export declare function warmCache(options?: Partial<WarmingOptions>): Promise<WarmingResult>;
|
|
30
|
+
export declare function runWarmCache(argv: string[]): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=warm-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warm-cache.d.ts","sourceRoot":"","sources":["../../src/commands/warm-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAsCD,wBAAsB,SAAS,CAAC,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmF7F;AAID,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChE"}
|