@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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges governance` — Multi-repo governance dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Aggregates snapshot data from multiple repos into a unified governance view.
|
|
5
|
+
* Teams self-host their own snapshot files; this command reads them from a
|
|
6
|
+
* directory of exported snapshots (each repo pushes to a shared location).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges governance --dir ./governance-data # read snapshots from dir
|
|
10
|
+
* judges governance --dir ./governance-data --html # HTML dashboard output
|
|
11
|
+
* judges governance --dir ./governance-data --json # JSON output
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
14
|
+
import { resolve, basename } from "path";
|
|
15
|
+
import { computeTrend, detectRegressions } from "./snapshot.js";
|
|
16
|
+
// ─── Grade Calculation ──────────────────────────────────────────────────────
|
|
17
|
+
function gradeFromTrend(trend) {
|
|
18
|
+
const t = trend.stats;
|
|
19
|
+
if (t.currentTotal === 0 && t.trend === "improving")
|
|
20
|
+
return "A";
|
|
21
|
+
if (t.currentTotal <= 3 && t.trend !== "regressing")
|
|
22
|
+
return "A";
|
|
23
|
+
if (t.currentTotal <= 10 && t.trend !== "regressing")
|
|
24
|
+
return "B";
|
|
25
|
+
if (t.currentTotal <= 20)
|
|
26
|
+
return "C";
|
|
27
|
+
if (t.currentTotal <= 50)
|
|
28
|
+
return "D";
|
|
29
|
+
return "F";
|
|
30
|
+
}
|
|
31
|
+
// ─── Snapshot Directory Loading ─────────────────────────────────────────────
|
|
32
|
+
function loadSnapshotFiles(dir) {
|
|
33
|
+
const repos = new Map();
|
|
34
|
+
if (!existsSync(dir))
|
|
35
|
+
return repos;
|
|
36
|
+
const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
try {
|
|
39
|
+
const raw = readFileSync(resolve(dir, file), "utf-8");
|
|
40
|
+
const store = JSON.parse(raw);
|
|
41
|
+
if (store.version === 1 && Array.isArray(store.snapshots)) {
|
|
42
|
+
// Use filename (minus extension) as repo name
|
|
43
|
+
const repoName = basename(file, ".json").replace(/-snapshots$/, "");
|
|
44
|
+
repos.set(repoName, store);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Skip invalid files
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return repos;
|
|
52
|
+
}
|
|
53
|
+
// ─── Report Generation ──────────────────────────────────────────────────────
|
|
54
|
+
export function buildGovernanceReport(dir) {
|
|
55
|
+
const stores = loadSnapshotFiles(dir);
|
|
56
|
+
const repos = [];
|
|
57
|
+
let totalFindings = 0;
|
|
58
|
+
const criticalRepos = [];
|
|
59
|
+
for (const [repoName, store] of stores) {
|
|
60
|
+
const trend = computeTrend(store);
|
|
61
|
+
const regressions = detectRegressions(store);
|
|
62
|
+
const grade = gradeFromTrend(trend);
|
|
63
|
+
repos.push({
|
|
64
|
+
repo: repoName,
|
|
65
|
+
trend,
|
|
66
|
+
regressions,
|
|
67
|
+
lastRun: trend.stats.lastRun,
|
|
68
|
+
grade,
|
|
69
|
+
});
|
|
70
|
+
totalFindings += trend.stats.currentTotal;
|
|
71
|
+
if (grade === "D" || grade === "F" || regressions.some((r) => r.severity === "error")) {
|
|
72
|
+
criticalRepos.push(repoName);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Sort by grade (worst first) then by findings count
|
|
76
|
+
const gradeOrder = { F: 0, D: 1, C: 2, B: 3, A: 4 };
|
|
77
|
+
repos.sort((a, b) => (gradeOrder[a.grade] ?? 5) - (gradeOrder[b.grade] ?? 5) ||
|
|
78
|
+
b.trend.stats.currentTotal - a.trend.stats.currentTotal);
|
|
79
|
+
const overallHealth = criticalRepos.length === 0 ? "healthy" : criticalRepos.length <= repos.length * 0.3 ? "at-risk" : "critical";
|
|
80
|
+
return {
|
|
81
|
+
repos,
|
|
82
|
+
overallHealth,
|
|
83
|
+
totalFindings,
|
|
84
|
+
repoCount: repos.length,
|
|
85
|
+
criticalRepos,
|
|
86
|
+
generatedAt: new Date().toISOString(),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ─── CLI Formatters ─────────────────────────────────────────────────────────
|
|
90
|
+
function formatGovernanceText(report) {
|
|
91
|
+
const lines = [];
|
|
92
|
+
const healthIcon = report.overallHealth === "healthy" ? "✅" : report.overallHealth === "at-risk" ? "⚠️ " : "🔴";
|
|
93
|
+
lines.push("╔══════════════════════════════════════════════════════════════╗");
|
|
94
|
+
lines.push("║ Judges Panel — Governance Dashboard ║");
|
|
95
|
+
lines.push("╚══════════════════════════════════════════════════════════════╝");
|
|
96
|
+
lines.push("");
|
|
97
|
+
lines.push(` Health : ${healthIcon} ${report.overallHealth.toUpperCase()}`);
|
|
98
|
+
lines.push(` Repos : ${report.repoCount}`);
|
|
99
|
+
lines.push(` Findings : ${report.totalFindings} total across all repos`);
|
|
100
|
+
if (report.criticalRepos.length > 0) {
|
|
101
|
+
lines.push(` Critical : ${report.criticalRepos.join(", ")}`);
|
|
102
|
+
}
|
|
103
|
+
lines.push(` Generated : ${report.generatedAt.slice(0, 10)}`);
|
|
104
|
+
lines.push("");
|
|
105
|
+
lines.push(" Repository Summary:");
|
|
106
|
+
lines.push(" " + "─".repeat(58));
|
|
107
|
+
lines.push(` ${"Repository".padEnd(30)} Grade Findings Trend`);
|
|
108
|
+
lines.push(" " + "─".repeat(58));
|
|
109
|
+
for (const r of report.repos) {
|
|
110
|
+
const trendIcon = r.trend.stats.trend === "improving" ? "📉" : r.trend.stats.trend === "regressing" ? "📈" : "➡️ ";
|
|
111
|
+
const findings = String(r.trend.stats.currentTotal).padStart(6);
|
|
112
|
+
lines.push(` ${r.repo.padEnd(30)} ${r.grade.padEnd(6)} ${findings} ${trendIcon} ${r.trend.stats.trend}`);
|
|
113
|
+
if (r.regressions.length > 0) {
|
|
114
|
+
for (const alert of r.regressions.slice(0, 2)) {
|
|
115
|
+
const icon = alert.severity === "error" ? "🔴" : "🟡";
|
|
116
|
+
lines.push(` ${icon} ${alert.message}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
lines.push("");
|
|
121
|
+
return lines.join("\n");
|
|
122
|
+
}
|
|
123
|
+
function formatGovernanceHtml(report) {
|
|
124
|
+
const healthColor = report.overallHealth === "healthy" ? "#16a34a" : report.overallHealth === "at-risk" ? "#ca8a04" : "#dc2626";
|
|
125
|
+
const gradeColor = { A: "#16a34a", B: "#65a30d", C: "#ca8a04", D: "#ea580c", F: "#dc2626" };
|
|
126
|
+
const rows = report.repos
|
|
127
|
+
.map((r) => `<tr>
|
|
128
|
+
<td>${esc(r.repo)}</td>
|
|
129
|
+
<td style="color:${gradeColor[r.grade] ?? "#666"};font-weight:700">${r.grade}</td>
|
|
130
|
+
<td>${r.trend.stats.currentTotal}</td>
|
|
131
|
+
<td>${r.trend.stats.trend}</td>
|
|
132
|
+
<td>${r.regressions.length}</td>
|
|
133
|
+
<td>${r.lastRun.slice(0, 10)}</td>
|
|
134
|
+
</tr>`)
|
|
135
|
+
.join("\n");
|
|
136
|
+
return `<!DOCTYPE html>
|
|
137
|
+
<html lang="en"><head><meta charset="utf-8"><title>Judges Governance Dashboard</title>
|
|
138
|
+
<style>
|
|
139
|
+
:root{--bg:#fff;--fg:#1a1a1a;--card:#f9fafb;--border:#e5e7eb;--muted:#6b7280}
|
|
140
|
+
@media(prefers-color-scheme:dark){:root{--bg:#0f172a;--fg:#e2e8f0;--card:#1e293b;--border:#334155;--muted:#94a3b8}}
|
|
141
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
142
|
+
body{font-family:system-ui,sans-serif;background:var(--bg);color:var(--fg);padding:2rem}
|
|
143
|
+
h1{margin-bottom:1rem}
|
|
144
|
+
.badge{display:inline-block;padding:.25rem .75rem;border-radius:4px;font-weight:700}
|
|
145
|
+
table{width:100%;border-collapse:collapse;margin-top:1rem}
|
|
146
|
+
th,td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid var(--border)}
|
|
147
|
+
th{font-size:.75rem;text-transform:uppercase;color:var(--muted)}
|
|
148
|
+
</style></head><body>
|
|
149
|
+
<h1>Judges Panel — Governance Dashboard</h1>
|
|
150
|
+
<p><span class="badge" style="background:${healthColor};color:#fff">${esc(report.overallHealth.toUpperCase())}</span>
|
|
151
|
+
${report.repoCount} repos, ${report.totalFindings} total findings</p>
|
|
152
|
+
<table><thead><tr><th>Repository</th><th>Grade</th><th>Findings</th><th>Trend</th><th>Alerts</th><th>Last Run</th></tr></thead>
|
|
153
|
+
<tbody>${rows}</tbody></table>
|
|
154
|
+
<p style="margin-top:2rem;font-size:.75rem;color:var(--muted)">Generated ${report.generatedAt.slice(0, 10)} by Judges Panel</p>
|
|
155
|
+
</body></html>`;
|
|
156
|
+
}
|
|
157
|
+
function esc(s) {
|
|
158
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
159
|
+
}
|
|
160
|
+
// ─── CLI Command ────────────────────────────────────────────────────────────
|
|
161
|
+
export function runGovernance(argv) {
|
|
162
|
+
let dir = ".";
|
|
163
|
+
let format = "text";
|
|
164
|
+
for (let i = 3; i < argv.length; i++) {
|
|
165
|
+
switch (argv[i]) {
|
|
166
|
+
case "--dir":
|
|
167
|
+
case "-d":
|
|
168
|
+
dir = argv[++i] || ".";
|
|
169
|
+
break;
|
|
170
|
+
case "--html":
|
|
171
|
+
format = "html";
|
|
172
|
+
break;
|
|
173
|
+
case "--json":
|
|
174
|
+
format = "json";
|
|
175
|
+
break;
|
|
176
|
+
case "--format":
|
|
177
|
+
format = argv[++i] || "text";
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (!existsSync(dir)) {
|
|
182
|
+
console.error(`Error: Directory not found: ${dir}`);
|
|
183
|
+
console.error("Usage: judges governance --dir ./governance-data");
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
const report = buildGovernanceReport(dir);
|
|
187
|
+
if (report.repoCount === 0) {
|
|
188
|
+
console.log("\n No snapshot files found. Export repo snapshots as JSON files to the governance directory.");
|
|
189
|
+
console.log(` Expected: ${resolve(dir)}/*.json\n`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
switch (format) {
|
|
193
|
+
case "json":
|
|
194
|
+
console.log(JSON.stringify(report, null, 2));
|
|
195
|
+
break;
|
|
196
|
+
case "html":
|
|
197
|
+
console.log(formatGovernanceHtml(report));
|
|
198
|
+
break;
|
|
199
|
+
default:
|
|
200
|
+
console.log(formatGovernanceText(report));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance.js","sourceRoot":"","sources":["../../src/commands/governance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges help [topic]` — contextual help and getting-started guides.
|
|
3
|
+
*
|
|
4
|
+
* Provides quick, actionable guidance for each major capability area.
|
|
5
|
+
* Run without arguments to see all available topics.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runHelp(argv: string[]): void;
|
|
8
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgSH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAmB5C"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges help [topic]` — contextual help and getting-started guides.
|
|
3
|
+
*
|
|
4
|
+
* Provides quick, actionable guidance for each major capability area.
|
|
5
|
+
* Run without arguments to see all available topics.
|
|
6
|
+
*/
|
|
7
|
+
const TOPICS = {
|
|
8
|
+
"getting-started": {
|
|
9
|
+
title: "Getting Started",
|
|
10
|
+
summary: "First steps with Judges Panel",
|
|
11
|
+
body: `
|
|
12
|
+
Quick Start
|
|
13
|
+
───────────
|
|
14
|
+
1. Evaluate a single file:
|
|
15
|
+
judges eval server.ts
|
|
16
|
+
|
|
17
|
+
2. Scan an entire directory:
|
|
18
|
+
judges eval src/
|
|
19
|
+
|
|
20
|
+
3. Generate a config file:
|
|
21
|
+
judges init
|
|
22
|
+
|
|
23
|
+
4. Use a preset for CI:
|
|
24
|
+
judges eval src/ --preset security
|
|
25
|
+
|
|
26
|
+
5. Auto-fix findings:
|
|
27
|
+
judges eval src/ --fix
|
|
28
|
+
|
|
29
|
+
Common Flags
|
|
30
|
+
────────────
|
|
31
|
+
--format json|sarif|html|markdown Output format
|
|
32
|
+
--fix Apply auto-fix patches
|
|
33
|
+
--baseline .judges-baseline.json Suppress known findings
|
|
34
|
+
--incremental Cache results for unchanged files
|
|
35
|
+
--changed-only Only scan git-changed files
|
|
36
|
+
--quiet Suppress progress output
|
|
37
|
+
--explain Show CWE/OWASP context for findings
|
|
38
|
+
`,
|
|
39
|
+
},
|
|
40
|
+
feedback: {
|
|
41
|
+
title: "Feedback & False Positive Reporting",
|
|
42
|
+
summary: "How to improve accuracy with feedback",
|
|
43
|
+
body: `
|
|
44
|
+
Providing Feedback
|
|
45
|
+
──────────────────
|
|
46
|
+
Feedback trains Judges to reduce false positives over time.
|
|
47
|
+
|
|
48
|
+
CLI:
|
|
49
|
+
judges feedback add --rule SEC-001 --verdict fp --comment "Not exploitable"
|
|
50
|
+
judges feedback add --rule AUTH-003 --verdict tp
|
|
51
|
+
judges feedback list
|
|
52
|
+
judges feedback stats
|
|
53
|
+
|
|
54
|
+
VS Code:
|
|
55
|
+
Click the thumbs-up/down icons on any finding's code action menu.
|
|
56
|
+
Feedback is stored in .judges-feedback.json in your workspace.
|
|
57
|
+
|
|
58
|
+
Verdicts:
|
|
59
|
+
tp True positive (real issue)
|
|
60
|
+
fp False positive (not a real issue)
|
|
61
|
+
wontfix Acknowledged but won't fix
|
|
62
|
+
|
|
63
|
+
Your feedback is stored locally and never sent externally.
|
|
64
|
+
Configure a DataAdapter in .judgesrc to share feedback with your team.
|
|
65
|
+
`,
|
|
66
|
+
},
|
|
67
|
+
calibration: {
|
|
68
|
+
title: "Calibration & Confidence Tuning",
|
|
69
|
+
summary: "How to tune judge accuracy for your codebase",
|
|
70
|
+
body: `
|
|
71
|
+
Auto-Calibration
|
|
72
|
+
────────────────
|
|
73
|
+
judges tune Run auto-calibration on your feedback data
|
|
74
|
+
judges tune --dry-run Preview what would change
|
|
75
|
+
|
|
76
|
+
Calibration Dashboard
|
|
77
|
+
─────────────────────
|
|
78
|
+
judges calibration-dashboard Open interactive HTML dashboard
|
|
79
|
+
judges calibration-dashboard --output report.html
|
|
80
|
+
|
|
81
|
+
How It Works
|
|
82
|
+
────────────
|
|
83
|
+
Judges uses your feedback (tp/fp verdicts) to adjust confidence thresholds
|
|
84
|
+
per rule. Rules with many false positives get their confidence reduced;
|
|
85
|
+
rules with consistent true positives are boosted.
|
|
86
|
+
|
|
87
|
+
Team Sharing
|
|
88
|
+
────────────
|
|
89
|
+
Calibration profiles are stored in .judges-calibration.json.
|
|
90
|
+
Commit this to your repo so team members benefit from shared tuning.
|
|
91
|
+
`,
|
|
92
|
+
},
|
|
93
|
+
ci: {
|
|
94
|
+
title: "CI/CD Integration",
|
|
95
|
+
summary: "Setting up Judges in CI pipelines",
|
|
96
|
+
body: `
|
|
97
|
+
Generate CI Config
|
|
98
|
+
──────────────────
|
|
99
|
+
judges ci-templates Show all available templates
|
|
100
|
+
judges ci-templates --github GitHub Actions workflow
|
|
101
|
+
judges ci-templates --gitlab GitLab CI config
|
|
102
|
+
judges ci-templates --azure Azure Pipelines config
|
|
103
|
+
judges ci-templates --bitbucket Bitbucket Pipelines config
|
|
104
|
+
|
|
105
|
+
Recommended CI Setup
|
|
106
|
+
────────────────────
|
|
107
|
+
1. Create a baseline to suppress existing findings:
|
|
108
|
+
judges baseline create --dir src/
|
|
109
|
+
|
|
110
|
+
2. Run incremental scans in PRs:
|
|
111
|
+
judges eval src/ --changed-only --fail-on-findings --format sarif
|
|
112
|
+
|
|
113
|
+
3. Upload SARIF to GitHub Code Scanning:
|
|
114
|
+
- uses: github/codeql-action/upload-sarif@v3
|
|
115
|
+
with:
|
|
116
|
+
sarif_file: judges-report.sarif.json
|
|
117
|
+
|
|
118
|
+
Environment Variables
|
|
119
|
+
─────────────────────
|
|
120
|
+
JUDGES_CACHE_DIR Custom cache directory (default: .judges-cache)
|
|
121
|
+
JUDGES_NO_COLOR Disable colored output
|
|
122
|
+
JUDGES_CONFIG Path to .judgesrc config file
|
|
123
|
+
`,
|
|
124
|
+
},
|
|
125
|
+
presets: {
|
|
126
|
+
title: "Presets & Configuration",
|
|
127
|
+
summary: "Using and composing evaluation presets",
|
|
128
|
+
body: `
|
|
129
|
+
Available Presets
|
|
130
|
+
────────────────
|
|
131
|
+
judges eval --preset security Security-focused evaluation
|
|
132
|
+
judges eval --preset quality Code quality focus
|
|
133
|
+
judges eval --preset compliance Compliance & governance
|
|
134
|
+
judges eval --preset full All judges enabled
|
|
135
|
+
|
|
136
|
+
List All Presets
|
|
137
|
+
────────────────
|
|
138
|
+
judges config presets
|
|
139
|
+
|
|
140
|
+
Composing Presets
|
|
141
|
+
────────────────
|
|
142
|
+
In .judgesrc, you can compose multiple presets:
|
|
143
|
+
{
|
|
144
|
+
"presets": ["security", "quality"],
|
|
145
|
+
"disabledRules": ["DOC-001"],
|
|
146
|
+
"minSeverity": "medium"
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
Custom Config (.judgesrc)
|
|
150
|
+
────────────────────────
|
|
151
|
+
judges init Generate a starter .judgesrc
|
|
152
|
+
judges config validate Validate your config
|
|
153
|
+
judges doctor Diagnose configuration issues
|
|
154
|
+
`,
|
|
155
|
+
},
|
|
156
|
+
plugins: {
|
|
157
|
+
title: "Plugins & Custom Rules",
|
|
158
|
+
summary: "Extending Judges with custom rules and plugins",
|
|
159
|
+
body: `
|
|
160
|
+
Creating a Plugin
|
|
161
|
+
─────────────────
|
|
162
|
+
judges scaffold-plugin my-rules Generate a plugin template
|
|
163
|
+
|
|
164
|
+
Plugin Structure
|
|
165
|
+
────────────────
|
|
166
|
+
my-rules/
|
|
167
|
+
package.json # name, version, "judges-plugin" keyword
|
|
168
|
+
index.js # exports { rules: [...] }
|
|
169
|
+
|
|
170
|
+
Installing Plugins
|
|
171
|
+
──────────────────
|
|
172
|
+
Add to .judgesrc:
|
|
173
|
+
{
|
|
174
|
+
"plugins": ["@myorg/judges-plugin-custom"]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
Community Patterns
|
|
178
|
+
──────────────────
|
|
179
|
+
judges community-patterns Browse community rule patterns
|
|
180
|
+
|
|
181
|
+
See docs/plugin-guide.md for the full authoring guide.
|
|
182
|
+
`,
|
|
183
|
+
},
|
|
184
|
+
"data-adapter": {
|
|
185
|
+
title: "Data Adapters (Team Storage)",
|
|
186
|
+
summary: "Configure external storage for team-wide sharing",
|
|
187
|
+
body: `
|
|
188
|
+
What Are Data Adapters?
|
|
189
|
+
──────────────────────
|
|
190
|
+
By default, Judges stores feedback, findings, and metrics as local JSON
|
|
191
|
+
files. Data Adapters let your team share this data via your own backend.
|
|
192
|
+
|
|
193
|
+
Judges never hosts or processes your data — you bring your own storage.
|
|
194
|
+
|
|
195
|
+
Configuration (.judgesrc)
|
|
196
|
+
────────────────────────
|
|
197
|
+
Local filesystem (default):
|
|
198
|
+
{
|
|
199
|
+
"dataAdapter": { "type": "filesystem" }
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
HTTP backend (your own API):
|
|
203
|
+
{
|
|
204
|
+
"dataAdapter": {
|
|
205
|
+
"type": "http",
|
|
206
|
+
"url": "https://your-team-api.example.com/judges",
|
|
207
|
+
"headers": {
|
|
208
|
+
"Authorization": "Bearer \${JUDGES_API_TOKEN}"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
Environment variables in header values are resolved automatically.
|
|
214
|
+
The HTTP adapter uses standard REST endpoints:
|
|
215
|
+
GET /feedback Load feedback store
|
|
216
|
+
PUT /feedback Save feedback store
|
|
217
|
+
GET /findings Load finding store
|
|
218
|
+
PUT /findings Save finding store
|
|
219
|
+
`,
|
|
220
|
+
},
|
|
221
|
+
"security-ids": {
|
|
222
|
+
title: "CWE & OWASP Identifiers",
|
|
223
|
+
summary: "How findings map to CWE and OWASP standards",
|
|
224
|
+
body: `
|
|
225
|
+
Structured Security IDs
|
|
226
|
+
──────────────────────
|
|
227
|
+
Every finding is automatically enriched with CWE and OWASP identifiers
|
|
228
|
+
based on its rule prefix and specific rule ID.
|
|
229
|
+
|
|
230
|
+
Examples:
|
|
231
|
+
SEC-001 → CWE-89 (SQL Injection), OWASP A03:2021
|
|
232
|
+
AUTH-001 → CWE-798 (Hard-coded Credentials), OWASP A07:2021
|
|
233
|
+
XSS-* → CWE-79 (Cross-site Scripting), OWASP A03:2021
|
|
234
|
+
SSRF-* → CWE-918 (Server-Side Request Forgery), OWASP A10:2021
|
|
235
|
+
|
|
236
|
+
These IDs appear in:
|
|
237
|
+
- SARIF output (as rule tags)
|
|
238
|
+
- JSON output (cweIds / owaspIds fields)
|
|
239
|
+
- The --explain flag output
|
|
240
|
+
- VS Code extension hover details
|
|
241
|
+
|
|
242
|
+
Use --format sarif for tool integration with GitHub Code Scanning,
|
|
243
|
+
SonarQube, Snyk, and other platforms that consume CWE/OWASP data.
|
|
244
|
+
`,
|
|
245
|
+
},
|
|
246
|
+
metrics: {
|
|
247
|
+
title: "Metrics & ROI Tracking",
|
|
248
|
+
summary: "Measuring the value Judges provides",
|
|
249
|
+
body: `
|
|
250
|
+
Quick Metrics
|
|
251
|
+
─────────────
|
|
252
|
+
judges metrics Summary to stdout
|
|
253
|
+
judges metrics --format json Machine-readable output
|
|
254
|
+
judges metrics --since 30d Last 30 days only
|
|
255
|
+
|
|
256
|
+
Visual Dashboard
|
|
257
|
+
────────────────
|
|
258
|
+
judges metrics-dashboard Generate HTML dashboard
|
|
259
|
+
judges metrics-dashboard --output dash.html
|
|
260
|
+
|
|
261
|
+
What's Tracked
|
|
262
|
+
─────────────
|
|
263
|
+
- Findings detected / fixed / open / false-positive
|
|
264
|
+
- Auto-fix adoption rate
|
|
265
|
+
- Estimated time saved (conservative industry averages)
|
|
266
|
+
- Trend direction (improving / stable / degrading)
|
|
267
|
+
- Fix rates by severity
|
|
268
|
+
|
|
269
|
+
All metrics are computed from local data. Configure a DataAdapter
|
|
270
|
+
to aggregate metrics across your team (see: judges help data-adapter).
|
|
271
|
+
`,
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
// ─── Runner ─────────────────────────────────────────────────────────────────
|
|
275
|
+
export function runHelp(argv) {
|
|
276
|
+
const topic = argv.find((a, i) => i > 2 && !a.startsWith("-"))?.toLowerCase();
|
|
277
|
+
if (!topic) {
|
|
278
|
+
printTopicList();
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
const entry = TOPICS[topic];
|
|
282
|
+
if (!entry) {
|
|
283
|
+
console.error(` Unknown help topic: "${topic}"\n`);
|
|
284
|
+
printTopicList();
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
console.log("");
|
|
288
|
+
console.log(` ${entry.title}`);
|
|
289
|
+
console.log(` ${"─".repeat(entry.title.length)}`);
|
|
290
|
+
console.log(entry.body);
|
|
291
|
+
}
|
|
292
|
+
function printTopicList() {
|
|
293
|
+
console.log("");
|
|
294
|
+
console.log(" Judges Panel — Help Topics");
|
|
295
|
+
console.log(" ──────────────────────────");
|
|
296
|
+
console.log("");
|
|
297
|
+
const maxKey = Math.max(...Object.keys(TOPICS).map((k) => k.length));
|
|
298
|
+
for (const [key, { summary }] of Object.entries(TOPICS)) {
|
|
299
|
+
console.log(` judges help ${key.padEnd(maxKey)} ${summary}`);
|
|
300
|
+
}
|
|
301
|
+
console.log("");
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoDH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAa5C"}
|
package/dist/commands/hook.js
CHANGED
|
@@ -12,29 +12,26 @@ const HOOK_MARKER = "# judges-panel-hook";
|
|
|
12
12
|
function generateHookScript() {
|
|
13
13
|
return `#!/usr/bin/env sh
|
|
14
14
|
${HOOK_MARKER}
|
|
15
|
-
# Judges Panel pre-commit hook —
|
|
15
|
+
# Judges Panel pre-commit hook — evaluate staged files in a single pass.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
if
|
|
17
|
+
# Check if judges is available
|
|
18
|
+
if ! command -v judges >/dev/null 2>&1; then
|
|
19
|
+
echo " ⚠️ judges not found — skipping pre-commit review"
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Single-pass evaluation of all staged files
|
|
24
|
+
judges eval . --staged-only --summary --fail-on-findings
|
|
25
|
+
EXIT_CODE=$?
|
|
26
|
+
|
|
27
|
+
if [ "$EXIT_CODE" -ne 0 ]; then
|
|
19
28
|
echo ""
|
|
20
|
-
echo " Judges
|
|
29
|
+
echo " ⛔ Judges found critical issues. Commit blocked."
|
|
30
|
+
echo " Run 'judges eval . --staged-only' to see details."
|
|
31
|
+
echo " Run 'judges fix <file> --apply' to auto-fix."
|
|
32
|
+
echo " Use 'git commit --no-verify' to bypass."
|
|
21
33
|
echo ""
|
|
22
|
-
|
|
23
|
-
for f in $STAGED; do
|
|
24
|
-
judges eval "$f" --summary --fail-on-findings 2>/dev/null
|
|
25
|
-
if [ $? -ne 0 ]; then
|
|
26
|
-
FAILED=1
|
|
27
|
-
fi
|
|
28
|
-
done
|
|
29
|
-
if [ "$FAILED" -ne 0 ]; then
|
|
30
|
-
echo ""
|
|
31
|
-
echo " ⛔ Judges found critical issues. Commit blocked."
|
|
32
|
-
echo " Run 'judges eval <file>' to see details."
|
|
33
|
-
echo " Run 'judges fix <file> --apply' to auto-fix."
|
|
34
|
-
echo " Use 'git commit --no-verify' to bypass."
|
|
35
|
-
echo ""
|
|
36
|
-
exit 1
|
|
37
|
-
fi
|
|
34
|
+
exit 1
|
|
38
35
|
fi
|
|
39
36
|
`;
|
|
40
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,+EAA+E;AAE/E,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C,SAAS,kBAAkB;IACzB,OAAO;EACP,WAAW
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `judges fix --interactive` — Interactive fix mode.
|
|
3
|
+
*
|
|
4
|
+
* Presents each auto-fixable finding one by one, letting the developer
|
|
5
|
+
* accept, skip, or view the diff before applying each patch.
|
|
6
|
+
* Reduces trust barrier by giving full control over what gets changed.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* judges fix src/app.ts --interactive # Interactive per-finding review
|
|
10
|
+
* judges fix src/app.ts -I # Short form
|
|
11
|
+
*/
|
|
12
|
+
import type { Finding } from "../types.js";
|
|
13
|
+
export interface InteractiveFixResult {
|
|
14
|
+
accepted: number;
|
|
15
|
+
skipped: number;
|
|
16
|
+
total: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run interactive fix mode — present each fixable finding and let the user
|
|
20
|
+
* accept or skip it before applying.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runInteractiveFix(filePath: string, findings: Finding[]): Promise<InteractiveFixResult>;
|
|
23
|
+
//# sourceMappingURL=interactive-fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-fix.d.ts","sourceRoot":"","sources":["../../src/commands/interactive-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAKlD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAkDD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4F5G"}
|