@kevinrabun/judges 3.38.0 → 3.41.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 +68 -0
- package/README.md +5 -4
- package/dist/api.d.ts +5 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +5 -1
- package/dist/api.js.map +1 -1
- package/dist/ast/structural-parser.js +3 -3
- package/dist/ast/structural-parser.js.map +1 -1
- package/dist/calibration.d.ts +35 -0
- package/dist/calibration.d.ts.map +1 -1
- package/dist/calibration.js +52 -0
- package/dist/calibration.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +370 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto-calibrate.d.ts +15 -0
- package/dist/commands/auto-calibrate.d.ts.map +1 -0
- package/dist/commands/auto-calibrate.js +107 -0
- package/dist/commands/auto-calibrate.js.map +1 -0
- package/dist/commands/benchmark-languages.js +4 -4
- package/dist/commands/benchmark.d.ts +2 -1
- package/dist/commands/benchmark.d.ts.map +1 -1
- package/dist/commands/benchmark.js +67 -2
- package/dist/commands/benchmark.js.map +1 -1
- package/dist/commands/calibration-dashboard.d.ts.map +1 -1
- package/dist/commands/calibration-dashboard.js +198 -0
- package/dist/commands/calibration-dashboard.js.map +1 -1
- package/dist/commands/calibration-share.d.ts +31 -0
- package/dist/commands/calibration-share.d.ts.map +1 -0
- package/dist/commands/calibration-share.js +183 -0
- package/dist/commands/calibration-share.js.map +1 -0
- package/dist/commands/compliance-report.d.ts +35 -0
- package/dist/commands/compliance-report.d.ts.map +1 -0
- package/dist/commands/compliance-report.js +162 -0
- package/dist/commands/compliance-report.js.map +1 -0
- package/dist/commands/config-migrate.d.ts +44 -0
- package/dist/commands/config-migrate.d.ts.map +1 -0
- package/dist/commands/config-migrate.js +241 -0
- package/dist/commands/config-migrate.js.map +1 -0
- package/dist/commands/dedup-report.d.ts +13 -0
- package/dist/commands/dedup-report.d.ts.map +1 -0
- package/dist/commands/dedup-report.js +138 -0
- package/dist/commands/dedup-report.js.map +1 -0
- package/dist/commands/dep-audit.d.ts +53 -0
- package/dist/commands/dep-audit.d.ts.map +1 -0
- package/dist/commands/dep-audit.js +278 -0
- package/dist/commands/dep-audit.js.map +1 -0
- package/dist/commands/deprecated.d.ts +48 -0
- package/dist/commands/deprecated.d.ts.map +1 -0
- package/dist/commands/deprecated.js +202 -0
- package/dist/commands/deprecated.js.map +1 -0
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +8 -3
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/feedback-rules.d.ts +29 -0
- package/dist/commands/feedback-rules.d.ts.map +1 -0
- package/dist/commands/feedback-rules.js +174 -0
- package/dist/commands/feedback-rules.js.map +1 -0
- package/dist/commands/feedback.d.ts +12 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +16 -0
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/fix-pr.d.ts +23 -0
- package/dist/commands/fix-pr.d.ts.map +1 -0
- package/dist/commands/fix-pr.js +323 -0
- package/dist/commands/fix-pr.js.map +1 -0
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +33 -1
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/governance.d.ts +32 -0
- package/dist/commands/governance.d.ts.map +1 -0
- package/dist/commands/governance.js +203 -0
- package/dist/commands/governance.js.map +1 -0
- package/dist/commands/help.d.ts +8 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +303 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +17 -20
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/interactive-fix.d.ts +23 -0
- package/dist/commands/interactive-fix.d.ts.map +1 -0
- package/dist/commands/interactive-fix.js +140 -0
- package/dist/commands/interactive-fix.js.map +1 -0
- package/dist/commands/llm-benchmark.d.ts +119 -0
- package/dist/commands/llm-benchmark.d.ts.map +1 -0
- package/dist/commands/llm-benchmark.js +396 -0
- package/dist/commands/llm-benchmark.js.map +1 -0
- package/dist/commands/metrics-dashboard.d.ts +22 -0
- package/dist/commands/metrics-dashboard.d.ts.map +1 -0
- package/dist/commands/metrics-dashboard.js +335 -0
- package/dist/commands/metrics-dashboard.js.map +1 -0
- package/dist/commands/metrics.d.ts +58 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +242 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/monorepo.d.ts +38 -0
- package/dist/commands/monorepo.d.ts.map +1 -0
- package/dist/commands/monorepo.js +233 -0
- package/dist/commands/monorepo.js.map +1 -0
- package/dist/commands/notify.d.ts +79 -0
- package/dist/commands/notify.d.ts.map +1 -0
- package/dist/commands/notify.js +325 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/onboard.d.ts +13 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +179 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/org-metrics.d.ts +24 -0
- package/dist/commands/org-metrics.d.ts.map +1 -0
- package/dist/commands/org-metrics.js +238 -0
- package/dist/commands/org-metrics.js.map +1 -0
- package/dist/commands/override.d.ts +62 -0
- package/dist/commands/override.d.ts.map +1 -0
- package/dist/commands/override.js +264 -0
- package/dist/commands/override.js.map +1 -0
- package/dist/commands/parity.d.ts +31 -0
- package/dist/commands/parity.d.ts.map +1 -0
- package/dist/commands/parity.js +213 -0
- package/dist/commands/parity.js.map +1 -0
- package/dist/commands/plugin-search.d.ts +40 -0
- package/dist/commands/plugin-search.d.ts.map +1 -0
- package/dist/commands/plugin-search.js +328 -0
- package/dist/commands/plugin-search.js.map +1 -0
- package/dist/commands/plugins.d.ts +13 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +105 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/quality-gate.d.ts +70 -0
- package/dist/commands/quality-gate.d.ts.map +1 -0
- package/dist/commands/quality-gate.js +264 -0
- package/dist/commands/quality-gate.js.map +1 -0
- package/dist/commands/review.js +1 -1
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/snapshot.d.ts +27 -0
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/snapshot.js +99 -0
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/trace.d.ts +65 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +246 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/trust-ramp.d.ts +30 -0
- package/dist/commands/trust-ramp.d.ts.map +1 -0
- package/dist/commands/trust-ramp.js +190 -0
- package/dist/commands/trust-ramp.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -1
- package/dist/data-adapter.d.ts +124 -0
- package/dist/data-adapter.d.ts.map +1 -0
- package/dist/data-adapter.js +213 -0
- package/dist/data-adapter.js.map +1 -0
- package/dist/evaluators/accessibility.js +1 -1
- package/dist/evaluators/accessibility.js.map +1 -1
- package/dist/evaluators/ai-code-safety.d.ts.map +1 -1
- package/dist/evaluators/ai-code-safety.js +1 -4
- package/dist/evaluators/ai-code-safety.js.map +1 -1
- package/dist/evaluators/cost-effectiveness.js +1 -1
- package/dist/evaluators/cost-effectiveness.js.map +1 -1
- package/dist/evaluators/false-positive-review.js +4 -4
- package/dist/evaluators/false-positive-review.js.map +1 -1
- package/dist/evaluators/framework-rules.d.ts +59 -0
- package/dist/evaluators/framework-rules.d.ts.map +1 -0
- package/dist/evaluators/framework-rules.js +292 -0
- package/dist/evaluators/framework-rules.js.map +1 -0
- package/dist/evaluators/iac-security.js +1 -1
- package/dist/evaluators/iac-security.js.map +1 -1
- package/dist/evaluators/index.d.ts.map +1 -1
- package/dist/evaluators/index.js +59 -10
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/intent-alignment.d.ts +4 -0
- package/dist/evaluators/intent-alignment.d.ts.map +1 -1
- package/dist/evaluators/intent-alignment.js +163 -0
- package/dist/evaluators/intent-alignment.js.map +1 -1
- package/dist/evaluators/logic-review.js +1 -1
- package/dist/evaluators/logic-review.js.map +1 -1
- package/dist/evaluators/maintainability.js +1 -1
- package/dist/evaluators/maintainability.js.map +1 -1
- package/dist/evaluators/over-engineering.js +3 -3
- package/dist/evaluators/over-engineering.js.map +1 -1
- package/dist/evaluators/project.d.ts +12 -0
- package/dist/evaluators/project.d.ts.map +1 -1
- package/dist/evaluators/project.js +86 -0
- package/dist/evaluators/project.js.map +1 -1
- package/dist/evaluators/security.js +2 -2
- package/dist/evaluators/security.js.map +1 -1
- package/dist/evaluators/ux.js +1 -1
- package/dist/evaluators/ux.js.map +1 -1
- package/dist/finding-lifecycle.d.ts +9 -0
- package/dist/finding-lifecycle.d.ts.map +1 -1
- package/dist/finding-lifecycle.js +15 -0
- package/dist/finding-lifecycle.js.map +1 -1
- package/dist/fix-history.d.ts +9 -0
- package/dist/fix-history.d.ts.map +1 -1
- package/dist/fix-history.js +15 -0
- package/dist/fix-history.js.map +1 -1
- package/dist/formatters/sarif.d.ts +3 -0
- package/dist/formatters/sarif.d.ts.map +1 -1
- package/dist/formatters/sarif.js +36 -12
- package/dist/formatters/sarif.js.map +1 -1
- package/dist/github-app.d.ts +16 -1
- package/dist/github-app.d.ts.map +1 -1
- package/dist/github-app.js +85 -2
- package/dist/github-app.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/judge-registry.d.ts +157 -0
- package/dist/judge-registry.d.ts.map +1 -0
- package/dist/judge-registry.js +273 -0
- package/dist/judge-registry.js.map +1 -0
- package/dist/judges/accessibility.d.ts.map +1 -1
- package/dist/judges/accessibility.js +4 -0
- package/dist/judges/accessibility.js.map +1 -1
- package/dist/judges/agent-instructions.d.ts.map +1 -1
- package/dist/judges/agent-instructions.js +4 -0
- package/dist/judges/agent-instructions.js.map +1 -1
- package/dist/judges/ai-code-safety.d.ts.map +1 -1
- package/dist/judges/ai-code-safety.js +4 -0
- package/dist/judges/ai-code-safety.js.map +1 -1
- package/dist/judges/api-contract.d.ts.map +1 -1
- package/dist/judges/api-contract.js +4 -0
- package/dist/judges/api-contract.js.map +1 -1
- package/dist/judges/api-design.d.ts.map +1 -1
- package/dist/judges/api-design.js +4 -0
- package/dist/judges/api-design.js.map +1 -1
- package/dist/judges/authentication.d.ts.map +1 -1
- package/dist/judges/authentication.js +4 -0
- package/dist/judges/authentication.js.map +1 -1
- package/dist/judges/backwards-compatibility.d.ts.map +1 -1
- package/dist/judges/backwards-compatibility.js +4 -0
- package/dist/judges/backwards-compatibility.js.map +1 -1
- package/dist/judges/caching.d.ts.map +1 -1
- package/dist/judges/caching.js +4 -0
- package/dist/judges/caching.js.map +1 -1
- package/dist/judges/ci-cd.d.ts.map +1 -1
- package/dist/judges/ci-cd.js +4 -0
- package/dist/judges/ci-cd.js.map +1 -1
- package/dist/judges/cloud-readiness.d.ts.map +1 -1
- package/dist/judges/cloud-readiness.js +4 -0
- package/dist/judges/cloud-readiness.js.map +1 -1
- package/dist/judges/code-structure.d.ts.map +1 -1
- package/dist/judges/code-structure.js +4 -0
- package/dist/judges/code-structure.js.map +1 -1
- package/dist/judges/compliance.d.ts.map +1 -1
- package/dist/judges/compliance.js +4 -0
- package/dist/judges/compliance.js.map +1 -1
- package/dist/judges/concurrency.d.ts.map +1 -1
- package/dist/judges/concurrency.js +4 -0
- package/dist/judges/concurrency.js.map +1 -1
- package/dist/judges/configuration-management.d.ts.map +1 -1
- package/dist/judges/configuration-management.js +4 -0
- package/dist/judges/configuration-management.js.map +1 -1
- package/dist/judges/cost-effectiveness.d.ts.map +1 -1
- package/dist/judges/cost-effectiveness.js +4 -0
- package/dist/judges/cost-effectiveness.js.map +1 -1
- package/dist/judges/cybersecurity.d.ts.map +1 -1
- package/dist/judges/cybersecurity.js +4 -0
- package/dist/judges/cybersecurity.js.map +1 -1
- package/dist/judges/data-security.d.ts.map +1 -1
- package/dist/judges/data-security.js +4 -0
- package/dist/judges/data-security.js.map +1 -1
- package/dist/judges/data-sovereignty.d.ts.map +1 -1
- package/dist/judges/data-sovereignty.js +4 -0
- package/dist/judges/data-sovereignty.js.map +1 -1
- package/dist/judges/database.d.ts.map +1 -1
- package/dist/judges/database.js +4 -0
- package/dist/judges/database.js.map +1 -1
- package/dist/judges/dependency-health.d.ts.map +1 -1
- package/dist/judges/dependency-health.js +4 -0
- package/dist/judges/dependency-health.js.map +1 -1
- package/dist/judges/documentation.d.ts.map +1 -1
- package/dist/judges/documentation.js +4 -0
- package/dist/judges/documentation.js.map +1 -1
- package/dist/judges/error-handling.d.ts.map +1 -1
- package/dist/judges/error-handling.js +4 -0
- package/dist/judges/error-handling.js.map +1 -1
- package/dist/judges/ethics-bias.d.ts.map +1 -1
- package/dist/judges/ethics-bias.js +4 -0
- package/dist/judges/ethics-bias.js.map +1 -1
- package/dist/judges/false-positive-review.d.ts.map +1 -1
- package/dist/judges/false-positive-review.js +2 -0
- package/dist/judges/false-positive-review.js.map +1 -1
- package/dist/judges/framework-safety.d.ts.map +1 -1
- package/dist/judges/framework-safety.js +4 -0
- package/dist/judges/framework-safety.js.map +1 -1
- package/dist/judges/hallucination-detection.d.ts.map +1 -1
- package/dist/judges/hallucination-detection.js +4 -0
- package/dist/judges/hallucination-detection.js.map +1 -1
- package/dist/judges/iac-security.d.ts.map +1 -1
- package/dist/judges/iac-security.js +4 -0
- package/dist/judges/iac-security.js.map +1 -1
- package/dist/judges/index.d.ts +59 -0
- package/dist/judges/index.d.ts.map +1 -1
- package/dist/judges/index.js +65 -189
- package/dist/judges/index.js.map +1 -1
- package/dist/judges/intent-alignment.d.ts.map +1 -1
- package/dist/judges/intent-alignment.js +4 -0
- package/dist/judges/intent-alignment.js.map +1 -1
- package/dist/judges/internationalization.d.ts.map +1 -1
- package/dist/judges/internationalization.js +4 -0
- package/dist/judges/internationalization.js.map +1 -1
- package/dist/judges/logging-privacy.d.ts.map +1 -1
- package/dist/judges/logging-privacy.js +4 -0
- package/dist/judges/logging-privacy.js.map +1 -1
- package/dist/judges/logic-review.d.ts.map +1 -1
- package/dist/judges/logic-review.js +4 -0
- package/dist/judges/logic-review.js.map +1 -1
- package/dist/judges/maintainability.d.ts.map +1 -1
- package/dist/judges/maintainability.js +4 -0
- package/dist/judges/maintainability.js.map +1 -1
- package/dist/judges/model-fingerprint.d.ts.map +1 -1
- package/dist/judges/model-fingerprint.js +4 -0
- package/dist/judges/model-fingerprint.js.map +1 -1
- package/dist/judges/multi-turn-coherence.d.ts.map +1 -1
- package/dist/judges/multi-turn-coherence.js +4 -0
- package/dist/judges/multi-turn-coherence.js.map +1 -1
- package/dist/judges/observability.d.ts.map +1 -1
- package/dist/judges/observability.js +4 -0
- package/dist/judges/observability.js.map +1 -1
- package/dist/judges/over-engineering.d.ts.map +1 -1
- package/dist/judges/over-engineering.js +4 -0
- package/dist/judges/over-engineering.js.map +1 -1
- package/dist/judges/performance.d.ts.map +1 -1
- package/dist/judges/performance.js +4 -0
- package/dist/judges/performance.js.map +1 -1
- package/dist/judges/portability.d.ts.map +1 -1
- package/dist/judges/portability.js +4 -0
- package/dist/judges/portability.js.map +1 -1
- package/dist/judges/rate-limiting.d.ts.map +1 -1
- package/dist/judges/rate-limiting.js +4 -0
- package/dist/judges/rate-limiting.js.map +1 -1
- package/dist/judges/reliability.d.ts.map +1 -1
- package/dist/judges/reliability.js +4 -0
- package/dist/judges/reliability.js.map +1 -1
- package/dist/judges/scalability.d.ts.map +1 -1
- package/dist/judges/scalability.js +4 -0
- package/dist/judges/scalability.js.map +1 -1
- package/dist/judges/security.d.ts.map +1 -1
- package/dist/judges/security.js +4 -0
- package/dist/judges/security.js.map +1 -1
- package/dist/judges/software-practices.d.ts.map +1 -1
- package/dist/judges/software-practices.js +4 -0
- package/dist/judges/software-practices.js.map +1 -1
- package/dist/judges/testing.d.ts.map +1 -1
- package/dist/judges/testing.js +4 -0
- package/dist/judges/testing.js.map +1 -1
- package/dist/judges/ux.d.ts.map +1 -1
- package/dist/judges/ux.js +4 -0
- package/dist/judges/ux.js.map +1 -1
- package/dist/parallel.d.ts +53 -0
- package/dist/parallel.d.ts.map +1 -0
- package/dist/parallel.js +170 -0
- package/dist/parallel.js.map +1 -0
- package/dist/plugins.d.ts +8 -51
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +16 -125
- package/dist/plugins.js.map +1 -1
- package/dist/security-ids.d.ts +24 -0
- package/dist/security-ids.d.ts.map +1 -0
- package/dist/security-ids.js +240 -0
- package/dist/security-ids.js.map +1 -0
- package/dist/tools/prompts.d.ts +4 -0
- package/dist/tools/prompts.d.ts.map +1 -1
- package/dist/tools/prompts.js +6 -4
- package/dist/tools/prompts.js.map +1 -1
- package/dist/tools/register-scaffold.d.ts +3 -0
- package/dist/tools/register-scaffold.d.ts.map +1 -0
- package/dist/tools/register-scaffold.js +399 -0
- package/dist/tools/register-scaffold.js.map +1 -0
- package/dist/tools/register.d.ts +1 -1
- package/dist/tools/register.d.ts.map +1 -1
- package/dist/tools/register.js +3 -1
- package/dist/tools/register.js.map +1 -1
- package/dist/types.d.ts +75 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/server.json +2 -2
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges calibration share` — Git-based calibration profile sharing.
|
|
3
|
+
*
|
|
4
|
+
* Export and import calibration profiles as JSON files that teams can
|
|
5
|
+
* share via git repositories, submodules, or file copies — no server
|
|
6
|
+
* or external data storage required.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges calibration-share export Export local profile
|
|
10
|
+
* judges calibration-share export -o team.json Export to specific file
|
|
11
|
+
* judges calibration-share import team.json Import a shared profile
|
|
12
|
+
* judges calibration-share merge a.json b.json Merge multiple profiles
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
15
|
+
import { resolve, basename } from "path";
|
|
16
|
+
import { loadCalibrationProfile } from "../calibration.js";
|
|
17
|
+
// ─── Export ─────────────────────────────────────────────────────────────────
|
|
18
|
+
function exportProfile(outputPath, source) {
|
|
19
|
+
const profile = loadCalibrationProfile();
|
|
20
|
+
if (!profile.isActive) {
|
|
21
|
+
console.error("Error: No calibration data available. Run `judges feedback` to provide feedback first.");
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const portable = {
|
|
25
|
+
version: "1.0",
|
|
26
|
+
name: profile.name,
|
|
27
|
+
exportedAt: new Date().toISOString(),
|
|
28
|
+
source: source ?? "local",
|
|
29
|
+
feedbackCount: profile.feedbackCount,
|
|
30
|
+
fpRateByRule: Object.fromEntries(profile.fpRateByRule),
|
|
31
|
+
fpRateByPrefix: Object.fromEntries(profile.fpRateByPrefix),
|
|
32
|
+
};
|
|
33
|
+
writeFileSync(outputPath, JSON.stringify(portable, null, 2) + "\n", "utf-8");
|
|
34
|
+
console.log(`✔ Calibration profile exported to ${outputPath}`);
|
|
35
|
+
console.log(` ${profile.fpRateByRule.size} rule-level rates, ${profile.fpRateByPrefix.size} judge-level rates`);
|
|
36
|
+
console.log(` Based on ${profile.feedbackCount} feedback entries`);
|
|
37
|
+
console.log("");
|
|
38
|
+
console.log("Share this file via git (commit it to your repo) or copy it to teammates.");
|
|
39
|
+
console.log("Import with: judges calibration-share import " + basename(outputPath));
|
|
40
|
+
}
|
|
41
|
+
// ─── Import ─────────────────────────────────────────────────────────────────
|
|
42
|
+
function loadPortable(filePath) {
|
|
43
|
+
if (!existsSync(filePath)) {
|
|
44
|
+
console.error(`Error: File not found: ${filePath}`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const raw = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
49
|
+
if (!raw.version || !raw.fpRateByRule) {
|
|
50
|
+
console.error("Error: Invalid calibration profile format");
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
return raw;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
console.error(`Error: Failed to parse ${filePath}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function portableToProfile(p) {
|
|
61
|
+
return {
|
|
62
|
+
name: p.name,
|
|
63
|
+
fpRateByRule: new Map(Object.entries(p.fpRateByRule)),
|
|
64
|
+
fpRateByPrefix: new Map(Object.entries(p.fpRateByPrefix)),
|
|
65
|
+
isActive: Object.keys(p.fpRateByRule).length > 0 || Object.keys(p.fpRateByPrefix).length > 0,
|
|
66
|
+
feedbackCount: p.feedbackCount,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function importProfile(filePath) {
|
|
70
|
+
const portable = loadPortable(filePath);
|
|
71
|
+
const profile = portableToProfile(portable);
|
|
72
|
+
// Write as the local calibration overlay file
|
|
73
|
+
const outputPath = resolve(".judges-calibration.json");
|
|
74
|
+
writeFileSync(outputPath, JSON.stringify(portable, null, 2) + "\n", "utf-8");
|
|
75
|
+
console.log(`✔ Imported calibration profile from ${basename(filePath)}`);
|
|
76
|
+
console.log(` Source: ${portable.source ?? "unknown"}`);
|
|
77
|
+
console.log(` Rules: ${profile.fpRateByRule.size}, Judges: ${profile.fpRateByPrefix.size}`);
|
|
78
|
+
console.log(` Based on ${portable.feedbackCount} feedback entries`);
|
|
79
|
+
console.log(` Saved to ${outputPath}`);
|
|
80
|
+
}
|
|
81
|
+
// ─── Merge ──────────────────────────────────────────────────────────────────
|
|
82
|
+
function mergeProfiles(files, outputPath) {
|
|
83
|
+
if (files.length < 2) {
|
|
84
|
+
console.error("Error: merge requires at least 2 profile files");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
const profiles = files.map(loadPortable);
|
|
88
|
+
const mergedRules = new Map();
|
|
89
|
+
const mergedPrefixes = new Map();
|
|
90
|
+
let totalFeedback = 0;
|
|
91
|
+
for (const p of profiles) {
|
|
92
|
+
totalFeedback += p.feedbackCount;
|
|
93
|
+
for (const [rule, rate] of Object.entries(p.fpRateByRule)) {
|
|
94
|
+
const existing = mergedRules.get(rule) ?? { sum: 0, count: 0 };
|
|
95
|
+
// Weight by feedback count for weighted average
|
|
96
|
+
existing.sum += rate * p.feedbackCount;
|
|
97
|
+
existing.count += p.feedbackCount;
|
|
98
|
+
mergedRules.set(rule, existing);
|
|
99
|
+
}
|
|
100
|
+
for (const [prefix, rate] of Object.entries(p.fpRateByPrefix)) {
|
|
101
|
+
const existing = mergedPrefixes.get(prefix) ?? { sum: 0, count: 0 };
|
|
102
|
+
existing.sum += rate * p.feedbackCount;
|
|
103
|
+
existing.count += p.feedbackCount;
|
|
104
|
+
mergedPrefixes.set(prefix, existing);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const merged = {
|
|
108
|
+
version: "1.0",
|
|
109
|
+
name: "merged-team-calibration",
|
|
110
|
+
exportedAt: new Date().toISOString(),
|
|
111
|
+
source: `merged from ${profiles.length} profiles`,
|
|
112
|
+
feedbackCount: totalFeedback,
|
|
113
|
+
fpRateByRule: Object.fromEntries([...mergedRules.entries()].map(([k, v]) => [k, v.count > 0 ? v.sum / v.count : 0])),
|
|
114
|
+
fpRateByPrefix: Object.fromEntries([...mergedPrefixes.entries()].map(([k, v]) => [k, v.count > 0 ? v.sum / v.count : 0])),
|
|
115
|
+
};
|
|
116
|
+
writeFileSync(outputPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
|
|
117
|
+
console.log(`✔ Merged ${profiles.length} calibration profiles`);
|
|
118
|
+
console.log(` Total feedback entries: ${totalFeedback}`);
|
|
119
|
+
console.log(` Rules: ${mergedRules.size}, Judges: ${mergedPrefixes.size}`);
|
|
120
|
+
console.log(` Output: ${outputPath}`);
|
|
121
|
+
}
|
|
122
|
+
// ─── CLI Entry ──────────────────────────────────────────────────────────────
|
|
123
|
+
export function runCalibrationShare(argv) {
|
|
124
|
+
const subcommand = argv.find((a) => !a.startsWith("-") && a !== "calibration-share");
|
|
125
|
+
let outputPath = "judges-calibration-profile.json";
|
|
126
|
+
// Parse flags
|
|
127
|
+
for (let i = 0; i < argv.length; i++) {
|
|
128
|
+
if ((argv[i] === "-o" || argv[i] === "--output") && argv[i + 1]) {
|
|
129
|
+
outputPath = argv[++i];
|
|
130
|
+
}
|
|
131
|
+
if (argv[i] === "--help" || argv[i] === "-h") {
|
|
132
|
+
printHelp();
|
|
133
|
+
process.exit(0);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (subcommand === "export") {
|
|
137
|
+
const source = argv.find((a, i) => argv[i - 1] === "--source");
|
|
138
|
+
exportProfile(resolve(outputPath), source);
|
|
139
|
+
}
|
|
140
|
+
else if (subcommand === "import") {
|
|
141
|
+
const file = argv.find((a) => !a.startsWith("-") && a !== "calibration-share" && a !== "import");
|
|
142
|
+
if (!file) {
|
|
143
|
+
console.error("Error: import requires a file path. Usage: judges calibration-share import <file>");
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
importProfile(resolve(file));
|
|
147
|
+
}
|
|
148
|
+
else if (subcommand === "merge") {
|
|
149
|
+
const files = argv.filter((a) => !a.startsWith("-") && a !== "calibration-share" && a !== "merge");
|
|
150
|
+
mergeProfiles(files.map((f) => resolve(f)), resolve(outputPath));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
printHelp();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function printHelp() {
|
|
157
|
+
console.log(`
|
|
158
|
+
judges calibration-share — Git-based calibration profile sharing
|
|
159
|
+
|
|
160
|
+
Usage:
|
|
161
|
+
judges calibration-share export Export local calibration profile
|
|
162
|
+
judges calibration-share export -o team.json Export to specific file
|
|
163
|
+
judges calibration-share export --source "my-team" Tag with source name
|
|
164
|
+
judges calibration-share import team-profile.json Import a shared profile
|
|
165
|
+
judges calibration-share merge a.json b.json Merge multiple profiles
|
|
166
|
+
judges calibration-share merge a.json b.json -o m.json
|
|
167
|
+
|
|
168
|
+
Workflow for teams:
|
|
169
|
+
1. Each developer runs: judges calibration-share export -o my-profile.json
|
|
170
|
+
2. Commit profiles to a shared git repo or directory
|
|
171
|
+
3. Merge all: judges calibration-share merge profiles/*.json -o team-calibration.json
|
|
172
|
+
4. Each developer imports: judges calibration-share import team-calibration.json
|
|
173
|
+
5. The imported profile adjusts confidence scores during evaluation
|
|
174
|
+
|
|
175
|
+
All data stays local — profiles are plain JSON files shared via git.
|
|
176
|
+
|
|
177
|
+
Options:
|
|
178
|
+
-o, --output <file> Output file path (default: judges-calibration-profile.json)
|
|
179
|
+
--source <name> Tag the exported profile with a source name
|
|
180
|
+
-h, --help Show this help
|
|
181
|
+
`);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=calibration-share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calibration-share.js","sourceRoot":"","sources":["../../src/commands/calibration-share.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges compliance-report` — Audit-ready compliance evidence generation.
|
|
3
|
+
*
|
|
4
|
+
* Maps findings to regulatory frameworks (SOC 2, OWASP Top 10, OWASP LLM Top 10,
|
|
5
|
+
* CWE, PCI-DSS) and generates structured evidence packets suitable for auditors.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges compliance-report myFile.ts # text report
|
|
9
|
+
* judges compliance-report myFile.ts --json # JSON evidence packet
|
|
10
|
+
* judges compliance-report myFile.ts --framework soc2 # filter by framework
|
|
11
|
+
*/
|
|
12
|
+
import type { Finding } from "../types.js";
|
|
13
|
+
export interface ComplianceMapping {
|
|
14
|
+
framework: string;
|
|
15
|
+
controlId: string;
|
|
16
|
+
controlTitle: string;
|
|
17
|
+
status: "pass" | "fail" | "not-assessed";
|
|
18
|
+
findings: Finding[];
|
|
19
|
+
evidence: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ComplianceReport {
|
|
22
|
+
target: string;
|
|
23
|
+
generatedAt: string;
|
|
24
|
+
frameworks: Record<string, ComplianceMapping[]>;
|
|
25
|
+
summary: {
|
|
26
|
+
total: number;
|
|
27
|
+
pass: number;
|
|
28
|
+
fail: number;
|
|
29
|
+
notAssessed: number;
|
|
30
|
+
passRate: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export declare function buildComplianceReport(target: string, findings: Finding[], filterFramework?: string): ComplianceReport;
|
|
34
|
+
export declare function formatComplianceReportText(report: ComplianceReport): string;
|
|
35
|
+
//# sourceMappingURL=compliance-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-report.d.ts","sourceRoot":"","sources":["../../src/commands/compliance-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AA4GD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA+BrH;AAID,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA2B3E"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges compliance-report` — Audit-ready compliance evidence generation.
|
|
3
|
+
*
|
|
4
|
+
* Maps findings to regulatory frameworks (SOC 2, OWASP Top 10, OWASP LLM Top 10,
|
|
5
|
+
* CWE, PCI-DSS) and generates structured evidence packets suitable for auditors.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* judges compliance-report myFile.ts # text report
|
|
9
|
+
* judges compliance-report myFile.ts --json # JSON evidence packet
|
|
10
|
+
* judges compliance-report myFile.ts --framework soc2 # filter by framework
|
|
11
|
+
*/
|
|
12
|
+
// ─── Framework Control Definitions ──────────────────────────────────────────
|
|
13
|
+
const SOC2_CONTROLS = [
|
|
14
|
+
{ id: "CC6.1", title: "Logical and Physical Access Controls", rulePatterns: [/^SEC-|^AUTH-|^CYBER-|^COMP-/] },
|
|
15
|
+
{ id: "CC6.6", title: "System Boundaries and Threat Mitigation", rulePatterns: [/^SEC-|^RATE-|^CYBER-/] },
|
|
16
|
+
{ id: "CC6.7", title: "Data Classification and Restricted Transmission", rulePatterns: [/^DSEC-|^COMP-|^SEC-/] },
|
|
17
|
+
{ id: "CC7.1", title: "Detection and Monitoring", rulePatterns: [/^OBS-|^LOG-|^COMP-/] },
|
|
18
|
+
{ id: "CC7.2", title: "Anomaly Detection and Incident Response", rulePatterns: [/^OBS-|^CYBER-|^REL-/] },
|
|
19
|
+
{ id: "CC8.1", title: "Change Management", rulePatterns: [/^CICD-|^SW-|^DEP-/] },
|
|
20
|
+
{ id: "CC9.1", title: "Risk Mitigation", rulePatterns: [/^SEC-|^PERF-|^REL-|^SCALE-/] },
|
|
21
|
+
];
|
|
22
|
+
const OWASP_TOP10 = [
|
|
23
|
+
{
|
|
24
|
+
id: "A01",
|
|
25
|
+
title: "Broken Access Control",
|
|
26
|
+
cweRanges: ["CWE-200", "CWE-284", "CWE-285", "CWE-639", "CWE-862", "CWE-863"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "A02",
|
|
30
|
+
title: "Cryptographic Failures",
|
|
31
|
+
cweRanges: ["CWE-259", "CWE-261", "CWE-327", "CWE-328", "CWE-330", "CWE-916"],
|
|
32
|
+
},
|
|
33
|
+
{ id: "A03", title: "Injection", cweRanges: ["CWE-20", "CWE-77", "CWE-78", "CWE-79", "CWE-89", "CWE-94"] },
|
|
34
|
+
{ id: "A04", title: "Insecure Design", cweRanges: ["CWE-209", "CWE-256", "CWE-501", "CWE-522"] },
|
|
35
|
+
{ id: "A05", title: "Security Misconfiguration", cweRanges: ["CWE-16", "CWE-611", "CWE-614", "CWE-1004"] },
|
|
36
|
+
{ id: "A06", title: "Vulnerable and Outdated Components", cweRanges: ["CWE-1104"] },
|
|
37
|
+
{ id: "A07", title: "Identification and Authentication Failures", cweRanges: ["CWE-255", "CWE-287", "CWE-384"] },
|
|
38
|
+
{ id: "A08", title: "Software and Data Integrity Failures", cweRanges: ["CWE-345", "CWE-502", "CWE-829"] },
|
|
39
|
+
{
|
|
40
|
+
id: "A09",
|
|
41
|
+
title: "Security Logging and Monitoring Failures",
|
|
42
|
+
cweRanges: ["CWE-117", "CWE-223", "CWE-532", "CWE-778"],
|
|
43
|
+
},
|
|
44
|
+
{ id: "A10", title: "Server-Side Request Forgery", cweRanges: ["CWE-918"] },
|
|
45
|
+
];
|
|
46
|
+
const PCI_DSS_CONTROLS = [
|
|
47
|
+
{ id: "Req-3.4", title: "Render PAN unreadable", rulePatterns: [/^DSEC-|^SEC-.*(?:encrypt|hash)/i] },
|
|
48
|
+
{ id: "Req-6.5", title: "Address common coding vulnerabilities", rulePatterns: [/^SEC-|^CYBER-/] },
|
|
49
|
+
{ id: "Req-8.2", title: "Strong authentication methods", rulePatterns: [/^AUTH-|^SEC-/] },
|
|
50
|
+
{ id: "Req-10.2", title: "Audit trail captures events", rulePatterns: [/^OBS-|^LOG-|^COMP-/] },
|
|
51
|
+
];
|
|
52
|
+
// ─── Mapping Logic ──────────────────────────────────────────────────────────
|
|
53
|
+
function mapFindingsToSOC2(findings) {
|
|
54
|
+
return SOC2_CONTROLS.map((ctrl) => {
|
|
55
|
+
const matched = findings.filter((f) => ctrl.rulePatterns.some((p) => p.test(f.ruleId)));
|
|
56
|
+
const status = matched.length > 0 ? "fail" : "not-assessed";
|
|
57
|
+
return {
|
|
58
|
+
framework: "SOC 2",
|
|
59
|
+
controlId: ctrl.id,
|
|
60
|
+
controlTitle: ctrl.title,
|
|
61
|
+
status,
|
|
62
|
+
findings: matched,
|
|
63
|
+
evidence: matched.length > 0
|
|
64
|
+
? `${matched.length} finding(s) impact this control: ${matched.map((f) => f.ruleId).join(", ")}`
|
|
65
|
+
: "No findings detected for this control. Manual review recommended.",
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function mapFindingsToOWASP(findings) {
|
|
70
|
+
return OWASP_TOP10.map((cat) => {
|
|
71
|
+
const matched = findings.filter((f) => {
|
|
72
|
+
if (f.cweIds)
|
|
73
|
+
return f.cweIds.some((cwe) => cat.cweRanges.includes(cwe));
|
|
74
|
+
if (f.owaspIds)
|
|
75
|
+
return f.owaspIds.some((id) => id.startsWith(cat.id));
|
|
76
|
+
return false;
|
|
77
|
+
});
|
|
78
|
+
const status = matched.length > 0 ? "fail" : "not-assessed";
|
|
79
|
+
return {
|
|
80
|
+
framework: "OWASP Top 10",
|
|
81
|
+
controlId: cat.id,
|
|
82
|
+
controlTitle: cat.title,
|
|
83
|
+
status,
|
|
84
|
+
findings: matched,
|
|
85
|
+
evidence: matched.length > 0
|
|
86
|
+
? `${matched.length} finding(s): ${matched.map((f) => `${f.ruleId} (${f.cweIds?.join(", ") || "no CWE"})`).join("; ")}`
|
|
87
|
+
: "No findings mapped to this category.",
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function mapFindingsToPCI(findings) {
|
|
92
|
+
return PCI_DSS_CONTROLS.map((ctrl) => {
|
|
93
|
+
const matched = findings.filter((f) => ctrl.rulePatterns.some((p) => p.test(f.ruleId)));
|
|
94
|
+
const status = matched.length > 0 ? "fail" : "not-assessed";
|
|
95
|
+
return {
|
|
96
|
+
framework: "PCI-DSS",
|
|
97
|
+
controlId: ctrl.id,
|
|
98
|
+
controlTitle: ctrl.title,
|
|
99
|
+
status,
|
|
100
|
+
findings: matched,
|
|
101
|
+
evidence: matched.length > 0
|
|
102
|
+
? `${matched.length} finding(s) impact this requirement: ${matched.map((f) => f.ruleId).join(", ")}`
|
|
103
|
+
: "No findings detected for this requirement.",
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// ─── Report Builder ─────────────────────────────────────────────────────────
|
|
108
|
+
export function buildComplianceReport(target, findings, filterFramework) {
|
|
109
|
+
const frameworks = {};
|
|
110
|
+
if (!filterFramework || filterFramework === "soc2") {
|
|
111
|
+
frameworks["SOC 2"] = mapFindingsToSOC2(findings);
|
|
112
|
+
}
|
|
113
|
+
if (!filterFramework || filterFramework === "owasp") {
|
|
114
|
+
frameworks["OWASP Top 10"] = mapFindingsToOWASP(findings);
|
|
115
|
+
}
|
|
116
|
+
if (!filterFramework || filterFramework === "pci") {
|
|
117
|
+
frameworks["PCI-DSS"] = mapFindingsToPCI(findings);
|
|
118
|
+
}
|
|
119
|
+
const allMappings = Object.values(frameworks).flat();
|
|
120
|
+
const total = allMappings.length;
|
|
121
|
+
const pass = allMappings.filter((m) => m.status === "pass").length;
|
|
122
|
+
const fail = allMappings.filter((m) => m.status === "fail").length;
|
|
123
|
+
const notAssessed = allMappings.filter((m) => m.status === "not-assessed").length;
|
|
124
|
+
return {
|
|
125
|
+
target,
|
|
126
|
+
generatedAt: new Date().toISOString(),
|
|
127
|
+
frameworks,
|
|
128
|
+
summary: {
|
|
129
|
+
total,
|
|
130
|
+
pass,
|
|
131
|
+
fail,
|
|
132
|
+
notAssessed,
|
|
133
|
+
passRate: total > 0 ? Math.round((pass / total) * 100) : 0,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// ─── CLI Formatters ─────────────────────────────────────────────────────────
|
|
138
|
+
export function formatComplianceReportText(report) {
|
|
139
|
+
const lines = [];
|
|
140
|
+
lines.push("╔══════════════════════════════════════════════════════════════╗");
|
|
141
|
+
lines.push("║ Judges Panel — Compliance Evidence Report ║");
|
|
142
|
+
lines.push("╚══════════════════════════════════════════════════════════════╝");
|
|
143
|
+
lines.push("");
|
|
144
|
+
lines.push(` Target : ${report.target}`);
|
|
145
|
+
lines.push(` Generated : ${report.generatedAt.slice(0, 10)}`);
|
|
146
|
+
lines.push(` Controls : ${report.summary.total} (${report.summary.fail} failing, ${report.summary.notAssessed} not assessed)`);
|
|
147
|
+
lines.push("");
|
|
148
|
+
for (const [framework, mappings] of Object.entries(report.frameworks)) {
|
|
149
|
+
lines.push(` ┌── ${framework} ${"─".repeat(50 - framework.length)}`);
|
|
150
|
+
for (const m of mappings) {
|
|
151
|
+
const icon = m.status === "pass" ? "✅" : m.status === "fail" ? "❌" : "⬜";
|
|
152
|
+
lines.push(` │ ${icon} ${m.controlId.padEnd(10)} ${m.controlTitle}`);
|
|
153
|
+
if (m.status === "fail") {
|
|
154
|
+
lines.push(` │ └─ ${m.evidence}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
lines.push(` └${"─".repeat(60)}`);
|
|
158
|
+
lines.push("");
|
|
159
|
+
}
|
|
160
|
+
return lines.join("\n");
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=compliance-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-report.js","sourceRoot":"","sources":["../../src/commands/compliance-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4BH,+EAA+E;AAE/E,MAAM,aAAa,GAAiE;IAClF,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,sCAAsC,EAAE,YAAY,EAAE,CAAC,6BAA6B,CAAC,EAAE;IAC7G,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE;IACzG,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iDAAiD,EAAE,YAAY,EAAE,CAAC,qBAAqB,CAAC,EAAE;IAChH,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE;IACxF,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,yCAAyC,EAAE,YAAY,EAAE,CAAC,qBAAqB,CAAC,EAAE;IACxG,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC,mBAAmB,CAAC,EAAE;IAChF,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,4BAA4B,CAAC,EAAE;CACxF,CAAC;AAEF,MAAM,WAAW,GAA8D;IAC7E;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,uBAAuB;QAC9B,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;KAC9E;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;KAC9E;IACD,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;IAC1G,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAChG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;IAC1G,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE;IACnF,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4CAA4C,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAChH,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE;IAC1G;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,0CAA0C;QACjD,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;KACxD;IACD,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE;CAC5E,CAAC;AAEF,MAAM,gBAAgB,GAAiE;IACrF,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,YAAY,EAAE,CAAC,iCAAiC,CAAC,EAAE;IACpG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,uCAAuC,EAAE,YAAY,EAAE,CAAC,eAAe,CAAC,EAAE;IAClG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,+BAA+B,EAAE,YAAY,EAAE,CAAC,cAAc,CAAC,EAAE;IACzF,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,6BAA6B,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE;CAC/F,CAAC;AAEF,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,QAAmB;IAC5C,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,MAAM,GAAgC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACzF,OAAO;YACL,SAAS,EAAE,OAAO;YAClB,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,YAAY,EAAE,IAAI,CAAC,KAAK;YACxB,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,QAAQ,EACN,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,oCAAoC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChG,CAAC,CAAC,mEAAmE;SAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAmB;IAC7C,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAgC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACzF,OAAO;YACL,SAAS,EAAE,cAAc;YACzB,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,YAAY,EAAE,GAAG,CAAC,KAAK;YACvB,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,QAAQ,EACN,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACvH,CAAC,CAAC,sCAAsC;SAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAmB;IAC3C,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,MAAM,GAAgC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACzF,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,YAAY,EAAE,IAAI,CAAC,KAAK;YACxB,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,QAAQ,EACN,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,wCAAwC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACpG,CAAC,CAAC,4CAA4C;SACnD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,QAAmB,EAAE,eAAwB;IACjG,MAAM,UAAU,GAAwC,EAAE,CAAC;IAE3D,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,MAAM,EAAE,CAAC;QACnD,UAAU,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QACpD,UAAU,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,eAAe,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;QAClD,UAAU,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;IAElF,OAAO;QACL,MAAM;QACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;QACV,OAAO,EAAE;YACP,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3D;KACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,0BAA0B,CAAC,MAAwB;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CACR,iBAAiB,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,aAAa,MAAM,CAAC,OAAO,CAAC,WAAW,gBAAgB,CACrH,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges config-migrate` — Configuration migration assistant.
|
|
3
|
+
*
|
|
4
|
+
* Helps users upgrade their .judgesrc configs between Judges versions.
|
|
5
|
+
* Detects deprecated fields, renamed keys, and structural changes,
|
|
6
|
+
* then applies automatic or guided migrations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges config-migrate # Analyze current .judgesrc
|
|
10
|
+
* judges config-migrate --apply # Apply migrations in place
|
|
11
|
+
* judges config-migrate --dry-run # Show changes without writing
|
|
12
|
+
* judges config-migrate --config path # Specify config path
|
|
13
|
+
*/
|
|
14
|
+
export interface MigrationRule {
|
|
15
|
+
/** Unique migration ID */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Version that introduced the change */
|
|
18
|
+
since: string;
|
|
19
|
+
/** Description of what changed */
|
|
20
|
+
description: string;
|
|
21
|
+
/** Severity: "error" = will break, "warning" = deprecated, "info" = suggestion */
|
|
22
|
+
level: "error" | "warning" | "info";
|
|
23
|
+
/** Detect function — returns true if this migration applies */
|
|
24
|
+
detect: (config: Record<string, unknown>) => boolean;
|
|
25
|
+
/** Apply function — returns mutated config */
|
|
26
|
+
apply: (config: Record<string, unknown>) => Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export interface MigrationResult {
|
|
29
|
+
/** Path to config file */
|
|
30
|
+
configPath: string;
|
|
31
|
+
/** Migrations that matched */
|
|
32
|
+
applied: Array<{
|
|
33
|
+
id: string;
|
|
34
|
+
description: string;
|
|
35
|
+
level: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** Whether any changes were made */
|
|
38
|
+
hasChanges: boolean;
|
|
39
|
+
/** Migrated config (if changes exist) */
|
|
40
|
+
migratedConfig?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
export declare function analyzeConfig(config: Record<string, unknown>): MigrationResult;
|
|
43
|
+
export declare function runConfigMigrate(argv: string[]): void;
|
|
44
|
+
//# sourceMappingURL=config-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-migrate.d.ts","sourceRoot":"","sources":["../../src/commands/config-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,+DAA+D;IAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;IACrD,8CAA8C;IAC9C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AA+ID,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAc9E;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgFrD"}
|