@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,647 @@
1
+ /**
2
+ * Configuration templates for bellwether init.
3
+ *
4
+ * These templates include ALL possible options with comments,
5
+ * making the config file self-documenting.
6
+ */
7
+ import { CONFIG_DEFAULTS } from './defaults.js';
8
+ function formatYamlList(values, indent = 4) {
9
+ const pad = ' '.repeat(indent);
10
+ return values.map((value) => `${pad}- ${value}`).join('\n');
11
+ }
12
+ /**
13
+ * Generate a comprehensive bellwether.yaml configuration file.
14
+ *
15
+ * The generated file includes ALL possible options with explanatory comments,
16
+ * so users can customize without consulting documentation.
17
+ *
18
+ * This config is used by both 'bellwether check' and 'bellwether explore' commands.
19
+ */
20
+ export function generateConfigTemplate(options = {}) {
21
+ const { serverCommand = '', serverArgs = [], provider = 'ollama', preset, envVars = [], ciOptimized = false, } = options;
22
+ const defaults = CONFIG_DEFAULTS;
23
+ const serverArgsYaml = serverArgs.length > 0
24
+ ? `\n args:\n${serverArgs.map(arg => ` - "${arg}"`).join('\n')}`
25
+ : '\n args: []';
26
+ const presetComment = preset ? `# Generated with: bellwether init --preset ${preset}\n` : '';
27
+ // Generate env section if env vars were detected
28
+ const envVarsYaml = envVars.length > 0
29
+ ? `\n env:\n${envVars.map(v => ` ${v}: "\${${v}}"`).join('\n')}`
30
+ : '';
31
+ return `# Bellwether Configuration
32
+ # Generated by: bellwether init
33
+ # Docs: https://docs.bellwether.sh/guides/configuration
34
+ ${presetComment}
35
+ # This config is used by both commands:
36
+ # bellwether check - Schema validation and drift detection (free, fast)
37
+ # bellwether explore - LLM-powered behavioral exploration
38
+
39
+ # =============================================================================
40
+ # SERVER (used by both commands)
41
+ # =============================================================================
42
+ # The MCP server to validate/explore.
43
+
44
+ server:
45
+ # Command to start the MCP server
46
+ command: "${serverCommand}"
47
+ # Arguments to pass to the server command${serverArgsYaml}
48
+
49
+ # Timeout for server startup and tool calls (milliseconds, default: ${defaults.server.timeout})
50
+ timeout: ${defaults.server.timeout}
51
+
52
+ # Additional environment variables for the server process
53
+ # Use \${VAR} syntax to reference environment variables${envVarsYaml}${envVars.length === 0 ? `
54
+ # env:
55
+ # NODE_ENV: production
56
+ # API_KEY: "\${API_KEY}"` : ''}
57
+
58
+ # =============================================================================
59
+ # SCENARIOS (used by both commands)
60
+ # =============================================================================
61
+ # Custom deterministic test scenarios for reproducible testing.
62
+
63
+ scenarios:
64
+ # Path to scenarios YAML file
65
+ # path: "./bellwether-tests.yaml"
66
+
67
+ # Run ONLY scenarios (skip generated tests)
68
+ only: ${defaults.scenarios.only}
69
+
70
+ # =============================================================================
71
+ # OUTPUT (used by both commands)
72
+ # =============================================================================
73
+ # bellwether outputs: documentation + JSON reports (configurable via output.files)
74
+
75
+ output:
76
+ # Directory for JSON output files (see output.files)
77
+ dir: "${defaults.output.dir}"
78
+
79
+ # Directory for documentation files (CONTRACT.md, AGENTS.md)
80
+ # These are kept in root by default for visibility
81
+ docsDir: "${defaults.output.docsDir}"
82
+
83
+ # Output format: agents.md (markdown only), json (JSON only), or both
84
+ format: ${defaults.output.format}
85
+
86
+ # Example output settings (for CONTRACT.md and AGENTS.md)
87
+ examples:
88
+ # Include full (non-truncated) examples in documentation
89
+ full: ${defaults.output.examples.full}
90
+
91
+ # Maximum example length in characters (100-50000)
92
+ maxLength: ${defaults.output.examples.maxLength}
93
+
94
+ # Maximum examples per tool (1-20)
95
+ maxPerTool: ${defaults.output.examples.maxPerTool}
96
+
97
+ # Output file names (relative to output dirs above)
98
+ files:
99
+ checkReport: ${defaults.output.files.checkReport}
100
+ exploreReport: ${defaults.output.files.exploreReport}
101
+ contractDoc: ${defaults.output.files.contractDoc}
102
+ agentsDoc: ${defaults.output.files.agentsDoc}
103
+ verificationReport: ${defaults.output.files.verificationReport}
104
+
105
+ # =============================================================================
106
+ # CHECK COMMAND SETTINGS
107
+ # =============================================================================
108
+ # Settings for 'bellwether check' - schema validation and drift detection.
109
+ # Free, fast, deterministic. No LLM required.
110
+
111
+ baseline:
112
+ # Default baseline file path (relative to output.dir or absolute)
113
+ path: ${defaults.baseline.path}
114
+
115
+ # Auto-save baseline after each check (set path to enable)
116
+ # savePath: "./bellwether-baseline.json"
117
+
118
+ # Path to baseline for drift comparison (enables drift detection)
119
+ # comparePath: "./bellwether-baseline.json"
120
+
121
+ # Fail if drift is detected (useful for CI)
122
+ failOnDrift: ${ciOptimized ? 'true' : 'false'}
123
+
124
+ # Default output format for baseline compare/diff: text, json, markdown, compact
125
+ outputFormat: ${defaults.baseline.outputFormat}
126
+
127
+ # Severity thresholds for filtering and CI failure
128
+ severity:
129
+ # Minimum severity to include in reports: none, info, warning, breaking
130
+ minimumSeverity: ${defaults.baseline.severity.minimumSeverity}
131
+
132
+ # Severity at which to fail CI checks: none, info, warning, breaking
133
+ failOnSeverity: ${defaults.baseline.severity.failOnSeverity}
134
+
135
+ # Suppress warning-level changes from output
136
+ suppressWarnings: ${defaults.baseline.severity.suppressWarnings}
137
+
138
+ # Custom severity overrides per aspect (uncomment to use)
139
+ # aspectOverrides:
140
+ # description: none # Ignore description-only changes
141
+ # response_structure: info # Downgrade response structure to info
142
+
143
+ check:
144
+ # Enable incremental checking (only test tools with changed schemas)
145
+ # Requires an existing baseline for comparison
146
+ incremental: ${defaults.check.incremental}
147
+
148
+ # Maximum age of cached results in hours (for incremental checking)
149
+ # Default: 168 (1 week), Range: 1-720 (30 days)
150
+ incrementalCacheHours: ${defaults.check.incrementalCacheHours}
151
+
152
+ # Enable parallel tool testing for faster checks
153
+ # Recommended for servers with multiple tools
154
+ parallel: ${defaults.check.parallel}
155
+
156
+ # Number of concurrent tool workers (1-10)
157
+ # Higher values = faster but more server load
158
+ parallelWorkers: ${defaults.check.parallelWorkers}
159
+
160
+ # Performance regression threshold percentage (0-100)
161
+ # Tool is flagged if p50 latency increases by more than this percentage
162
+ performanceThreshold: ${defaults.check.performanceThreshold}
163
+
164
+ # Diff output format: text, json, compact, github, markdown, junit, sarif
165
+ diffFormat: ${defaults.check.diffFormat}
166
+
167
+ # Number of warmup runs before timing samples (0-5)
168
+ # First sample(s) are excluded from variance calculation to reduce cold-start noise
169
+ warmupRuns: ${defaults.check.warmupRuns}
170
+
171
+ # Enable smart test value generation from schema descriptions
172
+ # Parses descriptions for format hints (e.g., "YYYY-MM-DD" generates valid dates)
173
+ smartTestValues: ${defaults.check.smartTestValues}
174
+
175
+ # Stateful testing (create -> use -> delete) for tool dependencies
176
+ statefulTesting:
177
+ enabled: ${defaults.check.statefulTesting.enabled}
178
+ maxChainLength: ${defaults.check.statefulTesting.maxChainLength}
179
+ shareOutputsBetweenTools: ${defaults.check.statefulTesting.shareOutputsBetweenTools}
180
+
181
+ # External service handling for tools that need credentials
182
+ externalServices:
183
+ # Mode for unconfigured services: skip | mock | fail
184
+ mode: ${defaults.check.externalServices.mode}
185
+ # Per-service overrides (optional)
186
+ # services:
187
+ # plaid:
188
+ # enabled: false
189
+ # sandboxCredentials:
190
+ # clientId: "\${PLAID_CLIENT_ID}"
191
+ # secret: "\${PLAID_SECRET}"
192
+
193
+ # Response assertions (semantic validation of responses)
194
+ assertions:
195
+ enabled: ${defaults.check.assertions.enabled}
196
+ strict: ${defaults.check.assertions.strict}
197
+ infer: ${defaults.check.assertions.infer}
198
+
199
+ # Rate limiting controls
200
+ rateLimit:
201
+ enabled: ${defaults.check.rateLimit.enabled}
202
+ requestsPerSecond: ${defaults.check.rateLimit.requestsPerSecond}
203
+ burstLimit: ${defaults.check.rateLimit.burstLimit}
204
+ backoffStrategy: ${defaults.check.rateLimit.backoffStrategy}
205
+ maxRetries: ${defaults.check.rateLimit.maxRetries}
206
+
207
+ # Security testing settings
208
+ security:
209
+ # Enable security vulnerability testing
210
+ # Tests for SQL injection, XSS, path traversal, command injection, SSRF
211
+ enabled: ${defaults.check.security.enabled}
212
+
213
+ # Security categories to test (when enabled)
214
+ categories:
215
+ ${formatYamlList(defaults.check.security.categories, 6)}
216
+
217
+ # Statistical sampling settings for performance baselines
218
+ sampling:
219
+ # Minimum samples per tool (1-50, default: 10)
220
+ # Higher values = more reliable baselines but longer test runs
221
+ minSamples: ${defaults.check.sampling.minSamples}
222
+
223
+ # Target confidence level: low (1+ samples), medium (5+), high (10+)
224
+ targetConfidence: ${defaults.check.sampling.targetConfidence}
225
+
226
+ # Fail if confidence is below target (useful for CI)
227
+ failOnLowConfidence: ${defaults.check.sampling.failOnLowConfidence}
228
+
229
+ # Metrics configuration
230
+ metrics:
231
+ # Count validation rejections as successes in reliability metrics
232
+ countValidationAsSuccess: ${defaults.check.metrics.countValidationAsSuccess}
233
+ # Separate validation metrics from happy-path reliability
234
+ separateValidationMetrics: ${defaults.check.metrics.separateValidationMetrics}
235
+
236
+ # =============================================================================
237
+ # EXPLORE COMMAND SETTINGS
238
+ # =============================================================================
239
+ # Settings for 'bellwether explore' - LLM-powered behavioral exploration.
240
+ # Requires LLM provider (Ollama is free and local).
241
+
242
+ llm:
243
+ # Provider: ollama (local, free), openai, or anthropic
244
+ provider: ${provider}
245
+
246
+ # Model to use. Leave empty for provider default.
247
+ # Defaults: ollama=qwen3:8b, openai=gpt-4.1-nano, anthropic=claude-haiku-4-5
248
+ model: "${defaults.llm.model}"
249
+
250
+ # Ollama settings (for local LLM)
251
+ ollama:
252
+ baseUrl: "${defaults.llm.ollama.baseUrl}"
253
+
254
+ # API keys are loaded from environment variables or 'bellwether auth'.
255
+ # SECURITY: Never put API keys directly in this file!
256
+
257
+ explore:
258
+ # Personas provide different testing perspectives:
259
+ # - technical_writer: Documentation quality, clarity, completeness
260
+ # - security_tester: Security vulnerabilities, input validation
261
+ # - qa_engineer: Edge cases, error handling, reliability
262
+ # - novice_user: Usability, confusing behavior, missing guidance
263
+ personas:
264
+ ${formatYamlList(defaults.explore.personas, 4)}
265
+
266
+ # Maximum questions to ask per tool (1-10)
267
+ maxQuestionsPerTool: ${defaults.explore.maxQuestionsPerTool}
268
+
269
+ # Run personas in parallel for faster execution
270
+ parallelPersonas: ${defaults.explore.parallelPersonas}
271
+
272
+ # Maximum concurrent persona interviews (1-10)
273
+ personaConcurrency: ${defaults.explore.personaConcurrency}
274
+
275
+ # Skip error/edge case testing
276
+ skipErrorTests: ${defaults.explore.skipErrorTests}
277
+
278
+ workflows:
279
+ # Path to workflow definitions YAML file
280
+ # path: "./bellwether-workflows.yaml"
281
+
282
+ # Enable LLM-based workflow discovery
283
+ discover: ${defaults.workflows.discover}
284
+
285
+ # Track state changes between workflow steps
286
+ trackState: ${defaults.workflows.trackState}
287
+
288
+ # Auto-generate workflows from discovered tools
289
+ autoGenerate: ${defaults.workflows.autoGenerate}
290
+
291
+ # Skip steps whose dependencies (previous steps providing data) have failed
292
+ # When true, a step that depends on data from a failed step will be skipped
293
+ requireSuccessfulDependencies: ${defaults.workflows.requireSuccessfulDependencies}
294
+
295
+ # Timeout per workflow step in milliseconds (1000-300000)
296
+ stepTimeout: ${defaults.workflows.stepTimeout}
297
+
298
+ # Timeout configuration for workflow operations (ms)
299
+ timeouts:
300
+ toolCall: ${defaults.workflows.timeouts.toolCall}
301
+ stateSnapshot: ${defaults.workflows.timeouts.stateSnapshot}
302
+ probeTool: ${defaults.workflows.timeouts.probeTool}
303
+ llmAnalysis: ${defaults.workflows.timeouts.llmAnalysis}
304
+ llmSummary: ${defaults.workflows.timeouts.llmSummary}
305
+
306
+ # =============================================================================
307
+ # WATCH MODE SETTINGS
308
+ # =============================================================================
309
+ # Settings for 'bellwether watch' - continuous drift monitoring.
310
+
311
+ watch:
312
+ # Path to watch for file changes
313
+ path: "${defaults.watch.path}"
314
+
315
+ # Polling interval in milliseconds (1000-60000)
316
+ interval: ${defaults.watch.interval}
317
+
318
+ # File extensions to watch for changes
319
+ extensions:
320
+ ${formatYamlList(defaults.watch.extensions, 4)}
321
+
322
+ # Command to run when drift is detected (optional)
323
+ # onDrift: "npm test"
324
+
325
+ # =============================================================================
326
+ # COMMON SETTINGS
327
+ # =============================================================================
328
+
329
+ cache:
330
+ # Enable response caching (recommended)
331
+ enabled: ${defaults.cache.enabled}
332
+
333
+ # Cache directory
334
+ dir: "${defaults.cache.dir}"
335
+
336
+ logging:
337
+ # Log level: debug, info, warn, error, silent
338
+ level: ${defaults.logging.level}
339
+
340
+ # Show verbose output
341
+ verbose: ${defaults.logging.verbose}
342
+
343
+ # =============================================================================
344
+ # DISCOVER COMMAND SETTINGS
345
+ # =============================================================================
346
+ # Settings for 'bellwether discover' - capability discovery.
347
+
348
+ discovery:
349
+ # Output as JSON
350
+ json: ${defaults.discovery.json}
351
+
352
+ # Connection timeout in milliseconds
353
+ timeout: ${defaults.discovery.timeout}
354
+
355
+ # Transport type: stdio, sse, streamable-http
356
+ transport: ${defaults.discovery.transport}
357
+
358
+ # Remote MCP server URL (required for sse/streamable-http)
359
+ # url: "https://example.com/mcp"
360
+
361
+ # Session ID for remote server authentication
362
+ # sessionId: "session-id"
363
+
364
+ # =============================================================================
365
+ # REGISTRY COMMAND SETTINGS
366
+ # =============================================================================
367
+ # Settings for 'bellwether registry' - server lookup.
368
+
369
+ registry:
370
+ # Maximum results to show
371
+ limit: ${defaults.registry.limit}
372
+
373
+ # Output as JSON
374
+ json: ${defaults.registry.json}
375
+
376
+ # =============================================================================
377
+ # HISTORY COMMAND SETTINGS
378
+ # =============================================================================
379
+ # Settings for 'bellwether history' and 'bellwether diff' (cloud history).
380
+
381
+ history:
382
+ # Number of versions to show
383
+ limit: ${defaults.history.limit}
384
+
385
+ # Output as JSON
386
+ json: ${defaults.history.json}
387
+
388
+ # =============================================================================
389
+ # LINK COMMAND SETTINGS
390
+ # =============================================================================
391
+ # Settings for 'bellwether link' (cloud project linking).
392
+
393
+ link:
394
+ # Default server command when creating new projects
395
+ defaultServerCommand: "${defaults.link.defaultServerCommand}"
396
+
397
+ # =============================================================================
398
+ # GOLDEN COMMAND SETTINGS
399
+ # =============================================================================
400
+ # Settings for 'bellwether golden' output validation.
401
+
402
+ golden:
403
+ # Default JSON args for golden save
404
+ defaultArgs: '${defaults.golden.defaultArgs}'
405
+
406
+ # Default comparison mode: exact, structural, semantic
407
+ mode: ${defaults.golden.mode}
408
+
409
+ # Output format for compare: text, json, markdown
410
+ compareFormat: ${defaults.golden.compareFormat}
411
+
412
+ # Output format for list: text, json
413
+ listFormat: ${defaults.golden.listFormat}
414
+
415
+ # Normalize timestamps by default
416
+ normalizeTimestamps: ${defaults.golden.normalizeTimestamps}
417
+
418
+ # Normalize UUIDs by default
419
+ normalizeUuids: ${defaults.golden.normalizeUuids}
420
+
421
+ # =============================================================================
422
+ # VERIFY COMMAND SETTINGS
423
+ # =============================================================================
424
+ # Settings for 'bellwether verify' verification reports.
425
+
426
+ verify:
427
+ # Default verification tier: bronze, silver, gold, platinum
428
+ tier: ${defaults.verify.tier}
429
+
430
+ # Include security testing by default
431
+ security: ${defaults.verify.security}
432
+
433
+ # Output as JSON by default
434
+ json: ${defaults.verify.json}
435
+
436
+ # Output badge URL only by default
437
+ badgeOnly: ${defaults.verify.badgeOnly}
438
+
439
+ # =============================================================================
440
+ # CONTRACT COMMAND SETTINGS
441
+ # =============================================================================
442
+ # Settings for 'bellwether contract' - contract validation/generation.
443
+
444
+ contract:
445
+ # Default contract file path
446
+ # path: "./contract.bellwether.yaml"
447
+
448
+ # Validation mode: strict, lenient, report
449
+ mode: ${defaults.contract.mode}
450
+
451
+ # Output format: text, json, markdown
452
+ format: ${defaults.contract.format}
453
+
454
+ # Server startup timeout in milliseconds
455
+ timeout: ${defaults.contract.timeout}
456
+
457
+ # Exit with error when violations are found
458
+ failOnViolation: ${defaults.contract.failOnViolation}
459
+ `;
460
+ }
461
+ /**
462
+ * Preset configurations for common use cases.
463
+ */
464
+ export const PRESETS = {
465
+ /**
466
+ * CI preset: Optimized for 'bellwether check' in CI/CD pipelines.
467
+ * Fast, free, deterministic with failOnDrift enabled.
468
+ */
469
+ ci: {
470
+ ciOptimized: true,
471
+ provider: 'ollama', // Not used by check, but sensible default
472
+ },
473
+ /**
474
+ * Security preset: Optimized for 'bellwether explore' with security focus.
475
+ */
476
+ security: {
477
+ provider: 'anthropic',
478
+ },
479
+ /**
480
+ * Thorough preset: Optimized for 'bellwether explore' with all personas.
481
+ */
482
+ thorough: {
483
+ provider: 'anthropic',
484
+ },
485
+ /**
486
+ * Local preset: Optimized for 'bellwether explore' with local Ollama.
487
+ * Free, private, no API keys needed.
488
+ */
489
+ local: {
490
+ provider: 'ollama',
491
+ },
492
+ };
493
+ /**
494
+ * Get preset-specific YAML overrides for documentation purposes.
495
+ *
496
+ * @param presetName - Name of the preset (ci, security, thorough, local)
497
+ * @returns YAML string with preset-specific settings or null if preset not found
498
+ */
499
+ export function getPresetOverrides(presetName) {
500
+ const preset = PRESETS[presetName];
501
+ if (!preset)
502
+ return null;
503
+ // Return additional YAML to append/override based on preset
504
+ switch (presetName) {
505
+ case 'ci':
506
+ return `
507
+ # CI Preset Overrides
508
+ # Optimized for 'bellwether check' in CI/CD pipelines
509
+
510
+ baseline:
511
+ failOnDrift: true
512
+ severity:
513
+ failOnSeverity: breaking
514
+
515
+ check:
516
+ parallel: true
517
+ parallelWorkers: 4
518
+ performanceThreshold: 10
519
+ sampling:
520
+ minSamples: 5
521
+ targetConfidence: medium
522
+ failOnLowConfidence: true
523
+
524
+ output:
525
+ examples:
526
+ full: false
527
+ maxLength: 1000
528
+
529
+ logging:
530
+ level: warn
531
+ `;
532
+ case 'security':
533
+ return `
534
+ # Security Preset Overrides
535
+ # Optimized for security-focused testing
536
+
537
+ check:
538
+ security:
539
+ enabled: true
540
+ categories:
541
+ - sql_injection
542
+ - xss
543
+ - path_traversal
544
+ - command_injection
545
+ - ssrf
546
+ sampling:
547
+ minSamples: 5
548
+ targetConfidence: high
549
+
550
+ llm:
551
+ provider: anthropic
552
+ model: claude-sonnet-4-5 # Better reasoning for security analysis
553
+
554
+ explore:
555
+ personas:
556
+ - technical_writer
557
+ - security_tester
558
+ - qa_engineer
559
+ maxQuestionsPerTool: 5
560
+ skipErrorTests: false
561
+
562
+ output:
563
+ examples:
564
+ full: true
565
+ maxLength: 5000
566
+ `;
567
+ case 'thorough':
568
+ return `
569
+ # Thorough Preset Overrides
570
+ # Comprehensive testing with all features enabled
571
+
572
+ check:
573
+ parallel: true
574
+ parallelWorkers: 6
575
+ security:
576
+ enabled: true
577
+ categories:
578
+ - sql_injection
579
+ - xss
580
+ - path_traversal
581
+ - command_injection
582
+ - ssrf
583
+ sampling:
584
+ minSamples: 10
585
+ targetConfidence: high
586
+ failOnLowConfidence: true
587
+
588
+ llm:
589
+ provider: anthropic
590
+ model: claude-sonnet-4-5
591
+
592
+ explore:
593
+ personas:
594
+ - technical_writer
595
+ - security_tester
596
+ - qa_engineer
597
+ - novice_user
598
+ maxQuestionsPerTool: 5
599
+ parallelPersonas: true
600
+ skipErrorTests: false
601
+
602
+ workflows:
603
+ discover: true
604
+ trackState: true
605
+ autoGenerate: true
606
+
607
+ output:
608
+ examples:
609
+ full: true
610
+ maxLength: 10000
611
+ maxPerTool: 10
612
+ `;
613
+ case 'local':
614
+ return `
615
+ # Local Preset Overrides
616
+ # Exploration using local Ollama (free, private)
617
+
618
+ llm:
619
+ provider: ollama
620
+ model: qwen3:8b
621
+ ollama:
622
+ baseUrl: "http://localhost:11434"
623
+
624
+ explore:
625
+ personas:
626
+ - technical_writer
627
+ maxQuestionsPerTool: 3
628
+ `;
629
+ default:
630
+ return null;
631
+ }
632
+ }
633
+ /**
634
+ * Generate a preset-specific configuration.
635
+ */
636
+ export function generatePresetConfig(presetName, options = {}) {
637
+ const preset = PRESETS[presetName];
638
+ if (!preset) {
639
+ throw new Error(`Unknown preset: ${presetName}. Available: ${Object.keys(PRESETS).join(', ')}`);
640
+ }
641
+ return generateConfigTemplate({
642
+ ...preset,
643
+ ...options,
644
+ preset: presetName,
645
+ });
646
+ }
647
+ //# sourceMappingURL=template.js.map