@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.
Files changed (379) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +5 -4
  3. package/dist/api.d.ts +5 -2
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +5 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/ast/structural-parser.js +3 -3
  8. package/dist/ast/structural-parser.js.map +1 -1
  9. package/dist/calibration.d.ts +35 -0
  10. package/dist/calibration.d.ts.map +1 -1
  11. package/dist/calibration.js +52 -0
  12. package/dist/calibration.js.map +1 -1
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +370 -16
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/auto-calibrate.d.ts +15 -0
  17. package/dist/commands/auto-calibrate.d.ts.map +1 -0
  18. package/dist/commands/auto-calibrate.js +107 -0
  19. package/dist/commands/auto-calibrate.js.map +1 -0
  20. package/dist/commands/benchmark-languages.js +4 -4
  21. package/dist/commands/benchmark.d.ts +2 -1
  22. package/dist/commands/benchmark.d.ts.map +1 -1
  23. package/dist/commands/benchmark.js +67 -2
  24. package/dist/commands/benchmark.js.map +1 -1
  25. package/dist/commands/calibration-dashboard.d.ts.map +1 -1
  26. package/dist/commands/calibration-dashboard.js +198 -0
  27. package/dist/commands/calibration-dashboard.js.map +1 -1
  28. package/dist/commands/calibration-share.d.ts +31 -0
  29. package/dist/commands/calibration-share.d.ts.map +1 -0
  30. package/dist/commands/calibration-share.js +183 -0
  31. package/dist/commands/calibration-share.js.map +1 -0
  32. package/dist/commands/compliance-report.d.ts +35 -0
  33. package/dist/commands/compliance-report.d.ts.map +1 -0
  34. package/dist/commands/compliance-report.js +162 -0
  35. package/dist/commands/compliance-report.js.map +1 -0
  36. package/dist/commands/config-migrate.d.ts +44 -0
  37. package/dist/commands/config-migrate.d.ts.map +1 -0
  38. package/dist/commands/config-migrate.js +241 -0
  39. package/dist/commands/config-migrate.js.map +1 -0
  40. package/dist/commands/dedup-report.d.ts +13 -0
  41. package/dist/commands/dedup-report.d.ts.map +1 -0
  42. package/dist/commands/dedup-report.js +138 -0
  43. package/dist/commands/dedup-report.js.map +1 -0
  44. package/dist/commands/dep-audit.d.ts +53 -0
  45. package/dist/commands/dep-audit.d.ts.map +1 -0
  46. package/dist/commands/dep-audit.js +278 -0
  47. package/dist/commands/dep-audit.js.map +1 -0
  48. package/dist/commands/deprecated.d.ts +48 -0
  49. package/dist/commands/deprecated.d.ts.map +1 -0
  50. package/dist/commands/deprecated.js +202 -0
  51. package/dist/commands/deprecated.js.map +1 -0
  52. package/dist/commands/diff.d.ts.map +1 -1
  53. package/dist/commands/diff.js +8 -3
  54. package/dist/commands/diff.js.map +1 -1
  55. package/dist/commands/feedback-rules.d.ts +29 -0
  56. package/dist/commands/feedback-rules.d.ts.map +1 -0
  57. package/dist/commands/feedback-rules.js +174 -0
  58. package/dist/commands/feedback-rules.js.map +1 -0
  59. package/dist/commands/feedback.d.ts +12 -0
  60. package/dist/commands/feedback.d.ts.map +1 -1
  61. package/dist/commands/feedback.js +16 -0
  62. package/dist/commands/feedback.js.map +1 -1
  63. package/dist/commands/fix-pr.d.ts +23 -0
  64. package/dist/commands/fix-pr.d.ts.map +1 -0
  65. package/dist/commands/fix-pr.js +323 -0
  66. package/dist/commands/fix-pr.js.map +1 -0
  67. package/dist/commands/fix.d.ts.map +1 -1
  68. package/dist/commands/fix.js +33 -1
  69. package/dist/commands/fix.js.map +1 -1
  70. package/dist/commands/governance.d.ts +32 -0
  71. package/dist/commands/governance.d.ts.map +1 -0
  72. package/dist/commands/governance.js +203 -0
  73. package/dist/commands/governance.js.map +1 -0
  74. package/dist/commands/help.d.ts +8 -0
  75. package/dist/commands/help.d.ts.map +1 -0
  76. package/dist/commands/help.js +303 -0
  77. package/dist/commands/help.js.map +1 -0
  78. package/dist/commands/hook.d.ts.map +1 -1
  79. package/dist/commands/hook.js +17 -20
  80. package/dist/commands/hook.js.map +1 -1
  81. package/dist/commands/interactive-fix.d.ts +23 -0
  82. package/dist/commands/interactive-fix.d.ts.map +1 -0
  83. package/dist/commands/interactive-fix.js +140 -0
  84. package/dist/commands/interactive-fix.js.map +1 -0
  85. package/dist/commands/llm-benchmark.d.ts +119 -0
  86. package/dist/commands/llm-benchmark.d.ts.map +1 -0
  87. package/dist/commands/llm-benchmark.js +396 -0
  88. package/dist/commands/llm-benchmark.js.map +1 -0
  89. package/dist/commands/metrics-dashboard.d.ts +22 -0
  90. package/dist/commands/metrics-dashboard.d.ts.map +1 -0
  91. package/dist/commands/metrics-dashboard.js +335 -0
  92. package/dist/commands/metrics-dashboard.js.map +1 -0
  93. package/dist/commands/metrics.d.ts +58 -0
  94. package/dist/commands/metrics.d.ts.map +1 -0
  95. package/dist/commands/metrics.js +242 -0
  96. package/dist/commands/metrics.js.map +1 -0
  97. package/dist/commands/monorepo.d.ts +38 -0
  98. package/dist/commands/monorepo.d.ts.map +1 -0
  99. package/dist/commands/monorepo.js +233 -0
  100. package/dist/commands/monorepo.js.map +1 -0
  101. package/dist/commands/notify.d.ts +79 -0
  102. package/dist/commands/notify.d.ts.map +1 -0
  103. package/dist/commands/notify.js +325 -0
  104. package/dist/commands/notify.js.map +1 -0
  105. package/dist/commands/onboard.d.ts +13 -0
  106. package/dist/commands/onboard.d.ts.map +1 -0
  107. package/dist/commands/onboard.js +179 -0
  108. package/dist/commands/onboard.js.map +1 -0
  109. package/dist/commands/org-metrics.d.ts +24 -0
  110. package/dist/commands/org-metrics.d.ts.map +1 -0
  111. package/dist/commands/org-metrics.js +238 -0
  112. package/dist/commands/org-metrics.js.map +1 -0
  113. package/dist/commands/override.d.ts +62 -0
  114. package/dist/commands/override.d.ts.map +1 -0
  115. package/dist/commands/override.js +264 -0
  116. package/dist/commands/override.js.map +1 -0
  117. package/dist/commands/parity.d.ts +31 -0
  118. package/dist/commands/parity.d.ts.map +1 -0
  119. package/dist/commands/parity.js +213 -0
  120. package/dist/commands/parity.js.map +1 -0
  121. package/dist/commands/plugin-search.d.ts +40 -0
  122. package/dist/commands/plugin-search.d.ts.map +1 -0
  123. package/dist/commands/plugin-search.js +328 -0
  124. package/dist/commands/plugin-search.js.map +1 -0
  125. package/dist/commands/plugins.d.ts +13 -0
  126. package/dist/commands/plugins.d.ts.map +1 -0
  127. package/dist/commands/plugins.js +105 -0
  128. package/dist/commands/plugins.js.map +1 -0
  129. package/dist/commands/quality-gate.d.ts +70 -0
  130. package/dist/commands/quality-gate.d.ts.map +1 -0
  131. package/dist/commands/quality-gate.js +264 -0
  132. package/dist/commands/quality-gate.js.map +1 -0
  133. package/dist/commands/review.js +1 -1
  134. package/dist/commands/review.js.map +1 -1
  135. package/dist/commands/snapshot.d.ts +27 -0
  136. package/dist/commands/snapshot.d.ts.map +1 -1
  137. package/dist/commands/snapshot.js +99 -0
  138. package/dist/commands/snapshot.js.map +1 -1
  139. package/dist/commands/trace.d.ts +65 -0
  140. package/dist/commands/trace.d.ts.map +1 -0
  141. package/dist/commands/trace.js +246 -0
  142. package/dist/commands/trace.js.map +1 -0
  143. package/dist/commands/trust-ramp.d.ts +30 -0
  144. package/dist/commands/trust-ramp.d.ts.map +1 -0
  145. package/dist/commands/trust-ramp.js +190 -0
  146. package/dist/commands/trust-ramp.js.map +1 -0
  147. package/dist/config.d.ts +5 -0
  148. package/dist/config.d.ts.map +1 -1
  149. package/dist/config.js +65 -0
  150. package/dist/config.js.map +1 -1
  151. package/dist/data-adapter.d.ts +124 -0
  152. package/dist/data-adapter.d.ts.map +1 -0
  153. package/dist/data-adapter.js +213 -0
  154. package/dist/data-adapter.js.map +1 -0
  155. package/dist/evaluators/accessibility.js +1 -1
  156. package/dist/evaluators/accessibility.js.map +1 -1
  157. package/dist/evaluators/ai-code-safety.d.ts.map +1 -1
  158. package/dist/evaluators/ai-code-safety.js +1 -4
  159. package/dist/evaluators/ai-code-safety.js.map +1 -1
  160. package/dist/evaluators/cost-effectiveness.js +1 -1
  161. package/dist/evaluators/cost-effectiveness.js.map +1 -1
  162. package/dist/evaluators/false-positive-review.js +4 -4
  163. package/dist/evaluators/false-positive-review.js.map +1 -1
  164. package/dist/evaluators/framework-rules.d.ts +59 -0
  165. package/dist/evaluators/framework-rules.d.ts.map +1 -0
  166. package/dist/evaluators/framework-rules.js +292 -0
  167. package/dist/evaluators/framework-rules.js.map +1 -0
  168. package/dist/evaluators/iac-security.js +1 -1
  169. package/dist/evaluators/iac-security.js.map +1 -1
  170. package/dist/evaluators/index.d.ts.map +1 -1
  171. package/dist/evaluators/index.js +59 -10
  172. package/dist/evaluators/index.js.map +1 -1
  173. package/dist/evaluators/intent-alignment.d.ts +4 -0
  174. package/dist/evaluators/intent-alignment.d.ts.map +1 -1
  175. package/dist/evaluators/intent-alignment.js +163 -0
  176. package/dist/evaluators/intent-alignment.js.map +1 -1
  177. package/dist/evaluators/logic-review.js +1 -1
  178. package/dist/evaluators/logic-review.js.map +1 -1
  179. package/dist/evaluators/maintainability.js +1 -1
  180. package/dist/evaluators/maintainability.js.map +1 -1
  181. package/dist/evaluators/over-engineering.js +3 -3
  182. package/dist/evaluators/over-engineering.js.map +1 -1
  183. package/dist/evaluators/project.d.ts +12 -0
  184. package/dist/evaluators/project.d.ts.map +1 -1
  185. package/dist/evaluators/project.js +86 -0
  186. package/dist/evaluators/project.js.map +1 -1
  187. package/dist/evaluators/security.js +2 -2
  188. package/dist/evaluators/security.js.map +1 -1
  189. package/dist/evaluators/ux.js +1 -1
  190. package/dist/evaluators/ux.js.map +1 -1
  191. package/dist/finding-lifecycle.d.ts +9 -0
  192. package/dist/finding-lifecycle.d.ts.map +1 -1
  193. package/dist/finding-lifecycle.js +15 -0
  194. package/dist/finding-lifecycle.js.map +1 -1
  195. package/dist/fix-history.d.ts +9 -0
  196. package/dist/fix-history.d.ts.map +1 -1
  197. package/dist/fix-history.js +15 -0
  198. package/dist/fix-history.js.map +1 -1
  199. package/dist/formatters/sarif.d.ts +3 -0
  200. package/dist/formatters/sarif.d.ts.map +1 -1
  201. package/dist/formatters/sarif.js +36 -12
  202. package/dist/formatters/sarif.js.map +1 -1
  203. package/dist/github-app.d.ts +16 -1
  204. package/dist/github-app.d.ts.map +1 -1
  205. package/dist/github-app.js +85 -2
  206. package/dist/github-app.js.map +1 -1
  207. package/dist/index.js +5 -0
  208. package/dist/index.js.map +1 -1
  209. package/dist/judge-registry.d.ts +157 -0
  210. package/dist/judge-registry.d.ts.map +1 -0
  211. package/dist/judge-registry.js +273 -0
  212. package/dist/judge-registry.js.map +1 -0
  213. package/dist/judges/accessibility.d.ts.map +1 -1
  214. package/dist/judges/accessibility.js +4 -0
  215. package/dist/judges/accessibility.js.map +1 -1
  216. package/dist/judges/agent-instructions.d.ts.map +1 -1
  217. package/dist/judges/agent-instructions.js +4 -0
  218. package/dist/judges/agent-instructions.js.map +1 -1
  219. package/dist/judges/ai-code-safety.d.ts.map +1 -1
  220. package/dist/judges/ai-code-safety.js +4 -0
  221. package/dist/judges/ai-code-safety.js.map +1 -1
  222. package/dist/judges/api-contract.d.ts.map +1 -1
  223. package/dist/judges/api-contract.js +4 -0
  224. package/dist/judges/api-contract.js.map +1 -1
  225. package/dist/judges/api-design.d.ts.map +1 -1
  226. package/dist/judges/api-design.js +4 -0
  227. package/dist/judges/api-design.js.map +1 -1
  228. package/dist/judges/authentication.d.ts.map +1 -1
  229. package/dist/judges/authentication.js +4 -0
  230. package/dist/judges/authentication.js.map +1 -1
  231. package/dist/judges/backwards-compatibility.d.ts.map +1 -1
  232. package/dist/judges/backwards-compatibility.js +4 -0
  233. package/dist/judges/backwards-compatibility.js.map +1 -1
  234. package/dist/judges/caching.d.ts.map +1 -1
  235. package/dist/judges/caching.js +4 -0
  236. package/dist/judges/caching.js.map +1 -1
  237. package/dist/judges/ci-cd.d.ts.map +1 -1
  238. package/dist/judges/ci-cd.js +4 -0
  239. package/dist/judges/ci-cd.js.map +1 -1
  240. package/dist/judges/cloud-readiness.d.ts.map +1 -1
  241. package/dist/judges/cloud-readiness.js +4 -0
  242. package/dist/judges/cloud-readiness.js.map +1 -1
  243. package/dist/judges/code-structure.d.ts.map +1 -1
  244. package/dist/judges/code-structure.js +4 -0
  245. package/dist/judges/code-structure.js.map +1 -1
  246. package/dist/judges/compliance.d.ts.map +1 -1
  247. package/dist/judges/compliance.js +4 -0
  248. package/dist/judges/compliance.js.map +1 -1
  249. package/dist/judges/concurrency.d.ts.map +1 -1
  250. package/dist/judges/concurrency.js +4 -0
  251. package/dist/judges/concurrency.js.map +1 -1
  252. package/dist/judges/configuration-management.d.ts.map +1 -1
  253. package/dist/judges/configuration-management.js +4 -0
  254. package/dist/judges/configuration-management.js.map +1 -1
  255. package/dist/judges/cost-effectiveness.d.ts.map +1 -1
  256. package/dist/judges/cost-effectiveness.js +4 -0
  257. package/dist/judges/cost-effectiveness.js.map +1 -1
  258. package/dist/judges/cybersecurity.d.ts.map +1 -1
  259. package/dist/judges/cybersecurity.js +4 -0
  260. package/dist/judges/cybersecurity.js.map +1 -1
  261. package/dist/judges/data-security.d.ts.map +1 -1
  262. package/dist/judges/data-security.js +4 -0
  263. package/dist/judges/data-security.js.map +1 -1
  264. package/dist/judges/data-sovereignty.d.ts.map +1 -1
  265. package/dist/judges/data-sovereignty.js +4 -0
  266. package/dist/judges/data-sovereignty.js.map +1 -1
  267. package/dist/judges/database.d.ts.map +1 -1
  268. package/dist/judges/database.js +4 -0
  269. package/dist/judges/database.js.map +1 -1
  270. package/dist/judges/dependency-health.d.ts.map +1 -1
  271. package/dist/judges/dependency-health.js +4 -0
  272. package/dist/judges/dependency-health.js.map +1 -1
  273. package/dist/judges/documentation.d.ts.map +1 -1
  274. package/dist/judges/documentation.js +4 -0
  275. package/dist/judges/documentation.js.map +1 -1
  276. package/dist/judges/error-handling.d.ts.map +1 -1
  277. package/dist/judges/error-handling.js +4 -0
  278. package/dist/judges/error-handling.js.map +1 -1
  279. package/dist/judges/ethics-bias.d.ts.map +1 -1
  280. package/dist/judges/ethics-bias.js +4 -0
  281. package/dist/judges/ethics-bias.js.map +1 -1
  282. package/dist/judges/false-positive-review.d.ts.map +1 -1
  283. package/dist/judges/false-positive-review.js +2 -0
  284. package/dist/judges/false-positive-review.js.map +1 -1
  285. package/dist/judges/framework-safety.d.ts.map +1 -1
  286. package/dist/judges/framework-safety.js +4 -0
  287. package/dist/judges/framework-safety.js.map +1 -1
  288. package/dist/judges/hallucination-detection.d.ts.map +1 -1
  289. package/dist/judges/hallucination-detection.js +4 -0
  290. package/dist/judges/hallucination-detection.js.map +1 -1
  291. package/dist/judges/iac-security.d.ts.map +1 -1
  292. package/dist/judges/iac-security.js +4 -0
  293. package/dist/judges/iac-security.js.map +1 -1
  294. package/dist/judges/index.d.ts +59 -0
  295. package/dist/judges/index.d.ts.map +1 -1
  296. package/dist/judges/index.js +65 -189
  297. package/dist/judges/index.js.map +1 -1
  298. package/dist/judges/intent-alignment.d.ts.map +1 -1
  299. package/dist/judges/intent-alignment.js +4 -0
  300. package/dist/judges/intent-alignment.js.map +1 -1
  301. package/dist/judges/internationalization.d.ts.map +1 -1
  302. package/dist/judges/internationalization.js +4 -0
  303. package/dist/judges/internationalization.js.map +1 -1
  304. package/dist/judges/logging-privacy.d.ts.map +1 -1
  305. package/dist/judges/logging-privacy.js +4 -0
  306. package/dist/judges/logging-privacy.js.map +1 -1
  307. package/dist/judges/logic-review.d.ts.map +1 -1
  308. package/dist/judges/logic-review.js +4 -0
  309. package/dist/judges/logic-review.js.map +1 -1
  310. package/dist/judges/maintainability.d.ts.map +1 -1
  311. package/dist/judges/maintainability.js +4 -0
  312. package/dist/judges/maintainability.js.map +1 -1
  313. package/dist/judges/model-fingerprint.d.ts.map +1 -1
  314. package/dist/judges/model-fingerprint.js +4 -0
  315. package/dist/judges/model-fingerprint.js.map +1 -1
  316. package/dist/judges/multi-turn-coherence.d.ts.map +1 -1
  317. package/dist/judges/multi-turn-coherence.js +4 -0
  318. package/dist/judges/multi-turn-coherence.js.map +1 -1
  319. package/dist/judges/observability.d.ts.map +1 -1
  320. package/dist/judges/observability.js +4 -0
  321. package/dist/judges/observability.js.map +1 -1
  322. package/dist/judges/over-engineering.d.ts.map +1 -1
  323. package/dist/judges/over-engineering.js +4 -0
  324. package/dist/judges/over-engineering.js.map +1 -1
  325. package/dist/judges/performance.d.ts.map +1 -1
  326. package/dist/judges/performance.js +4 -0
  327. package/dist/judges/performance.js.map +1 -1
  328. package/dist/judges/portability.d.ts.map +1 -1
  329. package/dist/judges/portability.js +4 -0
  330. package/dist/judges/portability.js.map +1 -1
  331. package/dist/judges/rate-limiting.d.ts.map +1 -1
  332. package/dist/judges/rate-limiting.js +4 -0
  333. package/dist/judges/rate-limiting.js.map +1 -1
  334. package/dist/judges/reliability.d.ts.map +1 -1
  335. package/dist/judges/reliability.js +4 -0
  336. package/dist/judges/reliability.js.map +1 -1
  337. package/dist/judges/scalability.d.ts.map +1 -1
  338. package/dist/judges/scalability.js +4 -0
  339. package/dist/judges/scalability.js.map +1 -1
  340. package/dist/judges/security.d.ts.map +1 -1
  341. package/dist/judges/security.js +4 -0
  342. package/dist/judges/security.js.map +1 -1
  343. package/dist/judges/software-practices.d.ts.map +1 -1
  344. package/dist/judges/software-practices.js +4 -0
  345. package/dist/judges/software-practices.js.map +1 -1
  346. package/dist/judges/testing.d.ts.map +1 -1
  347. package/dist/judges/testing.js +4 -0
  348. package/dist/judges/testing.js.map +1 -1
  349. package/dist/judges/ux.d.ts.map +1 -1
  350. package/dist/judges/ux.js +4 -0
  351. package/dist/judges/ux.js.map +1 -1
  352. package/dist/parallel.d.ts +53 -0
  353. package/dist/parallel.d.ts.map +1 -0
  354. package/dist/parallel.js +170 -0
  355. package/dist/parallel.js.map +1 -0
  356. package/dist/plugins.d.ts +8 -51
  357. package/dist/plugins.d.ts.map +1 -1
  358. package/dist/plugins.js +16 -125
  359. package/dist/plugins.js.map +1 -1
  360. package/dist/security-ids.d.ts +24 -0
  361. package/dist/security-ids.d.ts.map +1 -0
  362. package/dist/security-ids.js +240 -0
  363. package/dist/security-ids.js.map +1 -0
  364. package/dist/tools/prompts.d.ts +4 -0
  365. package/dist/tools/prompts.d.ts.map +1 -1
  366. package/dist/tools/prompts.js +6 -4
  367. package/dist/tools/prompts.js.map +1 -1
  368. package/dist/tools/register-scaffold.d.ts +3 -0
  369. package/dist/tools/register-scaffold.d.ts.map +1 -0
  370. package/dist/tools/register-scaffold.js +399 -0
  371. package/dist/tools/register-scaffold.js.map +1 -0
  372. package/dist/tools/register.d.ts +1 -1
  373. package/dist/tools/register.d.ts.map +1 -1
  374. package/dist/tools/register.js +3 -1
  375. package/dist/tools/register.js.map +1 -1
  376. package/dist/types.d.ts +75 -0
  377. package/dist/types.d.ts.map +1 -1
  378. package/package.json +3 -2
  379. 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 &mdash; 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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
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":"AAAA;;;;;GAKG;AAUH,MAAM,MAAM,GAA8B;IACxC,iBAAiB,EAAE;QACjB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BT;KACE;IAED,QAAQ,EAAE;QACR,KAAK,EAAE,qCAAqC;QAC5C,OAAO,EAAE,uCAAuC;QAChD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;KACE;IAED,WAAW,EAAE;QACX,KAAK,EAAE,iCAAiC;QACxC,OAAO,EAAE,8CAA8C;QACvD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBT;KACE;IAED,EAAE,EAAE;QACF,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,mCAAmC;QAC5C,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BT;KACE;IAED,OAAO,EAAE;QACP,KAAK,EAAE,yBAAyB;QAChC,OAAO,EAAE,wCAAwC;QACjD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BT;KACE;IAED,OAAO,EAAE;QACP,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,gDAAgD;QACzD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBT;KACE;IAED,cAAc,EAAE;QACd,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,kDAAkD;QAC3D,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCT;KACE;IAED,cAAc,EAAE;QACd,KAAK,EAAE,yBAAyB;QAChC,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;CAoBT;KACE;IAED,OAAO,EAAE;QACP,KAAK,EAAE,wBAAwB;QAC/B,OAAO,EAAE,qCAAqC;QAC9C,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBT;KACE;CACF,CAAC;AAEF,+EAA+E;AAE/E,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAE9E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,cAAc,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,KAAK,CAAC,CAAC;QACpD,cAAc,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuDH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAa5C"}
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"}
@@ -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 — automatically evaluate staged files.
15
+ # Judges Panel pre-commit hook — evaluate staged files in a single pass.
16
16
 
17
- STAGED=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\.(ts|tsx|js|jsx|py|go|rs|java|cs|cpp|cc|cxx)$')
18
- if [ -n "$STAGED" ]; then
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 Panel checking staged files..."
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
- FAILED=0
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":"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"}
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"}