@hawkeyexl/manni 4.3.1 → 4.4.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 (224) hide show
  1. package/README.md +9 -1
  2. package/dist/batch-DFRCLY77.js +36 -0
  3. package/dist/build-Q5C6SX5J.js +31 -0
  4. package/dist/calibrate-XQILKXS3.js +31 -0
  5. package/dist/capture-JQMOC3BW.js +32 -0
  6. package/dist/check-HYNGXYJV.js +18 -0
  7. package/dist/check-HYNGXYJV.js.map +1 -0
  8. package/dist/check-NFZQLJKN.js +27 -0
  9. package/dist/check-NFZQLJKN.js.map +1 -0
  10. package/dist/check-U54XV6BP.js +40 -0
  11. package/dist/check-U54XV6BP.js.map +1 -0
  12. package/dist/chunk-252LNOEG.js +622 -0
  13. package/dist/chunk-252LNOEG.js.map +1 -0
  14. package/dist/chunk-2H7UOFLK.js +11 -0
  15. package/dist/chunk-2H7UOFLK.js.map +1 -0
  16. package/dist/chunk-2U3ORT6D.js +230 -0
  17. package/dist/chunk-2U3ORT6D.js.map +1 -0
  18. package/dist/chunk-3AFUD75K.js +23 -0
  19. package/dist/chunk-3AFUD75K.js.map +1 -0
  20. package/dist/{chunk-3R23C5DT.js → chunk-4TSWU2SU.js} +2 -14
  21. package/dist/chunk-4TSWU2SU.js.map +1 -0
  22. package/dist/chunk-5KHIFVD2.js +1192 -0
  23. package/dist/chunk-5KHIFVD2.js.map +1 -0
  24. package/dist/chunk-5YXBLLAC.js +2165 -0
  25. package/dist/chunk-5YXBLLAC.js.map +1 -0
  26. package/dist/chunk-644JVKJ4.js +3872 -0
  27. package/dist/chunk-644JVKJ4.js.map +1 -0
  28. package/dist/chunk-6OYEI2VV.js +88 -0
  29. package/dist/chunk-6OYEI2VV.js.map +1 -0
  30. package/dist/chunk-77AINBYM.js +19 -0
  31. package/dist/chunk-77AINBYM.js.map +1 -0
  32. package/dist/chunk-77HX34KD.js +1287 -0
  33. package/dist/chunk-77HX34KD.js.map +1 -0
  34. package/dist/{chunk-CFDUZRM2.js → chunk-7QMCHA4N.js} +32 -240
  35. package/dist/chunk-7QMCHA4N.js.map +1 -0
  36. package/dist/chunk-BUXDLRDT.js +455 -0
  37. package/dist/chunk-BUXDLRDT.js.map +1 -0
  38. package/dist/chunk-C6OH6CNF.js +388 -0
  39. package/dist/chunk-C6OH6CNF.js.map +1 -0
  40. package/dist/chunk-CK7SKVHR.js +1042 -0
  41. package/dist/chunk-CK7SKVHR.js.map +1 -0
  42. package/dist/chunk-CYWHFSRT.js +6737 -0
  43. package/dist/chunk-CYWHFSRT.js.map +1 -0
  44. package/dist/chunk-ERMSO34F.js +17 -0
  45. package/dist/chunk-ERMSO34F.js.map +1 -0
  46. package/dist/{chunk-IOYXPBCL.js → chunk-G3T47CFV.js} +1 -7
  47. package/dist/{chunk-IOYXPBCL.js.map → chunk-G3T47CFV.js.map} +1 -1
  48. package/dist/chunk-G7NJSREW.js +979 -0
  49. package/dist/chunk-G7NJSREW.js.map +1 -0
  50. package/dist/chunk-GLP5PSXB.js +72 -0
  51. package/dist/chunk-GLP5PSXB.js.map +1 -0
  52. package/dist/chunk-H2DLH2JI.js +198 -0
  53. package/dist/chunk-H2DLH2JI.js.map +1 -0
  54. package/dist/chunk-H6FZ66XR.js +634 -0
  55. package/dist/chunk-H6FZ66XR.js.map +1 -0
  56. package/dist/{chunk-KJR7OVDX.js → chunk-IEQHSCZG.js} +56 -137
  57. package/dist/chunk-IEQHSCZG.js.map +1 -0
  58. package/dist/chunk-IKEWBMCN.js +98 -0
  59. package/dist/chunk-IKEWBMCN.js.map +1 -0
  60. package/dist/chunk-JOHKIAVH.js +5440 -0
  61. package/dist/chunk-JOHKIAVH.js.map +1 -0
  62. package/dist/chunk-JVTNMVYU.js +10921 -0
  63. package/dist/chunk-JVTNMVYU.js.map +1 -0
  64. package/dist/chunk-K3D6FPV6.js +164 -0
  65. package/dist/chunk-K3D6FPV6.js.map +1 -0
  66. package/dist/{chunk-UBMMXS2Y.js → chunk-KCGV52AM.js} +69 -48
  67. package/dist/{chunk-UBMMXS2Y.js.map → chunk-KCGV52AM.js.map} +1 -1
  68. package/dist/chunk-LAKAWRV5.js +1651 -0
  69. package/dist/chunk-LAKAWRV5.js.map +1 -0
  70. package/dist/chunk-LJ2RDH3F.js +49 -0
  71. package/dist/chunk-LJ2RDH3F.js.map +1 -0
  72. package/dist/chunk-M2JCK5F6.js +805 -0
  73. package/dist/chunk-M2JCK5F6.js.map +1 -0
  74. package/dist/chunk-MNH7QO4Z.js +15 -0
  75. package/dist/chunk-MNH7QO4Z.js.map +1 -0
  76. package/dist/{chunk-HAPTXWU2.js → chunk-MYC3O5EJ.js} +4 -4
  77. package/dist/chunk-MYMBCTDE.js +387 -0
  78. package/dist/chunk-MYMBCTDE.js.map +1 -0
  79. package/dist/chunk-NCPWXHDO.js +683 -0
  80. package/dist/chunk-NCPWXHDO.js.map +1 -0
  81. package/dist/chunk-NWZ2SLYL.js +2957 -0
  82. package/dist/chunk-NWZ2SLYL.js.map +1 -0
  83. package/dist/chunk-OBFENF3U.js +934 -0
  84. package/dist/chunk-OBFENF3U.js.map +1 -0
  85. package/dist/chunk-OWBRDNRZ.js +16 -0
  86. package/dist/chunk-OWBRDNRZ.js.map +1 -0
  87. package/dist/{chunk-KTSJ2ZHA.js → chunk-PAU352SV.js} +5 -3
  88. package/dist/{chunk-KTSJ2ZHA.js.map → chunk-PAU352SV.js.map} +1 -1
  89. package/dist/chunk-PCE7QHXJ.js +68 -0
  90. package/dist/chunk-PCE7QHXJ.js.map +1 -0
  91. package/dist/chunk-PCHZY2I7.js +299 -0
  92. package/dist/chunk-PCHZY2I7.js.map +1 -0
  93. package/dist/chunk-PHF3D7ER.js +1042 -0
  94. package/dist/chunk-PHF3D7ER.js.map +1 -0
  95. package/dist/chunk-Q35YIDBV.js +1202 -0
  96. package/dist/chunk-Q35YIDBV.js.map +1 -0
  97. package/dist/chunk-RLR4TKUZ.js +4398 -0
  98. package/dist/chunk-RLR4TKUZ.js.map +1 -0
  99. package/dist/chunk-RNVYGWIC.js +30 -0
  100. package/dist/chunk-RNVYGWIC.js.map +1 -0
  101. package/dist/chunk-SE4JN5XN.js +19 -0
  102. package/dist/chunk-SE4JN5XN.js.map +1 -0
  103. package/dist/chunk-TIUTIOFB.js +25 -0
  104. package/dist/chunk-TIUTIOFB.js.map +1 -0
  105. package/dist/chunk-TU2WUBVZ.js +2 -0
  106. package/dist/chunk-TU2WUBVZ.js.map +1 -0
  107. package/dist/chunk-TZOYZK2E.js +98 -0
  108. package/dist/chunk-TZOYZK2E.js.map +1 -0
  109. package/dist/chunk-UKZNLVJW.js +17 -0
  110. package/dist/chunk-UKZNLVJW.js.map +1 -0
  111. package/dist/chunk-UZC7LDAQ.js +178 -0
  112. package/dist/chunk-UZC7LDAQ.js.map +1 -0
  113. package/dist/chunk-V46OILVC.js +3090 -0
  114. package/dist/chunk-V46OILVC.js.map +1 -0
  115. package/dist/chunk-WQE54PNH.js +1975 -0
  116. package/dist/chunk-WQE54PNH.js.map +1 -0
  117. package/dist/chunk-X3BPBDGQ.js +52 -0
  118. package/dist/chunk-X3BPBDGQ.js.map +1 -0
  119. package/dist/chunk-XSLV76YK.js +54 -0
  120. package/dist/chunk-XSLV76YK.js.map +1 -0
  121. package/dist/{chunk-5HNHEUD5.js → chunk-XYLUCIKQ.js} +3 -3
  122. package/dist/chunk-YEUYKR62.js +72 -0
  123. package/dist/chunk-YEUYKR62.js.map +1 -0
  124. package/dist/{chunk-G5CM2VGQ.js → chunk-YFQBFNQS.js} +8 -94
  125. package/dist/chunk-YFQBFNQS.js.map +1 -0
  126. package/dist/chunk-YIL4XLLJ.js +1661 -0
  127. package/dist/chunk-YIL4XLLJ.js.map +1 -0
  128. package/dist/chunk-YNHZHSSM.js +41 -0
  129. package/dist/chunk-YNHZHSSM.js.map +1 -0
  130. package/dist/chunk-YTCZRLTU.js +96 -0
  131. package/dist/chunk-YTCZRLTU.js.map +1 -0
  132. package/dist/chunk-YYBFZLAJ.js +374 -0
  133. package/dist/chunk-YYBFZLAJ.js.map +1 -0
  134. package/dist/chunk-ZXRAE55H.js +31 -0
  135. package/dist/chunk-ZXRAE55H.js.map +1 -0
  136. package/dist/cli-2QPR2OZG.js +232 -0
  137. package/dist/cli-2QPR2OZG.js.map +1 -0
  138. package/dist/cli-4IOPGZHR.js +1203 -0
  139. package/dist/cli-4IOPGZHR.js.map +1 -0
  140. package/dist/cli-5FL73WHA.js +346 -0
  141. package/dist/cli-5FL73WHA.js.map +1 -0
  142. package/dist/cli-C262QOWM.js +739 -0
  143. package/dist/cli-C262QOWM.js.map +1 -0
  144. package/dist/cli-LJLLIQB2.js +423 -0
  145. package/dist/cli-LJLLIQB2.js.map +1 -0
  146. package/dist/cli-OFPZ5MAS.js +626 -0
  147. package/dist/cli-OFPZ5MAS.js.map +1 -0
  148. package/dist/cli-SHSMSRQY.js +28 -0
  149. package/dist/cli-SHSMSRQY.js.map +1 -0
  150. package/dist/cli-SRHFUZHA.js +473 -0
  151. package/dist/cli-SRHFUZHA.js.map +1 -0
  152. package/dist/cli-URZQXL4K.js +552 -0
  153. package/dist/cli-URZQXL4K.js.map +1 -0
  154. package/dist/cli.d.ts +12 -2
  155. package/dist/cli.js +109 -7661
  156. package/dist/cli.js.map +1 -1
  157. package/dist/docmeta.js +15 -3
  158. package/dist/docmeta.js.map +1 -1
  159. package/dist/github-FE6KCNYJ.js +27 -0
  160. package/dist/github-FE6KCNYJ.js.map +1 -0
  161. package/dist/github-QXL3VMK2.js +32 -0
  162. package/dist/github-QXL3VMK2.js.map +1 -0
  163. package/dist/index.d.ts +65 -3
  164. package/dist/index.js +407 -337
  165. package/dist/index.js.map +1 -1
  166. package/dist/json-7WV7KL6H.js +17 -0
  167. package/dist/json-7WV7KL6H.js.map +1 -0
  168. package/dist/json-SGZ6ZRFD.js +35 -0
  169. package/dist/json-SGZ6ZRFD.js.map +1 -0
  170. package/dist/lint-DL4LJRAY.js +28 -0
  171. package/dist/lint-DL4LJRAY.js.map +1 -0
  172. package/dist/list-6BAXTZUM.js +29 -0
  173. package/dist/list-6BAXTZUM.js.map +1 -0
  174. package/dist/list-7BKNYPSB.js +31 -0
  175. package/dist/list-7BKNYPSB.js.map +1 -0
  176. package/dist/page-3U2GCFNE.js +41 -0
  177. package/dist/page-3U2GCFNE.js.map +1 -0
  178. package/dist/picker-3XF36MJF.js +14 -0
  179. package/dist/picker-3XF36MJF.js.map +1 -0
  180. package/dist/pretty-2H57QVTY.js +43 -0
  181. package/dist/pretty-2H57QVTY.js.map +1 -0
  182. package/dist/pretty-N6DO4OOL.js +37 -0
  183. package/dist/pretty-N6DO4OOL.js.map +1 -0
  184. package/dist/reporters-M6LJ2IYU.js +21 -0
  185. package/dist/reporters-M6LJ2IYU.js.map +1 -0
  186. package/dist/reporters-N6GHXSS7.js +42 -0
  187. package/dist/reporters-N6GHXSS7.js.map +1 -0
  188. package/dist/reporters-UCNEV7PH.js +71 -0
  189. package/dist/reporters-UCNEV7PH.js.map +1 -0
  190. package/dist/run-XZDAREJE.js +33 -0
  191. package/dist/run-XZDAREJE.js.map +1 -0
  192. package/dist/term-5ICGKPC3.js +1592 -0
  193. package/dist/term-5ICGKPC3.js.map +1 -0
  194. package/dist/types-Y6TXHM7M.js +10 -0
  195. package/dist/types-Y6TXHM7M.js.map +1 -0
  196. package/dist/validate-GQRM77YN.js +16 -0
  197. package/dist/validate-GQRM77YN.js.map +1 -0
  198. package/package.json +1 -1
  199. package/plugin/manni/.claude-plugin/plugin.json +9 -0
  200. package/plugin/manni/hooks/hooks.json +52 -0
  201. package/plugin/manni/skills/check/SKILL.md +20 -0
  202. package/plugin/manni/skills/evals/SKILL.md +27 -0
  203. package/plugin/manni/skills/fix/SKILL.md +56 -0
  204. package/plugin/manni/skills/setup/SKILL.md +41 -0
  205. package/dist/batch-A5HZKYIW.js +0 -18
  206. package/dist/calibrate-S5K6QHUY.js +0 -13
  207. package/dist/capture-OZEZDABQ.js +0 -15
  208. package/dist/chunk-3R23C5DT.js.map +0 -1
  209. package/dist/chunk-CFDUZRM2.js.map +0 -1
  210. package/dist/chunk-G5CM2VGQ.js.map +0 -1
  211. package/dist/chunk-KJR7OVDX.js.map +0 -1
  212. package/dist/chunk-V4KUVE47.js +0 -27170
  213. package/dist/chunk-V4KUVE47.js.map +0 -1
  214. package/dist/chunk-ZQBTK3DO.js +0 -26518
  215. package/dist/chunk-ZQBTK3DO.js.map +0 -1
  216. package/dist/picker-6HRMETE7.js +0 -12
  217. package/plugin/tracevals/.claude-plugin/plugin.json +0 -9
  218. package/plugin/tracevals/hooks/hooks.json +0 -17
  219. /package/dist/{batch-A5HZKYIW.js.map → batch-DFRCLY77.js.map} +0 -0
  220. /package/dist/{calibrate-S5K6QHUY.js.map → build-Q5C6SX5J.js.map} +0 -0
  221. /package/dist/{capture-OZEZDABQ.js.map → calibrate-XQILKXS3.js.map} +0 -0
  222. /package/dist/{picker-6HRMETE7.js.map → capture-JQMOC3BW.js.map} +0 -0
  223. /package/dist/{chunk-HAPTXWU2.js.map → chunk-MYC3O5EJ.js.map} +0 -0
  224. /package/dist/{chunk-5HNHEUD5.js.map → chunk-XYLUCIKQ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/docevals/reporters/scope.ts","../src/docevals/reporters/location.ts","../src/docevals/reporters/pretty.ts","../src/docevals/reporters/json.ts","../src/docevals/reporters/markdown.ts","../src/docevals/reporters/github.ts","../src/docevals/reporters/sarif.ts","../src/docevals/reporters/junit.ts","../src/docevals/reporters/html.ts","../src/docevals/reporters/index.ts"],"sourcesContent":["/**\n * The one sentence every reporter prints about a scoped run: what `--since`\n * and `--newer-than` narrowed it to (ADR 01040). Built here once so the\n * formats cannot word the same scope three ways.\n */\nimport type { EngineReport } from \"../core/engine.js\";\n\nexport interface ScopeLine {\n /** Nothing was selected, so nothing was evaluated. */\n empty: boolean;\n /** The sentence, with `code` applied to the ref (backticks in Markdown). */\n text: (code?: (s: string) => string) => string;\n}\n\n/** The scope sentence for `report`, or `undefined` when the run was not scoped. */\nexport function scopeLine(report: EngineReport): ScopeLine | undefined {\n const sc = report.since ?? report.newerThan;\n if (sc === undefined) return undefined;\n const { pagesSelected, pagesTotal } = sc;\n const ref = report.since?.ref;\n const window = report.newerThan?.duration;\n return {\n empty: pagesSelected === 0,\n text: (code = (s) => s) => {\n const what = [\n ref === undefined ? undefined : `since ${code(ref)}`,\n window === undefined ? undefined : `in the last ${window}`,\n ]\n .filter((s) => s !== undefined)\n .join(\" and \");\n return pagesSelected === 0\n ? `No pages changed ${what} — nothing was evaluated.`\n : `Scoped to ${String(pagesSelected)} of ${String(pagesTotal)} page(s) changed ${what}.`;\n },\n };\n}\n","/**\n * Where a result points when nothing in the page does: the entry that\n * declares its eval (`EvalResult.location`). A finding with a content line\n * keeps its own file and line; everything else about an eval lands here.\n */\nimport type { EvalResult } from \"../types.js\";\n\n/** A file, and the 1-based line in it when one is known. */\nexport type Location = NonNullable<EvalResult[\"location\"]>;\n\n/**\n * The declaring entry of a result. The engine stamps one on every result; a\n * result built elsewhere without one names its page.\n */\nexport function declaringEntry(r: EvalResult): Location {\n return r.location ?? { file: r.file };\n}\n\n/** `<file>:<line>`, or the file alone when no line declares the eval. */\nexport function locationLabel(location: Location): string {\n return location.line === undefined\n ? location.file\n : `${location.file}:${String(location.line)}`;\n}\n","/** Pretty (terminal) reporter: `--format pretty`, the default. */\nimport { scopeLine } from \"./scope.js\";\nimport { palette, type Colors } from \"../../shared/color.js\";\nimport type { EvalResult } from \"../types.js\";\nimport type { EngineReport } from \"../core/engine.js\";\nimport { declaringEntry, locationLabel } from \"./location.js\";\n\nfunction outcomeTag(r: EvalResult, pc: Colors): string {\n switch (r.outcome) {\n case \"pass\":\n return pc.green(\"pass\");\n case \"fail\":\n return pc.red(\"FAIL\");\n case \"needs-review\":\n return pc.yellow(\"review\");\n case \"skipped\":\n return pc.dim(\"skip\");\n case \"error\":\n return pc.red(\"ERROR\");\n }\n}\n\n/** What the caller decided about colour. Off unless the caller turns it on. */\nexport interface ColorOptions {\n color?: boolean;\n}\n\nexport function renderPretty(\n report: EngineReport,\n opts: ColorOptions = {},\n): string {\n const pc = palette(opts.color === true);\n const lines: string[] = [];\n\n const byFile = new Map<string, EvalResult[]>();\n for (const r of report.evalResults) {\n const list = byFile.get(r.file) ?? [];\n list.push(r);\n byFile.set(r.file, list);\n }\n\n for (const [file, results] of [...byFile.entries()].sort()) {\n lines.push(pc.bold(file));\n for (const r of results) {\n const zone = r.consensus ? pc.dim(` [${r.consensus.zone}]`) : \"\";\n const via = r.via ? pc.dim(\" (human-reviewed)\") : \"\";\n const gen = r.generated ? pc.cyan(\" (generated)\") : \"\";\n const entry = pc.dim(locationLabel(declaringEntry(r)));\n lines.push(` ${outcomeTag(r, pc)} ${r.evalName}${zone}${via}${gen} ${entry}`);\n if (r.skipReason && r.outcome !== \"pass\") {\n lines.push(pc.dim(` ${r.skipReason}`));\n }\n for (const f of r.findings ?? []) {\n const loc = f.line != null ? `:${f.line}` : \"\";\n const rule = f.ruleId ? pc.dim(` [${f.ruleId}]`) : \"\";\n const sev =\n f.severity === \"error\"\n ? pc.red(f.severity)\n : f.severity === \"warning\"\n ? pc.yellow(f.severity)\n : pc.dim(f.severity);\n lines.push(` ${sev}${loc}${rule} ${f.message}`);\n }\n if (r.consensus && r.outcome !== \"pass\") {\n const v = r.consensus;\n lines.push(\n pc.dim(\n ` votes pass:${v.votes.pass} fail:${v.votes.fail} partial:${v.votes.partial}` +\n (v.votes.error ? ` error:${v.votes.error}` : \"\") +\n ` — confidence ${v.meanConfidence.toFixed(2)}`,\n ),\n );\n const reasoning = v.runs.find((run) => run.verdict)?.verdict?.reasoning;\n if (reasoning) lines.push(pc.dim(` ${reasoning}`));\n }\n }\n }\n\n for (const p of report.problems) {\n const tag = p.level === \"error\" ? pc.red(\"error\") : pc.yellow(\"warn\");\n const loc = p.line != null ? `:${p.line}` : \"\";\n lines.push(`${tag} ${p.file}${loc} ${p.message}`);\n }\n\n if (report.generated.length > 0) {\n lines.push(\"\");\n lines.push(pc.cyan(`Generated ${report.generated.length} check script(s):`));\n for (const g of report.generated) lines.push(` ${g}`);\n }\n\n lines.push(\"\");\n lines.push(pc.bold(\"Suites\"));\n for (const s of report.suites) {\n // A filtered run measured part of the suite, so it has numbers but no\n // verdict. Rendering that as \"below target\" would read as a failure the\n // run never established (ADR 01018).\n const status = s.partial\n ? pc.yellow(\"partial — filtered run, target not evaluated\")\n : s.meetsTarget\n ? pc.green(\"ok\")\n : pc.red(\"below target\");\n const extras: string[] = [];\n if (s.needsReview > 0) extras.push(`${s.needsReview} to review`);\n if (s.skipped > 0) extras.push(`${s.skipped} skipped`);\n const extra = extras.length > 0 ? pc.dim(` (${extras.join(\", \")})`) : \"\";\n lines.push(\n ` ${s.suite}: ${s.passed}/${s.passed + s.failed + s.errored} passed — ` +\n `${(s.passRate * 100).toFixed(0)}% vs target ${(s.targetPassRate * 100).toFixed(0)}% ${status}${extra}`,\n );\n }\n\n // What `--since` scoped the run to. The zero case gets its own line, in\n // yellow, because a clean-tree run is otherwise an indistinguishable green:\n // same exit code, same empty body, nothing saying that nothing ran.\n const sc = scopeLine(report);\n if (sc) {\n lines.push(\"\");\n lines.push(sc.empty ? pc.yellow(sc.text()) : pc.dim(sc.text()));\n }\n\n // The baseline's line in the summary. `removed` is the load-bearing number\n // on a re-record: an accidental --write-baseline over a narrowed glob\n // forgives everything it did not see, and nothing else in a CI log says so.\n const bl = report.baseline;\n if (bl) {\n lines.push(\"\");\n if (bl.written) {\n lines.push(\n pc.dim(\n `Baseline ${bl.path}: recorded ${bl.written.total} finding(s) ` +\n `(+${bl.written.added}, -${bl.written.removed}).`,\n ),\n );\n if (bl.written.removed > 0) {\n lines.push(\n pc.yellow(\n ` ${bl.written.removed} previously recorded finding(s) are no longer in the baseline. ` +\n `If this run covered less of the corpus than the last one, they have just been forgiven.`,\n ),\n );\n }\n } else {\n lines.push(\n pc.dim(\n `Baseline ${bl.path}: ${bl.suppressed} finding(s) suppressed of ${bl.recorded} recorded` +\n (bl.stale > 0 ? `, ${bl.stale} no longer occur` : \"\") +\n \".\",\n ),\n );\n }\n }\n\n if (report.usage.judgedEvals > 0) {\n lines.push(\"\");\n lines.push(\n pc.dim(\n `Judged ${report.usage.judgedEvals} evals (${report.usage.cachedEvals} cached), ` +\n `${report.usage.totalTokens.toLocaleString()} tokens`,\n ),\n );\n }\n\n const reviews = report.evalResults.filter(\n (r) => r.outcome === \"needs-review\",\n );\n if (reviews.length > 0) {\n lines.push(\"\");\n lines.push(\n pc.yellow(\n `${reviews.length} eval(s) need human review — run \\`manni docevals review\\` to record verdicts.`,\n ),\n );\n }\n\n return lines.join(\"\\n\");\n}\n","/** JSON reporter: the full engine report, machine-readable. */\nimport type { EngineReport } from \"../core/engine.js\";\n\nexport function renderJson(report: EngineReport): string {\n return JSON.stringify(report, null, 2);\n}\n","/** Markdown reporter: PR-comment-friendly summary. */\nimport { scopeLine } from \"./scope.js\";\nimport type { EngineReport } from \"../core/engine.js\";\nimport { declaringEntry, locationLabel } from \"./location.js\";\n\nconst OUTCOME_ICON: Record<string, string> = {\n pass: \"✅\",\n fail: \"❌\",\n \"needs-review\": \"🟡\",\n skipped: \"⏭️\",\n error: \"🛑\",\n};\n\nexport function renderMarkdown(report: EngineReport): string {\n const lines: string[] = [\"## manni docevals results\", \"\"];\n\n lines.push(\"| Suite | Passed | Failed | Review | Pass rate | Target | |\");\n lines.push(\"|---|---|---|---|---|---|---|\");\n for (const s of report.suites) {\n lines.push(\n `| ${s.suite} | ${s.passed} | ${s.failed + s.errored} | ${s.needsReview} | ` +\n `${(s.passRate * 100).toFixed(0)}% | ${(s.targetPassRate * 100).toFixed(0)}% | ` +\n // A filtered run measured part of the suite: no verdict, so\n // neither mark. Rendering ❌ made every filtered run look failed\n // (ADR 01018).\n `${s.partial ? \"➖ partial\" : s.meetsTarget ? \"✅\" : \"❌\"} |`,\n );\n }\n\n // What `--since` scoped the run to. This matters most in the CI formats: a\n // clean-tree run is otherwise an empty table nobody can tell apart from a\n // corpus that passed (ADR 01040).\n const sc = scopeLine(report);\n if (sc) {\n const text = sc.text((s) => `\\`${s}\\``);\n lines.push(\"\");\n lines.push(sc.empty ? `> **${text}**` : `_${text}_`);\n }\n\n // The baseline line belongs in the CI formats above all: `removed` is the\n // only signal that an over-narrow re-record just forgave findings, and\n // `renderGithub` delegates its summary here, so omitting it meant the\n // warning existed only in the format CI does not read.\n const bl = report.baseline;\n if (bl) {\n lines.push(\"\");\n if (bl.written) {\n lines.push(\n `_Baseline \\`${bl.path}\\`: recorded ${bl.written.total} finding(s) ` +\n `(+${bl.written.added}, -${bl.written.removed})._`,\n );\n if (bl.written.removed > 0) {\n lines.push(\n \"\",\n `> **${bl.written.removed} previously recorded finding(s) are no longer in the baseline.** ` +\n \"If this run covered less of the corpus than the last one, they have just been forgiven.\",\n );\n }\n } else {\n lines.push(\n `_Baseline \\`${bl.path}\\`: ${bl.suppressed} finding(s) suppressed of ${bl.recorded} recorded` +\n (bl.stale > 0 ? `, ${bl.stale} no longer occur` : \"\") +\n \"._\",\n );\n }\n }\n\n const notable = report.evalResults.filter(\n (r) => r.outcome === \"fail\" || r.outcome === \"error\" || r.outcome === \"needs-review\",\n );\n if (notable.length > 0) {\n lines.push(\"\", \"### Findings\", \"\");\n for (const r of notable) {\n const icon = OUTCOME_ICON[r.outcome] ?? \"\";\n // The page, then the entry that declares the eval. When the page\n // declares it, the one label says both.\n const entry = declaringEntry(r);\n const where =\n entry.file === r.file\n ? `\\`${locationLabel(entry)}\\``\n : `\\`${r.file}\\` · \\`${locationLabel(entry)}\\``;\n lines.push(`- ${icon} **${r.evalName}** — ${where}`);\n for (const f of r.findings ?? []) {\n const loc = f.line != null ? `:${f.line}` : \"\";\n lines.push(` - ${f.severity}${loc}: ${f.message}`);\n }\n if (r.consensus) {\n const v = r.consensus;\n const reasoning = v.runs.find((run) => run.verdict)?.verdict?.reasoning;\n lines.push(\n ` - votes pass:${v.votes.pass} fail:${v.votes.fail} partial:${v.votes.partial}, confidence ${v.meanConfidence.toFixed(2)} (${v.zone})`,\n );\n if (reasoning) lines.push(` - ${reasoning}`);\n }\n if (r.skipReason && r.outcome === \"error\") lines.push(` - ${r.skipReason}`);\n }\n }\n\n for (const p of report.problems) {\n lines.push(`- ⚠️ \\`${p.file}\\`${p.line != null ? `:${p.line}` : \"\"} ${p.message}`);\n }\n\n if (report.generated.length > 0) {\n lines.push(\"\", \"### Generated scripts\", \"\");\n for (const g of report.generated) lines.push(`- \\`${g}\\``);\n }\n\n if (report.usage.judgedEvals > 0) {\n lines.push(\n \"\",\n `_Judged ${report.usage.judgedEvals} evals (${report.usage.cachedEvals} cached), ` +\n `${report.usage.totalTokens.toLocaleString()} tokens._`,\n );\n }\n return lines.join(\"\\n\");\n}\n","/**\n * GitHub Actions reporter: workflow commands for inline PR annotations,\n * followed by the markdown summary (suitable for $GITHUB_STEP_SUMMARY).\n */\nimport { scopeLine } from \"./scope.js\";\nimport type { EngineReport } from \"../core/engine.js\";\nimport {\n escapeWorkflowCommandMessage as escapeData,\n escapeWorkflowCommandProperty as escapeProperty,\n} from \"../../shared/github.js\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { declaringEntry } from \"./location.js\";\n\nexport function renderGithub(report: EngineReport): string {\n const lines: string[] = [];\n for (const r of report.evalResults) {\n const entry = declaringEntry(r);\n const entryProps = [\n `file=${escapeProperty(entry.file)}`,\n entry.line !== undefined ? `line=${String(entry.line)}` : undefined,\n ];\n for (const f of r.findings ?? []) {\n // The family scale is GitHub's annotation levels, word for word.\n const level = f.severity;\n // A finding with a content line keeps it; one without lands on the\n // entry that declares the eval, which is what someone edits instead.\n const props = [\n ...(f.line != null\n ? [`file=${escapeProperty(f.file)}`, `line=${String(f.line)}`]\n : entryProps),\n f.line != null && f.col != null ? `col=${String(f.col)}` : undefined,\n `title=${escapeProperty(`manni docevals: ${f.evalName}`)}`,\n ]\n .filter(Boolean)\n .join(\",\");\n lines.push(`::${level} ${props}::${escapeData(f.message)}`);\n }\n if (r.outcome === \"fail\" && r.consensus) {\n const reasoning =\n r.consensus.runs.find((run) => run.verdict)?.verdict?.reasoning ?? \"\";\n const props = [...entryProps, `title=${escapeProperty(`manni docevals: ${r.evalName}`)}`]\n .filter(Boolean)\n .join(\",\");\n lines.push(\n `::error ${props}::${escapeData(\n `AI judge: fail (confidence ${r.consensus.meanConfidence.toFixed(2)}). ${reasoning}`,\n )}`,\n );\n }\n // An errored eval with no findings has nothing above to say it ran.\n // Left out, it shows only in the summary table, which a collapsed step\n // hides. SARIF reports it the same way; one with findings already did.\n if (r.outcome === \"error\" && (r.findings ?? []).length === 0) {\n const props = [...entryProps, `title=${escapeProperty(`manni docevals: ${r.evalName}`)}`]\n .filter(Boolean)\n .join(\",\");\n lines.push(`::error ${props}::${escapeData(r.skipReason ?? \"eval errored\")}`);\n }\n }\n for (const p of report.problems) {\n const level = p.level === \"error\" ? \"error\" : \"warning\";\n const props = [\n `file=${escapeProperty(p.file)}`,\n p.line != null ? `line=${p.line}` : undefined,\n `title=manni docevals`,\n ]\n .filter(Boolean)\n .join(\",\");\n lines.push(`::${level} ${props}::${escapeData(p.message)}`);\n }\n // The scope, as an annotation rather than only in the step summary: a\n // collapsed log still shows notices, and \"nothing was evaluated\" is the one\n // sentence that distinguishes a scoped clean run from a corpus that passed\n // (ADR 01040).\n const sc = scopeLine(report);\n if (sc) {\n lines.push(`::notice title=manni docevals::${escapeData(sc.text())}`);\n }\n lines.push(\"\", renderMarkdown(report));\n return lines.join(\"\\n\");\n}\n","/**\n * SARIF 2.1.0 reporter.\n *\n * `github` annotates a pull request and nothing else: the annotations live on\n * one check run and scroll away with it. SARIF is what a code-scanning\n * dashboard ingests, so findings become a queryable history — which finding,\n * on which line, first seen when, still open or not.\n *\n * Two details are load-bearing and easy to get wrong:\n *\n * - **URIs are repo-relative and forward-slashed.** An absolute path, or a\n * Windows path with backslashes, uploads successfully and then matches no\n * file, so every finding lands on nothing.\n * - **Every reported rule is declared** in `tool.driver.rules`. A dashboard\n * showing a bare `regex/found` with no name or description is the\n * difference between a finding someone acts on and one they dismiss.\n */\nimport type { EngineReport } from \"../core/engine.js\";\nimport type { EvalResult, Finding, Severity } from \"../types.js\";\nimport { declaringEntry } from \"./location.js\";\n\nconst SARIF_SCHEMA =\n \"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json\";\n\n/** SARIF has three levels; `notice` is `note`, not a dropped finding. */\nfunction levelFor(severity: Severity): \"error\" | \"warning\" | \"note\" {\n switch (severity) {\n case \"error\":\n return \"error\";\n case \"warning\":\n return \"warning\";\n case \"notice\":\n return \"note\";\n }\n}\n\n/** Repo-relative, forward-slashed — what a code-scanning host can resolve. */\nfunction uriFor(file: string): string {\n return file.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\n/**\n * A finding's rule id.\n *\n * `tool:regex` supplies its own (`regex/found`); `command` and\n * the judge do not, so the eval name stands in. Either way a result must carry\n * *some* stable id, or the dashboard groups every finding under one heading.\n */\nfunction ruleIdFor(finding: Finding): string {\n return finding.ruleId ?? finding.evalName;\n}\n\n/**\n * The entry that declares an eval, as a SARIF physical location. SARIF regions\n * are 1-based and `startLine` is required once a region is present, so an\n * entry with no line has no region rather than an invented line 1.\n */\nfunction entryLocation(result: EvalResult): unknown {\n const entry = declaringEntry(result);\n return {\n artifactLocation: { uri: uriFor(entry.file) },\n ...(entry.line !== undefined ? { region: { startLine: entry.line } } : {}),\n };\n}\n\ninterface SarifRule {\n id: string;\n name: string;\n shortDescription: { text: string };\n defaultConfiguration: { level: \"error\" | \"warning\" | \"note\" };\n}\n\nexport function renderSarif(report: EngineReport): string {\n const rules = new Map<string, SarifRule>();\n const results: unknown[] = [];\n\n for (const evalResult of report.evalResults) {\n for (const finding of evalResult.findings ?? []) {\n const id = ruleIdFor(finding);\n const level = levelFor(finding.severity);\n if (!rules.has(id)) {\n rules.set(id, {\n id,\n name: finding.evalName,\n shortDescription: {\n text: `manni docevals eval \"${finding.evalName}\" (${evalResult.grader})`,\n },\n defaultConfiguration: { level },\n });\n }\n results.push({\n ruleId: id,\n level,\n message: { text: finding.message },\n locations: [\n {\n // A finding with a content line keeps it. One without lands on\n // the entry that declares the eval.\n physicalLocation:\n finding.line != null\n ? {\n artifactLocation: { uri: uriFor(finding.file) },\n region: {\n startLine: finding.line,\n ...(finding.col != null ? { startColumn: finding.col } : {}),\n },\n }\n : entryLocation(evalResult),\n },\n ],\n });\n }\n\n // An errored eval has neither findings nor consensus. Leaving it out\n // shows it on the dashboard as never having run, which reads as \"all\n // clear\" at the moment something actually went wrong.\n if (evalResult.outcome === \"error\") {\n const id = evalResult.evalName;\n if (!rules.has(id)) {\n rules.set(id, {\n id,\n name: evalResult.evalName,\n shortDescription: {\n text: `manni docevals eval \"${evalResult.evalName}\" (${evalResult.grader})`,\n },\n defaultConfiguration: { level: \"error\" },\n });\n }\n results.push({\n ruleId: id,\n level: \"error\",\n message: { text: evalResult.skipReason ?? \"eval errored\" },\n locations: [{ physicalLocation: entryLocation(evalResult) }],\n });\n }\n\n // A judged eval produces no `Finding`; without this its failure is absent\n // from the dashboard entirely, which reads as \"the AI evals all passed\".\n if (evalResult.outcome === \"fail\" && evalResult.consensus) {\n const id = evalResult.evalName;\n if (!rules.has(id)) {\n rules.set(id, {\n id,\n name: evalResult.evalName,\n shortDescription: {\n text: `manni docevals eval \"${evalResult.evalName}\" (AI judge)`,\n },\n defaultConfiguration: { level: \"error\" },\n });\n }\n const reasoning =\n evalResult.consensus.runs.find((r) => r.verdict)?.verdict?.reasoning ??\n \"\";\n results.push({\n ruleId: id,\n level: \"error\",\n message: {\n text: `AI judge: fail (confidence ${evalResult.consensus.meanConfidence.toFixed(2)}). ${reasoning}`.trim(),\n },\n locations: [{ physicalLocation: entryLocation(evalResult) }],\n });\n }\n }\n\n const log = {\n $schema: SARIF_SCHEMA,\n version: \"2.1.0\",\n runs: [\n {\n tool: {\n driver: {\n name: \"manni-docevals\",\n informationUri: \"https://hawkeyexl.github.io/manni/docevals/\",\n rules: [...rules.values()],\n },\n },\n results,\n },\n ],\n };\n return `${JSON.stringify(log, null, 2)}\\n`;\n}\n","/**\n * JUnit XML reporter.\n *\n * Every CI system already knows how to render a JUnit report: which checks\n * ran, which failed, how long they took, and — the part that matters for a\n * docs gate — a stable history across builds. Emitting it costs one mapping\n * and buys that for free on Jenkins, GitLab, CircleCI, Buildkite and the rest.\n *\n * The mapping is one testsuite per eval suite, one testcase per (page, eval)\n * pair. `classname` is the page and `name` is the eval, because that is the\n * grouping every JUnit viewer offers: expand a file, see its checks.\n */\nimport type { EngineReport } from \"../core/engine.js\";\nimport type { EvalResult } from \"../types.js\";\nimport { declaringEntry } from \"./location.js\";\n\n/**\n * Control characters XML 1.0 forbids outright: everything below U+0020 except\n * tab, newline and carriage return, plus DEL and the C1 block.\n *\n * Escaping them is not an option — they are illegal in an XML document at all,\n * even as character references — so they are dropped.\n */\nconst FORBIDDEN = /[\u0000-\b\u000b\f\u000e-\u001f-Ÿ]/g;\n\n/**\n * Escape text for XML.\n *\n * All five metacharacters, not the usual three: an unescaped `<` in a finding\n * message makes the whole document invalid, and a CI system handed invalid XML\n * reports \"no tests found\" rather than the failure it was given — the report\n * disappears at exactly the moment it had something to say.\n *\n * Control characters are stripped for the same reason, and they are the likelier\n * route in: a command grader's message is `outputTail(result)`, i.e. raw tool\n * stderr, and most CLI tools colour their stderr. One `\u001b` is enough to\n * make the document unparseable.\n */\nfunction esc(s: string): string {\n return s\n .replace(FORBIDDEN, \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\nfunction attr(name: string, value: string | number): string {\n return `${name}=\"${esc(String(value))}\"`;\n}\n\n/** The message body for a failing eval — findings, or the judge's reasoning. */\nfunction failureText(result: EvalResult): string {\n const findings = (result.findings ?? []).map(\n (f) => `${f.file}${f.line != null ? `:${f.line}` : \"\"} ${f.message}`,\n );\n if (findings.length > 0) return findings.join(\"\\n\");\n if (result.consensus) {\n const reasoning =\n result.consensus.runs.find((r) => r.verdict)?.verdict?.reasoning ?? \"\";\n return `AI judge: fail (confidence ${result.consensus.meanConfidence.toFixed(2)}). ${reasoning}`.trim();\n }\n // An errored eval carries its reason here and nowhere else. Falling back to\n // \"<name> failed\" would put an empty <error> body in front of whoever is\n // trying to find out what went wrong.\n if (result.skipReason) return result.skipReason;\n return `${result.evalName} failed`;\n}\n\nfunction testcase(result: EvalResult): string {\n // `file` and `line` are the entry that declares the eval, the attributes a\n // JUnit viewer that links to source reads.\n const entry = declaringEntry(result);\n const open = ` <testcase ${attr(\"classname\", result.file)} ${attr(\n \"name\",\n result.evalName,\n )} ${attr(\"file\", entry.file)}${\n entry.line === undefined ? \"\" : ` ${attr(\"line\", entry.line)}`\n } ${attr(\"time\", (result.durationMs / 1000).toFixed(3))}`;\n switch (result.outcome) {\n case \"pass\":\n return `${open} />`;\n case \"skipped\":\n return `${open}>\\n <skipped ${attr(\n \"message\",\n result.skipReason ?? \"skipped\",\n )} />\\n </testcase>`;\n case \"error\":\n return `${open}>\\n <error ${attr(\n \"message\",\n `${result.evalName} errored`,\n )}>${esc(failureText(result))}</error>\\n </testcase>`;\n case \"needs-review\":\n // Not a failure and not a pass. JUnit has no third state, and calling it\n // a failure would make a human-review queue look like a broken build.\n return `${open}>\\n <skipped ${attr(\n \"message\",\n \"needs human review\",\n )} />\\n </testcase>`;\n default:\n return `${open}>\\n <failure ${attr(\n \"message\",\n `${result.evalName} failed`,\n )}>${esc(failureText(result))}</failure>\\n </testcase>`;\n }\n}\n\nexport function renderJunit(report: EngineReport): string {\n // The engine stamps each result with its suite, so grouping is a read\n // rather than a reconstruction.\n const bySuite = new Map<string, EvalResult[]>();\n for (const r of report.evalResults) {\n const suite = r.suite ?? \"default\";\n const list = bySuite.get(suite) ?? [];\n list.push(r);\n bySuite.set(suite, list);\n }\n\n const suites = [...bySuite.entries()].map(([name, results]) => {\n const failures = results.filter((r) => r.outcome === \"fail\").length;\n const errors = results.filter((r) => r.outcome === \"error\").length;\n const skipped = results.filter(\n (r) => r.outcome === \"skipped\" || r.outcome === \"needs-review\",\n ).length;\n const time = results.reduce((sum, r) => sum + r.durationMs, 0) / 1000;\n return [\n ` <testsuite ${attr(\"name\", name)} ${attr(\"tests\", results.length)} ${attr(\n \"failures\",\n failures,\n )} ${attr(\"errors\", errors)} ${attr(\"skipped\", skipped)} ${attr(\n \"time\",\n time.toFixed(3),\n )}>`,\n ...results.map(testcase),\n \" </testsuite>\",\n ].join(\"\\n\");\n });\n\n const total = report.evalResults.length;\n const failures = report.evalResults.filter((r) => r.outcome === \"fail\").length;\n const errors = report.evalResults.filter((r) => r.outcome === \"error\").length;\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<testsuites ${attr(\"name\", \"manni-docevals\")} ${attr(\"tests\", total)} ${attr(\n \"failures\",\n failures,\n )} ${attr(\"errors\", errors)}>`,\n ...suites,\n \"</testsuites>\",\n \"\",\n ].join(\"\\n\");\n}\n","/**\n * HTML reporter: one self-contained file a documentation owner can open.\n *\n * Every other format here is machine-facing (JSON, SARIF, JUnit) or\n * terminal-facing (human, markdown, github). The people the content strategy\n * names as corpus and standard owners are neither: they want to see which\n * pages failed, what the judge actually quoted, and whether the suite met its\n * target — and none of them are reading SARIF.\n *\n * Self-contained on purpose: no CDN, no external stylesheet, no fonts. The\n * file is meant to survive being attached to a PR, mailed, or opened from a CI\n * artifact directory, all of which strip or block external requests. It is\n * also why everything is inline rather than clever.\n */\nimport type { EngineReport } from \"../core/engine.js\";\nimport { declaringEntry, locationLabel } from \"./location.js\";\nimport type { EvalResult } from \"../types.js\";\n\nconst OUTCOME_LABEL: Record<string, string> = {\n pass: \"Pass\",\n fail: \"Fail\",\n \"needs-review\": \"Needs review\",\n skipped: \"Skipped\",\n error: \"Error\",\n};\n\n/** Escape for HTML text and quoted attribute values alike. */\nfunction esc(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nconst pct = (n: number): string => `${(n * 100).toFixed(0)}%`;\n\nfunction suiteRows(report: EngineReport): string {\n return report.suites\n .map((s) => {\n // A filtered run measured part of the suite, so it has numbers and no\n // verdict — rendering it as a failure is what ADR 01018 forbids.\n const verdict = s.partial\n ? '<span class=\"v partial\">partial</span>'\n : s.meetsTarget\n ? '<span class=\"v ok\">met</span>'\n : '<span class=\"v bad\">missed</span>';\n const criteria = s.criteria\n ? `${String(s.criteria.passed)}/${String(s.criteria.total)}` +\n (s.criteria.suspended > 0\n ? ` <span class=\"muted\">(${String(s.criteria.suspended)} suspended)</span>`\n : \"\")\n : '<span class=\"muted\">—</span>';\n return `<tr><th>${esc(s.suite)}</th><td>${String(s.passed)}</td><td>${String(\n s.failed + s.errored,\n )}</td><td>${String(s.needsReview)}</td><td>${String(s.skipped)}</td><td>${criteria}</td><td>${pct(\n s.passRate,\n )}</td><td>${pct(s.targetPassRate)}</td><td>${verdict}</td></tr>`;\n })\n .join(\"\\n\");\n}\n\nfunction evalBlock(r: EvalResult): string {\n const bits: string[] = [];\n bits.push(\n `<div class=\"eval ${esc(r.outcome)}\">` +\n `<div class=\"eh\"><span class=\"badge ${esc(r.outcome)}\">${esc(\n OUTCOME_LABEL[r.outcome] ?? r.outcome,\n )}</span> <code>${esc(r.evalName)}</code>` +\n `<span class=\"muted\"> · ${esc(locationLabel(declaringEntry(r)))} · ${esc(r.grader)}${\n r.weight !== undefined && r.weight !== 1\n ? ` · weight ${String(r.weight)}`\n : \"\"\n }</span></div>`,\n );\n\n if (r.skipReason) bits.push(`<p class=\"reason\">${esc(r.skipReason)}</p>`);\n\n // The judge's own words. This is the reason a docs owner opens the report at\n // all — a verdict without the quotation it rests on is not reviewable.\n const verdict = r.consensus?.runs.find((run) => run.verdict)?.verdict;\n if (verdict) {\n bits.push(\n `<p class=\"reason\">${esc(verdict.reasoning)}</p>`,\n verdict.observed\n ? `<blockquote>${esc(verdict.observed)}</blockquote>`\n : \"\",\n `<p class=\"muted\">consensus ${esc(r.consensus?.verdict ?? \"\")} · agreement ${pct(\n r.consensus?.agreement ?? 0,\n )} · confidence ${pct(r.consensus?.meanConfidence ?? 0)} · zone ${esc(\n r.consensus?.zone ?? \"\",\n )}</p>`,\n );\n }\n\n if (r.via === \"human-review\") {\n bits.push('<p class=\"note\">Resolved by a recorded human review.</p>');\n }\n if (r.selfPreference) {\n bits.push(\n `<p class=\"warn\">Judged by <code>${esc(r.selfPreference.model)}</code>, which also ` +\n (r.selfPreference.axis === \"content\"\n ? \"wrote what this eval grades, by the page's provenance or meta-provenance.\"\n : \"proposed this eval, by the page's meta-provenance.\") +\n \" Self-judging favors the author; give the eval a model: of its own.\" +\n \"</p>\",\n );\n }\n for (const f of r.findings ?? []) {\n bits.push(\n `<p class=\"finding\"><span class=\"sev ${esc(f.severity)}\">${esc(f.severity)}</span> ` +\n `${esc(f.message)}${f.line ? ` <span class=\"muted\">(line ${String(f.line)})</span>` : \"\"}</p>`,\n );\n }\n bits.push(\"</div>\");\n return bits.filter(Boolean).join(\"\\n\");\n}\n\nexport function renderHtml(report: EngineReport): string {\n const byFile = new Map<string, EvalResult[]>();\n for (const r of report.evalResults) {\n const list = byFile.get(r.file) ?? [];\n list.push(r);\n byFile.set(r.file, list);\n }\n\n const pages = [...byFile.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([file, results]) => {\n const failed = results.filter(\n (r) => r.outcome === \"fail\" || r.outcome === \"error\",\n ).length;\n return (\n `<section><h3>${esc(file)}` +\n (failed > 0 ? ` <span class=\"badge fail\">${String(failed)}</span>` : \"\") +\n `</h3>${results.map(evalBlock).join(\"\\n\")}</section>`\n );\n })\n .join(\"\\n\");\n\n const problems = report.problems.length\n ? `<h2>Problems</h2><ul class=\"problems\">${report.problems\n .map(\n (p) =>\n `<li class=\"${esc(p.level)}\"><code>${esc(p.file)}</code>${\n p.line ? `:${String(p.line)}` : \"\"\n } — ${esc(p.message)}</li>`,\n )\n .join(\"\")}</ul>`\n : \"\";\n\n const bl = report.baseline;\n const baseline = bl\n ? `<p class=\"note\">Baseline <code>${esc(bl.path)}</code>: ${String(\n bl.recorded,\n )} recorded, ${String(bl.suppressed)} suppressed${\n bl.stale > 0 ? `, ${String(bl.stale)} stale` : \"\"\n }.</p>`\n : \"\";\n\n // A dark-mode block rather than a fixed palette: the file gets opened in\n // whatever the reader already uses, and a white sheet in a dark editor is\n // the kind of small rudeness that stops people opening it twice.\n return `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>manni docevals results</title>\n<style>\n:root{--bg:#fff;--fg:#1a1a1a;--muted:#666;--line:#e2e2e2;--ok:#137333;--bad:#b3261e;--warn:#8a6100;--card:#fafafa}\n@media (prefers-color-scheme:dark){:root{--bg:#16181c;--fg:#e6e6e6;--muted:#9aa0a6;--line:#2c2f36;--ok:#7ee2a8;--bad:#ff8a80;--warn:#ffca7a;--card:#1d2026}}\n*{box-sizing:border-box}\nbody{margin:0;padding:2rem 1.25rem;background:var(--bg);color:var(--fg);\nfont:15px/1.55 ui-sans-serif,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}\nmain{max-width:60rem;margin:0 auto}\nh1{font-size:1.5rem;margin:0 0 .25rem}\nh2{font-size:1.1rem;margin:2rem 0 .5rem;padding-bottom:.25rem;border-bottom:1px solid var(--line)}\nh3{font-size:.95rem;margin:1.5rem 0 .5rem;font-family:ui-monospace,SFMono-Regular,Consolas,monospace}\ntable{border-collapse:collapse;width:100%;font-size:.9rem}\nth,td{text-align:left;padding:.4rem .6rem;border-bottom:1px solid var(--line)}\nthead th{color:var(--muted);font-weight:600}\ncode{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:.9em}\n.muted{color:var(--muted)}\n.eval{border:1px solid var(--line);border-left-width:3px;border-radius:6px;background:var(--card);padding:.6rem .8rem;margin:.4rem 0}\n.eval.fail,.eval.error{border-left-color:var(--bad)}\n.eval.pass{border-left-color:var(--ok)}\n.eval.needs-review{border-left-color:var(--warn)}\n.badge{display:inline-block;padding:.05rem .4rem;border-radius:4px;font-size:.75rem;font-weight:600;border:1px solid var(--line)}\n.badge.pass{color:var(--ok)}.badge.fail,.badge.error{color:var(--bad)}\nblockquote{margin:.4rem 0;padding:.3rem .7rem;border-left:2px solid var(--line);color:var(--muted)}\n.reason{margin:.3rem 0}\n.warn{color:var(--warn);margin:.3rem 0}\n.note{color:var(--muted);margin:.3rem 0}\n.finding{margin:.2rem 0}\n.sev{font-size:.75rem;text-transform:uppercase;font-weight:600;margin-right:.35rem}\n.sev.error{color:var(--bad)}.sev.warning{color:var(--warn)}.sev.notice{color:var(--muted)}\n.v.ok{color:var(--ok)}.v.bad{color:var(--bad)}.v.partial{color:var(--muted)}\n.problems li.error{color:var(--bad)}.problems li.warning{color:var(--warn)}\n</style></head><body><main>\n<h1>manni docevals results</h1>\n<p class=\"muted\">${String(report.pages)} page(s) · ${String(\n report.evalResults.length,\n )} eval(s) · exit ${String(report.exitCode)}</p>\n${baseline}\n<h2>Suites</h2>\n<table><thead><tr><th>Suite</th><th>Pass</th><th>Fail</th><th>Review</th><th>Skip</th><th>Criteria</th><th>Rate</th><th>Target</th><th></th></tr></thead>\n<tbody>\n${suiteRows(report)}\n</tbody></table>\n${problems}\n<h2>Pages</h2>\n${pages}\n</main></body></html>\n`;\n}\n","/** Reporter dispatch. */\nimport type { EngineReport } from \"../core/engine.js\";\nimport { renderPretty, type ColorOptions } from \"./pretty.js\";\nimport { renderJson } from \"./json.js\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { renderGithub } from \"./github.js\";\nimport { parseFormat, REPORT_FORMATS, type ReportFormat } from \"./format.js\";\nimport { renderSarif } from \"./sarif.js\";\nimport { renderJunit } from \"./junit.js\";\nimport { renderHtml } from \"./html.js\";\n\nexport type { ColorOptions } from \"./pretty.js\";\nexport {\n REPORT_FORMATS,\n SUMMARY_FORMATS,\n parseFormat,\n type ReportFormat,\n type SummaryFormat,\n} from \"./format.js\";\n\n/**\n * `opts.color` reaches the pretty reporter alone. Every other format is read\n * by a machine or a browser, so it never carries terminal escapes.\n */\nexport function render(\n report: EngineReport,\n format: ReportFormat,\n opts: ColorOptions = {},\n): string {\n // Same entry guard as renderList/renderFill, and for the same reason: this is\n // exported from src/index.ts, so library callers arrive with no CLI parser in\n // front. Before this, an unknown format fell off the switch and returned\n // `undefined` — which the CLI then printed.\n //\n // Routed through parseFormat rather than a `default:` branch so all three\n // render entry points emit one message built in one place. A hand-written\n // message here drifts from parseFormat's the first time either is reworded.\n parseFormat(format, REPORT_FORMATS, \"format\");\n switch (format) {\n case \"pretty\":\n return renderPretty(report, opts);\n case \"json\":\n return renderJson(report);\n case \"markdown\":\n return renderMarkdown(report);\n case \"sarif\":\n return renderSarif(report);\n case \"junit\":\n return renderJunit(report);\n case \"github\":\n return renderGithub(report);\n case \"html\":\n return renderHtml(report);\n }\n}\n"],"mappings":"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","names":["failures","errors","esc"]}