@dotsetlabs/bellwether 0.10.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 (403) hide show
  1. package/CHANGELOG.md +291 -0
  2. package/LICENSE +21 -0
  3. package/README.md +739 -0
  4. package/dist/auth/credentials.d.ts +64 -0
  5. package/dist/auth/credentials.js +218 -0
  6. package/dist/auth/index.d.ts +6 -0
  7. package/dist/auth/index.js +6 -0
  8. package/dist/auth/keychain.d.ts +64 -0
  9. package/dist/auth/keychain.js +268 -0
  10. package/dist/baseline/ab-testing.d.ts +80 -0
  11. package/dist/baseline/ab-testing.js +236 -0
  12. package/dist/baseline/ai-compatibility-scorer.d.ts +95 -0
  13. package/dist/baseline/ai-compatibility-scorer.js +606 -0
  14. package/dist/baseline/calibration.d.ts +77 -0
  15. package/dist/baseline/calibration.js +136 -0
  16. package/dist/baseline/category-matching.d.ts +85 -0
  17. package/dist/baseline/category-matching.js +289 -0
  18. package/dist/baseline/change-impact-analyzer.d.ts +98 -0
  19. package/dist/baseline/change-impact-analyzer.js +592 -0
  20. package/dist/baseline/comparator.d.ts +64 -0
  21. package/dist/baseline/comparator.js +916 -0
  22. package/dist/baseline/confidence.d.ts +55 -0
  23. package/dist/baseline/confidence.js +122 -0
  24. package/dist/baseline/converter.d.ts +61 -0
  25. package/dist/baseline/converter.js +585 -0
  26. package/dist/baseline/dependency-analyzer.d.ts +89 -0
  27. package/dist/baseline/dependency-analyzer.js +567 -0
  28. package/dist/baseline/deprecation-tracker.d.ts +133 -0
  29. package/dist/baseline/deprecation-tracker.js +322 -0
  30. package/dist/baseline/diff.d.ts +55 -0
  31. package/dist/baseline/diff.js +1584 -0
  32. package/dist/baseline/documentation-scorer.d.ts +205 -0
  33. package/dist/baseline/documentation-scorer.js +466 -0
  34. package/dist/baseline/embeddings.d.ts +118 -0
  35. package/dist/baseline/embeddings.js +251 -0
  36. package/dist/baseline/error-analyzer.d.ts +198 -0
  37. package/dist/baseline/error-analyzer.js +721 -0
  38. package/dist/baseline/evaluation/evaluator.d.ts +42 -0
  39. package/dist/baseline/evaluation/evaluator.js +323 -0
  40. package/dist/baseline/evaluation/expanded-dataset.d.ts +45 -0
  41. package/dist/baseline/evaluation/expanded-dataset.js +1164 -0
  42. package/dist/baseline/evaluation/golden-dataset.d.ts +58 -0
  43. package/dist/baseline/evaluation/golden-dataset.js +717 -0
  44. package/dist/baseline/evaluation/index.d.ts +15 -0
  45. package/dist/baseline/evaluation/index.js +15 -0
  46. package/dist/baseline/evaluation/types.d.ts +186 -0
  47. package/dist/baseline/evaluation/types.js +8 -0
  48. package/dist/baseline/external-dependency-detector.d.ts +181 -0
  49. package/dist/baseline/external-dependency-detector.js +524 -0
  50. package/dist/baseline/golden-output.d.ts +162 -0
  51. package/dist/baseline/golden-output.js +636 -0
  52. package/dist/baseline/health-scorer.d.ts +174 -0
  53. package/dist/baseline/health-scorer.js +451 -0
  54. package/dist/baseline/incremental-checker.d.ts +97 -0
  55. package/dist/baseline/incremental-checker.js +174 -0
  56. package/dist/baseline/index.d.ts +31 -0
  57. package/dist/baseline/index.js +42 -0
  58. package/dist/baseline/migration-generator.d.ts +137 -0
  59. package/dist/baseline/migration-generator.js +554 -0
  60. package/dist/baseline/migrations.d.ts +60 -0
  61. package/dist/baseline/migrations.js +197 -0
  62. package/dist/baseline/performance-tracker.d.ts +214 -0
  63. package/dist/baseline/performance-tracker.js +577 -0
  64. package/dist/baseline/pr-comment-generator.d.ts +117 -0
  65. package/dist/baseline/pr-comment-generator.js +546 -0
  66. package/dist/baseline/response-fingerprint.d.ts +127 -0
  67. package/dist/baseline/response-fingerprint.js +728 -0
  68. package/dist/baseline/response-schema-tracker.d.ts +129 -0
  69. package/dist/baseline/response-schema-tracker.js +420 -0
  70. package/dist/baseline/risk-scorer.d.ts +54 -0
  71. package/dist/baseline/risk-scorer.js +434 -0
  72. package/dist/baseline/saver.d.ts +89 -0
  73. package/dist/baseline/saver.js +554 -0
  74. package/dist/baseline/scenario-generator.d.ts +151 -0
  75. package/dist/baseline/scenario-generator.js +905 -0
  76. package/dist/baseline/schema-compare.d.ts +86 -0
  77. package/dist/baseline/schema-compare.js +557 -0
  78. package/dist/baseline/schema-evolution.d.ts +189 -0
  79. package/dist/baseline/schema-evolution.js +467 -0
  80. package/dist/baseline/semantic.d.ts +203 -0
  81. package/dist/baseline/semantic.js +908 -0
  82. package/dist/baseline/synonyms.d.ts +60 -0
  83. package/dist/baseline/synonyms.js +386 -0
  84. package/dist/baseline/telemetry.d.ts +165 -0
  85. package/dist/baseline/telemetry.js +294 -0
  86. package/dist/baseline/test-pruner.d.ts +120 -0
  87. package/dist/baseline/test-pruner.js +387 -0
  88. package/dist/baseline/types.d.ts +449 -0
  89. package/dist/baseline/types.js +5 -0
  90. package/dist/baseline/version.d.ts +138 -0
  91. package/dist/baseline/version.js +206 -0
  92. package/dist/cache/index.d.ts +5 -0
  93. package/dist/cache/index.js +5 -0
  94. package/dist/cache/response-cache.d.ts +151 -0
  95. package/dist/cache/response-cache.js +287 -0
  96. package/dist/ci/index.d.ts +60 -0
  97. package/dist/ci/index.js +342 -0
  98. package/dist/cli/commands/auth.d.ts +12 -0
  99. package/dist/cli/commands/auth.js +352 -0
  100. package/dist/cli/commands/badge.d.ts +3 -0
  101. package/dist/cli/commands/badge.js +74 -0
  102. package/dist/cli/commands/baseline-accept.d.ts +15 -0
  103. package/dist/cli/commands/baseline-accept.js +178 -0
  104. package/dist/cli/commands/baseline-migrate.d.ts +12 -0
  105. package/dist/cli/commands/baseline-migrate.js +164 -0
  106. package/dist/cli/commands/baseline.d.ts +14 -0
  107. package/dist/cli/commands/baseline.js +449 -0
  108. package/dist/cli/commands/beta.d.ts +10 -0
  109. package/dist/cli/commands/beta.js +231 -0
  110. package/dist/cli/commands/check.d.ts +11 -0
  111. package/dist/cli/commands/check.js +820 -0
  112. package/dist/cli/commands/cloud/badge.d.ts +3 -0
  113. package/dist/cli/commands/cloud/badge.js +74 -0
  114. package/dist/cli/commands/cloud/diff.d.ts +6 -0
  115. package/dist/cli/commands/cloud/diff.js +79 -0
  116. package/dist/cli/commands/cloud/history.d.ts +6 -0
  117. package/dist/cli/commands/cloud/history.js +102 -0
  118. package/dist/cli/commands/cloud/link.d.ts +9 -0
  119. package/dist/cli/commands/cloud/link.js +119 -0
  120. package/dist/cli/commands/cloud/login.d.ts +7 -0
  121. package/dist/cli/commands/cloud/login.js +499 -0
  122. package/dist/cli/commands/cloud/projects.d.ts +6 -0
  123. package/dist/cli/commands/cloud/projects.js +44 -0
  124. package/dist/cli/commands/cloud/shared.d.ts +7 -0
  125. package/dist/cli/commands/cloud/shared.js +42 -0
  126. package/dist/cli/commands/cloud/teams.d.ts +8 -0
  127. package/dist/cli/commands/cloud/teams.js +169 -0
  128. package/dist/cli/commands/cloud/upload.d.ts +8 -0
  129. package/dist/cli/commands/cloud/upload.js +181 -0
  130. package/dist/cli/commands/contract.d.ts +11 -0
  131. package/dist/cli/commands/contract.js +280 -0
  132. package/dist/cli/commands/discover.d.ts +3 -0
  133. package/dist/cli/commands/discover.js +82 -0
  134. package/dist/cli/commands/eval.d.ts +9 -0
  135. package/dist/cli/commands/eval.js +187 -0
  136. package/dist/cli/commands/explore.d.ts +11 -0
  137. package/dist/cli/commands/explore.js +437 -0
  138. package/dist/cli/commands/feedback.d.ts +9 -0
  139. package/dist/cli/commands/feedback.js +174 -0
  140. package/dist/cli/commands/golden.d.ts +12 -0
  141. package/dist/cli/commands/golden.js +407 -0
  142. package/dist/cli/commands/history.d.ts +10 -0
  143. package/dist/cli/commands/history.js +202 -0
  144. package/dist/cli/commands/init.d.ts +9 -0
  145. package/dist/cli/commands/init.js +219 -0
  146. package/dist/cli/commands/interview.d.ts +3 -0
  147. package/dist/cli/commands/interview.js +903 -0
  148. package/dist/cli/commands/link.d.ts +10 -0
  149. package/dist/cli/commands/link.js +169 -0
  150. package/dist/cli/commands/login.d.ts +7 -0
  151. package/dist/cli/commands/login.js +499 -0
  152. package/dist/cli/commands/preset.d.ts +33 -0
  153. package/dist/cli/commands/preset.js +297 -0
  154. package/dist/cli/commands/profile.d.ts +33 -0
  155. package/dist/cli/commands/profile.js +286 -0
  156. package/dist/cli/commands/registry.d.ts +11 -0
  157. package/dist/cli/commands/registry.js +146 -0
  158. package/dist/cli/commands/shared.d.ts +79 -0
  159. package/dist/cli/commands/shared.js +196 -0
  160. package/dist/cli/commands/teams.d.ts +8 -0
  161. package/dist/cli/commands/teams.js +169 -0
  162. package/dist/cli/commands/test.d.ts +9 -0
  163. package/dist/cli/commands/test.js +500 -0
  164. package/dist/cli/commands/upload.d.ts +8 -0
  165. package/dist/cli/commands/upload.js +223 -0
  166. package/dist/cli/commands/validate-config.d.ts +6 -0
  167. package/dist/cli/commands/validate-config.js +35 -0
  168. package/dist/cli/commands/verify.d.ts +11 -0
  169. package/dist/cli/commands/verify.js +283 -0
  170. package/dist/cli/commands/watch.d.ts +12 -0
  171. package/dist/cli/commands/watch.js +253 -0
  172. package/dist/cli/index.d.ts +3 -0
  173. package/dist/cli/index.js +178 -0
  174. package/dist/cli/interactive.d.ts +47 -0
  175. package/dist/cli/interactive.js +216 -0
  176. package/dist/cli/output/terminal-reporter.d.ts +19 -0
  177. package/dist/cli/output/terminal-reporter.js +104 -0
  178. package/dist/cli/output.d.ts +226 -0
  179. package/dist/cli/output.js +438 -0
  180. package/dist/cli/utils/env.d.ts +5 -0
  181. package/dist/cli/utils/env.js +14 -0
  182. package/dist/cli/utils/progress.d.ts +59 -0
  183. package/dist/cli/utils/progress.js +206 -0
  184. package/dist/cli/utils/server-context.d.ts +10 -0
  185. package/dist/cli/utils/server-context.js +36 -0
  186. package/dist/cloud/auth.d.ts +144 -0
  187. package/dist/cloud/auth.js +374 -0
  188. package/dist/cloud/client.d.ts +24 -0
  189. package/dist/cloud/client.js +65 -0
  190. package/dist/cloud/http-client.d.ts +38 -0
  191. package/dist/cloud/http-client.js +215 -0
  192. package/dist/cloud/index.d.ts +23 -0
  193. package/dist/cloud/index.js +25 -0
  194. package/dist/cloud/mock-client.d.ts +107 -0
  195. package/dist/cloud/mock-client.js +545 -0
  196. package/dist/cloud/types.d.ts +515 -0
  197. package/dist/cloud/types.js +15 -0
  198. package/dist/config/defaults.d.ts +160 -0
  199. package/dist/config/defaults.js +169 -0
  200. package/dist/config/loader.d.ts +24 -0
  201. package/dist/config/loader.js +122 -0
  202. package/dist/config/template.d.ts +42 -0
  203. package/dist/config/template.js +647 -0
  204. package/dist/config/validator.d.ts +2112 -0
  205. package/dist/config/validator.js +658 -0
  206. package/dist/constants/cloud.d.ts +107 -0
  207. package/dist/constants/cloud.js +110 -0
  208. package/dist/constants/core.d.ts +521 -0
  209. package/dist/constants/core.js +556 -0
  210. package/dist/constants/testing.d.ts +1283 -0
  211. package/dist/constants/testing.js +1568 -0
  212. package/dist/constants.d.ts +10 -0
  213. package/dist/constants.js +10 -0
  214. package/dist/contract/index.d.ts +6 -0
  215. package/dist/contract/index.js +5 -0
  216. package/dist/contract/validator.d.ts +177 -0
  217. package/dist/contract/validator.js +574 -0
  218. package/dist/cost/index.d.ts +6 -0
  219. package/dist/cost/index.js +5 -0
  220. package/dist/cost/tracker.d.ts +134 -0
  221. package/dist/cost/tracker.js +313 -0
  222. package/dist/discovery/discovery.d.ts +16 -0
  223. package/dist/discovery/discovery.js +173 -0
  224. package/dist/discovery/types.d.ts +51 -0
  225. package/dist/discovery/types.js +2 -0
  226. package/dist/docs/agents.d.ts +3 -0
  227. package/dist/docs/agents.js +995 -0
  228. package/dist/docs/contract.d.ts +51 -0
  229. package/dist/docs/contract.js +1681 -0
  230. package/dist/docs/generator.d.ts +4 -0
  231. package/dist/docs/generator.js +4 -0
  232. package/dist/docs/html-reporter.d.ts +9 -0
  233. package/dist/docs/html-reporter.js +757 -0
  234. package/dist/docs/index.d.ts +10 -0
  235. package/dist/docs/index.js +11 -0
  236. package/dist/docs/junit-reporter.d.ts +18 -0
  237. package/dist/docs/junit-reporter.js +210 -0
  238. package/dist/docs/report.d.ts +14 -0
  239. package/dist/docs/report.js +44 -0
  240. package/dist/docs/sarif-reporter.d.ts +19 -0
  241. package/dist/docs/sarif-reporter.js +335 -0
  242. package/dist/docs/shared.d.ts +35 -0
  243. package/dist/docs/shared.js +162 -0
  244. package/dist/docs/templates.d.ts +12 -0
  245. package/dist/docs/templates.js +76 -0
  246. package/dist/errors/index.d.ts +6 -0
  247. package/dist/errors/index.js +6 -0
  248. package/dist/errors/retry.d.ts +92 -0
  249. package/dist/errors/retry.js +323 -0
  250. package/dist/errors/types.d.ts +321 -0
  251. package/dist/errors/types.js +584 -0
  252. package/dist/index.d.ts +32 -0
  253. package/dist/index.js +32 -0
  254. package/dist/interview/dependency-resolver.d.ts +11 -0
  255. package/dist/interview/dependency-resolver.js +32 -0
  256. package/dist/interview/interviewer.d.ts +232 -0
  257. package/dist/interview/interviewer.js +1939 -0
  258. package/dist/interview/mock-response-generator.d.ts +7 -0
  259. package/dist/interview/mock-response-generator.js +102 -0
  260. package/dist/interview/orchestrator.d.ts +237 -0
  261. package/dist/interview/orchestrator.js +1296 -0
  262. package/dist/interview/rate-limiter.d.ts +15 -0
  263. package/dist/interview/rate-limiter.js +55 -0
  264. package/dist/interview/response-validator.d.ts +10 -0
  265. package/dist/interview/response-validator.js +132 -0
  266. package/dist/interview/schema-inferrer.d.ts +8 -0
  267. package/dist/interview/schema-inferrer.js +71 -0
  268. package/dist/interview/schema-test-generator.d.ts +71 -0
  269. package/dist/interview/schema-test-generator.js +834 -0
  270. package/dist/interview/smart-value-generator.d.ts +155 -0
  271. package/dist/interview/smart-value-generator.js +554 -0
  272. package/dist/interview/stateful-test-runner.d.ts +19 -0
  273. package/dist/interview/stateful-test-runner.js +106 -0
  274. package/dist/interview/types.d.ts +561 -0
  275. package/dist/interview/types.js +2 -0
  276. package/dist/llm/anthropic.d.ts +41 -0
  277. package/dist/llm/anthropic.js +355 -0
  278. package/dist/llm/client.d.ts +123 -0
  279. package/dist/llm/client.js +42 -0
  280. package/dist/llm/factory.d.ts +38 -0
  281. package/dist/llm/factory.js +145 -0
  282. package/dist/llm/fallback.d.ts +140 -0
  283. package/dist/llm/fallback.js +379 -0
  284. package/dist/llm/index.d.ts +18 -0
  285. package/dist/llm/index.js +15 -0
  286. package/dist/llm/ollama.d.ts +37 -0
  287. package/dist/llm/ollama.js +330 -0
  288. package/dist/llm/openai.d.ts +25 -0
  289. package/dist/llm/openai.js +320 -0
  290. package/dist/llm/token-budget.d.ts +161 -0
  291. package/dist/llm/token-budget.js +395 -0
  292. package/dist/logging/logger.d.ts +70 -0
  293. package/dist/logging/logger.js +130 -0
  294. package/dist/metrics/collector.d.ts +106 -0
  295. package/dist/metrics/collector.js +547 -0
  296. package/dist/metrics/index.d.ts +7 -0
  297. package/dist/metrics/index.js +7 -0
  298. package/dist/metrics/prometheus.d.ts +20 -0
  299. package/dist/metrics/prometheus.js +241 -0
  300. package/dist/metrics/types.d.ts +209 -0
  301. package/dist/metrics/types.js +5 -0
  302. package/dist/persona/builtins.d.ts +54 -0
  303. package/dist/persona/builtins.js +219 -0
  304. package/dist/persona/index.d.ts +8 -0
  305. package/dist/persona/index.js +8 -0
  306. package/dist/persona/loader.d.ts +30 -0
  307. package/dist/persona/loader.js +190 -0
  308. package/dist/persona/types.d.ts +144 -0
  309. package/dist/persona/types.js +5 -0
  310. package/dist/persona/validation.d.ts +94 -0
  311. package/dist/persona/validation.js +332 -0
  312. package/dist/prompts/index.d.ts +5 -0
  313. package/dist/prompts/index.js +5 -0
  314. package/dist/prompts/templates.d.ts +180 -0
  315. package/dist/prompts/templates.js +431 -0
  316. package/dist/registry/client.d.ts +49 -0
  317. package/dist/registry/client.js +191 -0
  318. package/dist/registry/index.d.ts +7 -0
  319. package/dist/registry/index.js +6 -0
  320. package/dist/registry/types.d.ts +140 -0
  321. package/dist/registry/types.js +6 -0
  322. package/dist/scenarios/evaluator.d.ts +43 -0
  323. package/dist/scenarios/evaluator.js +206 -0
  324. package/dist/scenarios/index.d.ts +10 -0
  325. package/dist/scenarios/index.js +9 -0
  326. package/dist/scenarios/loader.d.ts +20 -0
  327. package/dist/scenarios/loader.js +285 -0
  328. package/dist/scenarios/types.d.ts +153 -0
  329. package/dist/scenarios/types.js +8 -0
  330. package/dist/security/index.d.ts +17 -0
  331. package/dist/security/index.js +18 -0
  332. package/dist/security/payloads.d.ts +61 -0
  333. package/dist/security/payloads.js +268 -0
  334. package/dist/security/security-tester.d.ts +42 -0
  335. package/dist/security/security-tester.js +582 -0
  336. package/dist/security/types.d.ts +166 -0
  337. package/dist/security/types.js +8 -0
  338. package/dist/transport/base-transport.d.ts +59 -0
  339. package/dist/transport/base-transport.js +38 -0
  340. package/dist/transport/http-transport.d.ts +67 -0
  341. package/dist/transport/http-transport.js +238 -0
  342. package/dist/transport/mcp-client.d.ts +141 -0
  343. package/dist/transport/mcp-client.js +496 -0
  344. package/dist/transport/sse-transport.d.ts +88 -0
  345. package/dist/transport/sse-transport.js +316 -0
  346. package/dist/transport/stdio-transport.d.ts +43 -0
  347. package/dist/transport/stdio-transport.js +238 -0
  348. package/dist/transport/types.d.ts +125 -0
  349. package/dist/transport/types.js +16 -0
  350. package/dist/utils/concurrency.d.ts +123 -0
  351. package/dist/utils/concurrency.js +213 -0
  352. package/dist/utils/formatters.d.ts +16 -0
  353. package/dist/utils/formatters.js +37 -0
  354. package/dist/utils/index.d.ts +8 -0
  355. package/dist/utils/index.js +8 -0
  356. package/dist/utils/jsonpath.d.ts +87 -0
  357. package/dist/utils/jsonpath.js +326 -0
  358. package/dist/utils/markdown.d.ts +113 -0
  359. package/dist/utils/markdown.js +265 -0
  360. package/dist/utils/network.d.ts +14 -0
  361. package/dist/utils/network.js +17 -0
  362. package/dist/utils/sanitize.d.ts +92 -0
  363. package/dist/utils/sanitize.js +191 -0
  364. package/dist/utils/semantic.d.ts +194 -0
  365. package/dist/utils/semantic.js +1051 -0
  366. package/dist/utils/smart-truncate.d.ts +94 -0
  367. package/dist/utils/smart-truncate.js +361 -0
  368. package/dist/utils/timeout.d.ts +153 -0
  369. package/dist/utils/timeout.js +205 -0
  370. package/dist/utils/yaml-parser.d.ts +58 -0
  371. package/dist/utils/yaml-parser.js +86 -0
  372. package/dist/validation/index.d.ts +32 -0
  373. package/dist/validation/index.js +32 -0
  374. package/dist/validation/semantic-test-generator.d.ts +50 -0
  375. package/dist/validation/semantic-test-generator.js +176 -0
  376. package/dist/validation/semantic-types.d.ts +66 -0
  377. package/dist/validation/semantic-types.js +94 -0
  378. package/dist/validation/semantic-validator.d.ts +38 -0
  379. package/dist/validation/semantic-validator.js +340 -0
  380. package/dist/verification/index.d.ts +6 -0
  381. package/dist/verification/index.js +5 -0
  382. package/dist/verification/types.d.ts +133 -0
  383. package/dist/verification/types.js +5 -0
  384. package/dist/verification/verifier.d.ts +30 -0
  385. package/dist/verification/verifier.js +309 -0
  386. package/dist/version.d.ts +19 -0
  387. package/dist/version.js +48 -0
  388. package/dist/workflow/auto-generator.d.ts +27 -0
  389. package/dist/workflow/auto-generator.js +513 -0
  390. package/dist/workflow/discovery.d.ts +40 -0
  391. package/dist/workflow/discovery.js +195 -0
  392. package/dist/workflow/executor.d.ts +82 -0
  393. package/dist/workflow/executor.js +611 -0
  394. package/dist/workflow/index.d.ts +10 -0
  395. package/dist/workflow/index.js +10 -0
  396. package/dist/workflow/loader.d.ts +24 -0
  397. package/dist/workflow/loader.js +194 -0
  398. package/dist/workflow/state-tracker.d.ts +98 -0
  399. package/dist/workflow/state-tracker.js +424 -0
  400. package/dist/workflow/types.d.ts +337 -0
  401. package/dist/workflow/types.js +5 -0
  402. package/package.json +94 -0
  403. package/schemas/bellwether-check.schema.json +651 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Documentation and reporting module.
3
+ *
4
+ * Supported output formats:
5
+ * - CONTRACT.md: Check command output (schema-focused)
6
+ * - AGENTS.md: Explore command output (behavior-focused, LLM-powered)
7
+ * - JSON: Machine-readable interview results
8
+ */
9
+ export { generateAgentsMd, generateContractMd, generateJsonReport } from './generator.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Documentation and reporting module.
3
+ *
4
+ * Supported output formats:
5
+ * - CONTRACT.md: Check command output (schema-focused)
6
+ * - AGENTS.md: Explore command output (behavior-focused, LLM-powered)
7
+ * - JSON: Machine-readable interview results
8
+ */
9
+ // Main generators
10
+ export { generateAgentsMd, generateContractMd, generateJsonReport } from './generator.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * JUnit XML reporter for test runner integration.
3
+ */
4
+ import type { InterviewResult } from '../interview/types.js';
5
+ import type { BehavioralDiff } from '../baseline/types.js';
6
+ /**
7
+ * Generate JUnit XML report from interview results.
8
+ *
9
+ * Each tool becomes a test suite, and each interaction becomes a test case.
10
+ */
11
+ export declare function generateJunitReport(result: InterviewResult): string;
12
+ /**
13
+ * Generate JUnit XML report from behavioral diff.
14
+ *
15
+ * Treats drift detection as a test suite.
16
+ */
17
+ export declare function generateJunitFromDiff(diff: BehavioralDiff): string;
18
+ //# sourceMappingURL=junit-reporter.d.ts.map
@@ -0,0 +1,210 @@
1
+ /**
2
+ * JUnit XML reporter for test runner integration.
3
+ */
4
+ /**
5
+ * Escape special XML characters.
6
+ */
7
+ function escapeXml(str) {
8
+ return str
9
+ .replace(/&/g, '&')
10
+ .replace(/</g, '&lt;')
11
+ .replace(/>/g, '&gt;')
12
+ .replace(/"/g, '&quot;')
13
+ .replace(/'/g, '&apos;');
14
+ }
15
+ /**
16
+ * Generate JUnit XML report from interview results.
17
+ *
18
+ * Each tool becomes a test suite, and each interaction becomes a test case.
19
+ */
20
+ export function generateJunitReport(result) {
21
+ const lines = [];
22
+ lines.push('<?xml version="1.0" encoding="UTF-8"?>');
23
+ // Calculate totals
24
+ const totalTests = result.toolProfiles.reduce((sum, p) => sum + p.interactions.length, 0);
25
+ const failures = result.toolProfiles.reduce((sum, p) => sum + p.interactions.filter((i) => i.error).length, 0);
26
+ const durationSeconds = result.metadata.durationMs / 1000;
27
+ lines.push(`<testsuites name="${escapeXml(result.discovery.serverInfo.name)}" ` +
28
+ `tests="${totalTests}" failures="${failures}" errors="0" ` +
29
+ `time="${durationSeconds.toFixed(3)}">`);
30
+ // Each tool is a test suite
31
+ for (const profile of result.toolProfiles) {
32
+ lines.push(generateToolSuite(profile));
33
+ }
34
+ // Add workflow test suites if present
35
+ if (result.workflowResults && result.workflowResults.length > 0) {
36
+ lines.push(generateWorkflowSuites(result));
37
+ }
38
+ lines.push('</testsuites>');
39
+ return lines.join('\n');
40
+ }
41
+ /**
42
+ * Generate a test suite for a single tool.
43
+ */
44
+ function generateToolSuite(profile) {
45
+ const lines = [];
46
+ const tests = profile.interactions.length;
47
+ const failures = profile.interactions.filter((i) => i.error).length;
48
+ const duration = profile.interactions.reduce((sum, i) => sum + i.durationMs, 0) / 1000;
49
+ lines.push(` <testsuite name="${escapeXml(profile.name)}" ` +
50
+ `tests="${tests}" failures="${failures}" errors="0" ` +
51
+ `time="${duration.toFixed(3)}" ` +
52
+ `timestamp="${new Date().toISOString()}">`);
53
+ // Tool description as property
54
+ lines.push(' <properties>');
55
+ lines.push(` <property name="description" value="${escapeXml(profile.description)}"/>`);
56
+ lines.push(' </properties>');
57
+ // Each interaction is a test case
58
+ for (const interaction of profile.interactions) {
59
+ lines.push(generateTestCase(profile.name, interaction));
60
+ }
61
+ // Add behavioral note test cases (pass by default)
62
+ for (let i = 0; i < profile.behavioralNotes.length; i++) {
63
+ lines.push(` <testcase name="behavioral_note_${i + 1}" classname="${escapeXml(profile.name)}" time="0">`);
64
+ lines.push(` <system-out>${escapeXml(profile.behavioralNotes[i])}</system-out>`);
65
+ lines.push(' </testcase>');
66
+ }
67
+ // Add security notes as warnings
68
+ for (let i = 0; i < profile.securityNotes.length; i++) {
69
+ lines.push(` <testcase name="security_note_${i + 1}" classname="${escapeXml(profile.name)}" time="0">`);
70
+ lines.push(` <system-err>Security consideration: ${escapeXml(profile.securityNotes[i])}</system-err>`);
71
+ lines.push(' </testcase>');
72
+ }
73
+ lines.push(' </testsuite>');
74
+ return lines.join('\n');
75
+ }
76
+ /**
77
+ * Generate a test case for a single interaction.
78
+ */
79
+ function generateTestCase(toolName, interaction) {
80
+ const lines = [];
81
+ const duration = interaction.durationMs / 1000;
82
+ const testName = escapeXml(interaction.question.description);
83
+ const className = escapeXml(toolName);
84
+ lines.push(` <testcase name="${testName}" classname="${className}" time="${duration.toFixed(3)}">`);
85
+ if (interaction.error) {
86
+ lines.push(' <failure message="Tool call failed">');
87
+ lines.push(` ${escapeXml(interaction.error)}`);
88
+ lines.push(' </failure>');
89
+ }
90
+ // Include the analysis as system-out
91
+ if (interaction.analysis) {
92
+ lines.push(` <system-out>${escapeXml(interaction.analysis)}</system-out>`);
93
+ }
94
+ lines.push(' </testcase>');
95
+ return lines.join('\n');
96
+ }
97
+ /**
98
+ * Generate test suites for workflows.
99
+ */
100
+ function generateWorkflowSuites(result) {
101
+ const lines = [];
102
+ if (!result.workflowResults)
103
+ return '';
104
+ for (const wr of result.workflowResults) {
105
+ const tests = wr.steps.length;
106
+ const failures = wr.steps.filter((s) => !s.success).length;
107
+ lines.push(` <testsuite name="workflow:${escapeXml(wr.workflow.name)}" ` +
108
+ `tests="${tests}" failures="${failures}" errors="0" time="0">`);
109
+ lines.push(' <properties>');
110
+ lines.push(` <property name="description" value="${escapeXml(wr.workflow.description)}"/>`);
111
+ lines.push(` <property name="expectedOutcome" value="${escapeXml(wr.workflow.expectedOutcome)}"/>`);
112
+ lines.push(' </properties>');
113
+ // Each step is a test case
114
+ for (let i = 0; i < wr.steps.length; i++) {
115
+ const stepResult = wr.steps[i];
116
+ const step = stepResult.step;
117
+ lines.push(` <testcase name="step_${i + 1}:${escapeXml(step.tool)}" ` +
118
+ `classname="workflow:${escapeXml(wr.workflow.name)}" time="0">`);
119
+ if (!stepResult.success) {
120
+ lines.push(' <failure message="Step failed">');
121
+ if (stepResult.error) {
122
+ lines.push(` ${escapeXml(stepResult.error)}`);
123
+ }
124
+ lines.push(' </failure>');
125
+ }
126
+ if (stepResult.analysis) {
127
+ lines.push(` <system-out>${escapeXml(stepResult.analysis)}</system-out>`);
128
+ }
129
+ lines.push(' </testcase>');
130
+ }
131
+ lines.push(' </testsuite>');
132
+ }
133
+ return lines.join('\n');
134
+ }
135
+ /**
136
+ * Generate JUnit XML report from behavioral diff.
137
+ *
138
+ * Treats drift detection as a test suite.
139
+ */
140
+ export function generateJunitFromDiff(diff) {
141
+ const lines = [];
142
+ lines.push('<?xml version="1.0" encoding="UTF-8"?>');
143
+ const tests = diff.toolsRemoved.length +
144
+ diff.toolsAdded.length +
145
+ diff.toolsModified.length +
146
+ diff.behaviorChanges.length;
147
+ const failures = diff.breakingCount;
148
+ const errors = diff.toolsRemoved.length;
149
+ lines.push(`<testsuites name="Behavioral Drift Detection" ` +
150
+ `tests="${tests}" failures="${failures}" errors="${errors}" time="0">`);
151
+ // Tool changes suite
152
+ lines.push(` <testsuite name="tool_changes" tests="${diff.toolsRemoved.length + diff.toolsAdded.length + diff.toolsModified.length}" failures="0" errors="${diff.toolsRemoved.length}">`);
153
+ // Removed tools are errors
154
+ for (const tool of diff.toolsRemoved) {
155
+ lines.push(` <testcase name="tool_present:${escapeXml(tool)}" classname="drift.tools">`);
156
+ lines.push(' <error message="Tool was removed">');
157
+ lines.push(` Tool "${escapeXml(tool)}" is no longer present on the server`);
158
+ lines.push(' </error>');
159
+ lines.push(' </testcase>');
160
+ }
161
+ // Added tools are pass with info
162
+ for (const tool of diff.toolsAdded) {
163
+ lines.push(` <testcase name="new_tool:${escapeXml(tool)}" classname="drift.tools">`);
164
+ lines.push(` <system-out>New tool discovered: ${escapeXml(tool)}</system-out>`);
165
+ lines.push(' </testcase>');
166
+ }
167
+ // Modified tools
168
+ for (const toolDiff of diff.toolsModified) {
169
+ const hasHighChanges = toolDiff.changes.some((c) => c.significance === 'high');
170
+ lines.push(` <testcase name="tool_unchanged:${escapeXml(toolDiff.tool)}" classname="drift.tools">`);
171
+ if (hasHighChanges || toolDiff.schemaChanged) {
172
+ lines.push(' <failure message="Tool behavior changed">');
173
+ if (toolDiff.schemaChanged) {
174
+ lines.push(' Schema changed');
175
+ }
176
+ for (const change of toolDiff.changes) {
177
+ lines.push(` ${escapeXml(change.description)}`);
178
+ }
179
+ lines.push(' </failure>');
180
+ }
181
+ else {
182
+ lines.push(` <system-out>Minor changes detected</system-out>`);
183
+ }
184
+ lines.push(' </testcase>');
185
+ }
186
+ lines.push(' </testsuite>');
187
+ // Behavior changes suite
188
+ if (diff.behaviorChanges.length > 0) {
189
+ const behaviorFailures = diff.behaviorChanges.filter((c) => c.significance === 'high').length;
190
+ lines.push(` <testsuite name="behavior_changes" tests="${diff.behaviorChanges.length}" failures="${behaviorFailures}" errors="0">`);
191
+ for (let i = 0; i < diff.behaviorChanges.length; i++) {
192
+ const change = diff.behaviorChanges[i];
193
+ lines.push(` <testcase name="behavior_${i + 1}:${escapeXml(change.tool)}" classname="drift.behavior.${escapeXml(change.aspect)}">`);
194
+ if (change.significance === 'high') {
195
+ lines.push(` <failure message="${escapeXml(change.description)}">`);
196
+ lines.push(` Before: ${escapeXml(change.before || '(none)')}`);
197
+ lines.push(` After: ${escapeXml(change.after || '(none)')}`);
198
+ lines.push(' </failure>');
199
+ }
200
+ else {
201
+ lines.push(` <system-out>${escapeXml(change.description)}</system-out>`);
202
+ }
203
+ lines.push(' </testcase>');
204
+ }
205
+ lines.push(' </testsuite>');
206
+ }
207
+ lines.push('</testsuites>');
208
+ return lines.join('\n');
209
+ }
210
+ //# sourceMappingURL=junit-reporter.js.map
@@ -0,0 +1,14 @@
1
+ import type { InterviewResult } from '../interview/types.js';
2
+ export interface JsonReportOptions {
3
+ /** Schema URL to embed in the report */
4
+ schemaUrl?: string;
5
+ /** Path to the schema file for validation */
6
+ schemaPath?: string;
7
+ /** Validate output against schema before writing */
8
+ validate?: boolean;
9
+ }
10
+ /**
11
+ * Generate a JSON report of the interview.
12
+ */
13
+ export declare function generateJsonReport(result: InterviewResult, options?: JsonReportOptions): string;
14
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1,44 @@
1
+ import { Ajv2020 as Ajv } from 'ajv/dist/2020.js';
2
+ import { readFileSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { REPORT_SCHEMAS } from '../constants.js';
5
+ /**
6
+ * Generate a JSON report of the interview.
7
+ */
8
+ export function generateJsonReport(result, options = {}) {
9
+ const report = options.schemaUrl
10
+ ? { $schema: options.schemaUrl, ...result }
11
+ : { ...result };
12
+ const jsonReadyReport = JSON.parse(JSON.stringify(report));
13
+ if (options.validate) {
14
+ const schemaPath = resolveSchemaPath(options.schemaPath);
15
+ validateReportAgainstSchema(jsonReadyReport, schemaPath);
16
+ }
17
+ return JSON.stringify(jsonReadyReport, null, 2);
18
+ }
19
+ function resolveSchemaPath(schemaPath) {
20
+ if (schemaPath) {
21
+ return schemaPath;
22
+ }
23
+ const url = new URL(`../../${REPORT_SCHEMAS.CHECK_REPORT_SCHEMA_FILE}`, import.meta.url);
24
+ return fileURLToPath(url);
25
+ }
26
+ function validateReportAgainstSchema(report, schemaPath) {
27
+ const rawSchema = readFileSync(schemaPath, 'utf-8');
28
+ const schema = JSON.parse(rawSchema);
29
+ const ajv = new Ajv({
30
+ allErrors: true,
31
+ strict: false,
32
+ allowUnionTypes: true,
33
+ // Avoid warnings for date-time without adding extra dependencies.
34
+ formats: {
35
+ 'date-time': true,
36
+ },
37
+ });
38
+ const validate = ajv.compile(schema);
39
+ if (!validate(report)) {
40
+ const errorText = ajv.errorsText(validate.errors, { separator: '\n' });
41
+ throw new Error(`Check report schema validation failed:\n${errorText}`);
42
+ }
43
+ }
44
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * SARIF (Static Analysis Results Interchange Format) reporter.
3
+ * Produces output compatible with GitHub Code Scanning.
4
+ */
5
+ import type { InterviewResult } from '../interview/types.js';
6
+ import type { BehavioralDiff, CIFinding } from '../baseline/types.js';
7
+ /**
8
+ * Generate SARIF report from interview results.
9
+ */
10
+ export declare function generateSarifReport(result: InterviewResult, serverUri?: string): string;
11
+ /**
12
+ * Generate SARIF report from behavioral diff.
13
+ */
14
+ export declare function generateSarifFromDiff(diff: BehavioralDiff, serverUri?: string): string;
15
+ /**
16
+ * Generate SARIF from CI findings.
17
+ */
18
+ export declare function generateSarifFromFindings(findings: CIFinding[], serverUri?: string): string;
19
+ //# sourceMappingURL=sarif-reporter.d.ts.map
@@ -0,0 +1,335 @@
1
+ /**
2
+ * SARIF (Static Analysis Results Interchange Format) reporter.
3
+ * Produces output compatible with GitHub Code Scanning.
4
+ */
5
+ import { URLS } from '../constants.js';
6
+ import { VERSION } from '../version.js';
7
+ /**
8
+ * SARIF schema version.
9
+ */
10
+ const SARIF_VERSION = '2.1.0';
11
+ /**
12
+ * Bellwether rule definitions.
13
+ */
14
+ const BELLWETHER_RULES = [
15
+ {
16
+ id: 'BELLWETHER-001',
17
+ name: 'SecurityFinding',
18
+ shortDescription: { text: 'Security consideration identified' },
19
+ fullDescription: { text: 'A security-related behavior was observed during tool testing' },
20
+ defaultConfiguration: { level: 'warning' },
21
+ helpUri: `${URLS.DOCS_BASE}#security`,
22
+ },
23
+ {
24
+ id: 'BELLWETHER-002',
25
+ name: 'BehavioralLimitation',
26
+ shortDescription: { text: 'Tool limitation discovered' },
27
+ fullDescription: { text: 'A limitation in tool behavior was identified' },
28
+ defaultConfiguration: { level: 'note' },
29
+ helpUri: `${URLS.DOCS_BASE}#limitations`,
30
+ },
31
+ {
32
+ id: 'BELLWETHER-003',
33
+ name: 'ToolRemoved',
34
+ shortDescription: { text: 'Tool removed from server' },
35
+ fullDescription: { text: 'A tool that existed in the baseline is no longer present' },
36
+ defaultConfiguration: { level: 'error' },
37
+ helpUri: `${URLS.DOCS_BASE}#drift`,
38
+ },
39
+ {
40
+ id: 'BELLWETHER-004',
41
+ name: 'ToolAdded',
42
+ shortDescription: { text: 'New tool added to server' },
43
+ fullDescription: { text: 'A new tool was discovered that was not in the baseline' },
44
+ defaultConfiguration: { level: 'note' },
45
+ helpUri: `${URLS.DOCS_BASE}#drift`,
46
+ },
47
+ {
48
+ id: 'BELLWETHER-005',
49
+ name: 'SchemaChanged',
50
+ shortDescription: { text: 'Tool schema changed' },
51
+ fullDescription: { text: 'The input schema for a tool has changed' },
52
+ defaultConfiguration: { level: 'warning' },
53
+ helpUri: `${URLS.DOCS_BASE}#drift`,
54
+ },
55
+ {
56
+ id: 'BELLWETHER-006',
57
+ name: 'BehaviorChanged',
58
+ shortDescription: { text: 'Tool behavior changed' },
59
+ fullDescription: { text: 'Observable tool behavior differs from baseline' },
60
+ defaultConfiguration: { level: 'warning' },
61
+ helpUri: `${URLS.DOCS_BASE}#drift`,
62
+ },
63
+ {
64
+ id: 'BELLWETHER-007',
65
+ name: 'WorkflowFailed',
66
+ shortDescription: { text: 'Workflow execution failed' },
67
+ fullDescription: { text: 'A workflow that previously succeeded now fails' },
68
+ defaultConfiguration: { level: 'error' },
69
+ helpUri: `${URLS.DOCS_BASE}#workflows`,
70
+ },
71
+ ];
72
+ /**
73
+ * Generate SARIF report from interview results.
74
+ */
75
+ export function generateSarifReport(result, serverUri = 'mcp-server') {
76
+ const results = [];
77
+ // Add security findings
78
+ for (const profile of result.toolProfiles) {
79
+ for (const note of profile.securityNotes) {
80
+ results.push({
81
+ ruleId: 'BELLWETHER-001',
82
+ level: 'warning',
83
+ message: { text: `${profile.name}: ${note}` },
84
+ locations: [
85
+ {
86
+ physicalLocation: {
87
+ artifactLocation: { uri: serverUri },
88
+ },
89
+ },
90
+ ],
91
+ properties: {
92
+ tool: profile.name,
93
+ category: 'security',
94
+ },
95
+ });
96
+ }
97
+ }
98
+ // Add limitations
99
+ for (const profile of result.toolProfiles) {
100
+ for (const limitation of profile.limitations) {
101
+ results.push({
102
+ ruleId: 'BELLWETHER-002',
103
+ level: 'note',
104
+ message: { text: `${profile.name}: ${limitation}` },
105
+ locations: [
106
+ {
107
+ physicalLocation: {
108
+ artifactLocation: { uri: serverUri },
109
+ },
110
+ },
111
+ ],
112
+ properties: {
113
+ tool: profile.name,
114
+ category: 'limitation',
115
+ },
116
+ });
117
+ }
118
+ }
119
+ // Add workflow failures
120
+ if (result.workflowResults) {
121
+ for (const wr of result.workflowResults) {
122
+ if (!wr.success) {
123
+ results.push({
124
+ ruleId: 'BELLWETHER-007',
125
+ level: 'error',
126
+ message: {
127
+ text: `Workflow "${wr.workflow.name}" failed: ${wr.failureReason || 'Unknown error'}`,
128
+ },
129
+ properties: {
130
+ workflow: wr.workflow.id,
131
+ category: 'workflow',
132
+ },
133
+ });
134
+ }
135
+ }
136
+ }
137
+ const report = {
138
+ $schema: URLS.SARIF_SCHEMA,
139
+ version: SARIF_VERSION,
140
+ runs: [
141
+ {
142
+ tool: {
143
+ driver: {
144
+ name: 'Bellwether',
145
+ version: VERSION,
146
+ informationUri: URLS.DOCS_BASE,
147
+ rules: BELLWETHER_RULES,
148
+ },
149
+ },
150
+ results,
151
+ invocations: [
152
+ {
153
+ executionSuccessful: true,
154
+ },
155
+ ],
156
+ },
157
+ ],
158
+ };
159
+ return JSON.stringify(report, null, 2);
160
+ }
161
+ /**
162
+ * Generate SARIF report from behavioral diff.
163
+ */
164
+ export function generateSarifFromDiff(diff, serverUri = 'mcp-server') {
165
+ const results = [];
166
+ // Removed tools
167
+ for (const tool of diff.toolsRemoved) {
168
+ results.push({
169
+ ruleId: 'BELLWETHER-003',
170
+ level: 'error',
171
+ message: { text: `Tool "${tool}" was removed from the server` },
172
+ locations: [
173
+ {
174
+ physicalLocation: {
175
+ artifactLocation: { uri: serverUri },
176
+ },
177
+ },
178
+ ],
179
+ properties: {
180
+ tool,
181
+ category: 'drift',
182
+ },
183
+ });
184
+ }
185
+ // Added tools
186
+ for (const tool of diff.toolsAdded) {
187
+ results.push({
188
+ ruleId: 'BELLWETHER-004',
189
+ level: 'note',
190
+ message: { text: `New tool "${tool}" was added to the server` },
191
+ locations: [
192
+ {
193
+ physicalLocation: {
194
+ artifactLocation: { uri: serverUri },
195
+ },
196
+ },
197
+ ],
198
+ properties: {
199
+ tool,
200
+ category: 'drift',
201
+ },
202
+ });
203
+ }
204
+ // Modified tools
205
+ for (const toolDiff of diff.toolsModified) {
206
+ if (toolDiff.schemaChanged) {
207
+ results.push({
208
+ ruleId: 'BELLWETHER-005',
209
+ level: 'warning',
210
+ message: { text: `Schema changed for tool "${toolDiff.tool}"` },
211
+ locations: [
212
+ {
213
+ physicalLocation: {
214
+ artifactLocation: { uri: serverUri },
215
+ },
216
+ },
217
+ ],
218
+ properties: {
219
+ tool: toolDiff.tool,
220
+ category: 'drift',
221
+ },
222
+ });
223
+ }
224
+ for (const change of toolDiff.changes) {
225
+ const level = change.significance === 'high' ? 'error' :
226
+ change.significance === 'medium' ? 'warning' : 'note';
227
+ results.push({
228
+ ruleId: 'BELLWETHER-006',
229
+ level,
230
+ message: { text: change.description },
231
+ locations: [
232
+ {
233
+ physicalLocation: {
234
+ artifactLocation: { uri: serverUri },
235
+ },
236
+ },
237
+ ],
238
+ properties: {
239
+ tool: change.tool,
240
+ aspect: change.aspect,
241
+ significance: change.significance,
242
+ category: 'drift',
243
+ },
244
+ });
245
+ }
246
+ }
247
+ const report = {
248
+ $schema: URLS.SARIF_SCHEMA,
249
+ version: SARIF_VERSION,
250
+ runs: [
251
+ {
252
+ tool: {
253
+ driver: {
254
+ name: 'Bellwether',
255
+ version: VERSION,
256
+ informationUri: URLS.DOCS_BASE,
257
+ rules: BELLWETHER_RULES,
258
+ },
259
+ },
260
+ results,
261
+ invocations: [
262
+ {
263
+ executionSuccessful: diff.severity !== 'breaking',
264
+ exitCode: diff.severity === 'breaking' ? 1 : 0,
265
+ },
266
+ ],
267
+ },
268
+ ],
269
+ };
270
+ return JSON.stringify(report, null, 2);
271
+ }
272
+ /**
273
+ * Generate SARIF from CI findings.
274
+ */
275
+ export function generateSarifFromFindings(findings, serverUri = 'mcp-server') {
276
+ const results = findings.map((finding) => {
277
+ const level = finding.severity === 'critical' || finding.severity === 'high' ? 'error' :
278
+ finding.severity === 'medium' ? 'warning' : 'note';
279
+ const ruleId = findingCategoryToRuleId(finding.category);
280
+ return {
281
+ ruleId,
282
+ level,
283
+ message: { text: finding.description },
284
+ locations: [
285
+ {
286
+ physicalLocation: {
287
+ artifactLocation: { uri: serverUri },
288
+ },
289
+ },
290
+ ],
291
+ properties: {
292
+ findingId: finding.id,
293
+ category: finding.category,
294
+ severity: finding.severity,
295
+ tool: finding.tool,
296
+ recommendation: finding.recommendation,
297
+ },
298
+ };
299
+ });
300
+ const report = {
301
+ $schema: URLS.SARIF_SCHEMA,
302
+ version: SARIF_VERSION,
303
+ runs: [
304
+ {
305
+ tool: {
306
+ driver: {
307
+ name: 'Bellwether',
308
+ version: VERSION,
309
+ informationUri: URLS.DOCS_BASE,
310
+ rules: BELLWETHER_RULES,
311
+ },
312
+ },
313
+ results,
314
+ },
315
+ ],
316
+ };
317
+ return JSON.stringify(report, null, 2);
318
+ }
319
+ /**
320
+ * Map finding category to SARIF rule ID.
321
+ */
322
+ function findingCategoryToRuleId(category) {
323
+ switch (category) {
324
+ case 'security':
325
+ return 'BELLWETHER-001';
326
+ case 'reliability':
327
+ return 'BELLWETHER-002';
328
+ case 'drift':
329
+ return 'BELLWETHER-006';
330
+ case 'behavior':
331
+ default:
332
+ return 'BELLWETHER-002';
333
+ }
334
+ }
335
+ //# sourceMappingURL=sarif-reporter.js.map