@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,216 @@
1
+ /**
2
+ * Interactive mode utilities for CLI commands.
3
+ *
4
+ * Provides user prompts for server command, persona selection,
5
+ * output format, and test control.
6
+ */
7
+ import * as readline from 'readline';
8
+ import * as output from './output.js';
9
+ /**
10
+ * Create a readline interface for prompting.
11
+ */
12
+ function createPrompt() {
13
+ return readline.createInterface({
14
+ input: process.stdin,
15
+ output: process.stdout,
16
+ });
17
+ }
18
+ /**
19
+ * Ask a question and wait for user input.
20
+ */
21
+ function ask(rl, question) {
22
+ return new Promise((resolve) => {
23
+ rl.question(question, (answer) => {
24
+ resolve(answer.trim());
25
+ });
26
+ });
27
+ }
28
+ /**
29
+ * Present numbered options and get user selection.
30
+ */
31
+ async function selectOption(rl, prompt, options) {
32
+ output.info(prompt);
33
+ output.numberedList(options);
34
+ // eslint-disable-next-line no-constant-condition
35
+ while (true) {
36
+ const input = await ask(rl, `Enter choice (1-${options.length}): `);
37
+ const num = parseInt(input, 10);
38
+ if (num >= 1 && num <= options.length) {
39
+ return num - 1;
40
+ }
41
+ output.info(`Invalid choice. Please enter a number between 1 and ${options.length}.`);
42
+ }
43
+ }
44
+ /**
45
+ * Present yes/no question.
46
+ */
47
+ async function confirm(rl, prompt, defaultValue = false) {
48
+ const suffix = defaultValue ? '[Y/n]' : '[y/N]';
49
+ const input = await ask(rl, `${prompt} ${suffix}: `);
50
+ if (!input) {
51
+ return defaultValue;
52
+ }
53
+ return input.toLowerCase() === 'y' || input.toLowerCase() === 'yes';
54
+ }
55
+ /**
56
+ * Available personas for selection.
57
+ * These match the built-in personas in src/persona/builtins.ts
58
+ */
59
+ const AVAILABLE_PERSONAS = [
60
+ { name: 'technical_writer', description: 'Clear, accurate documentation focused' },
61
+ { name: 'security_tester', description: 'Security-focused boundary and injection testing' },
62
+ { name: 'qa_engineer', description: 'Thorough test coverage and edge cases' },
63
+ { name: 'novice_user', description: 'Beginner-friendly, accessibility focused' },
64
+ ];
65
+ /**
66
+ * Output format options.
67
+ */
68
+ const OUTPUT_FORMATS = [
69
+ { value: 'markdown', description: 'AGENTS.md documentation file' },
70
+ { value: 'json', description: 'JSON report file' },
71
+ { value: 'both', description: 'Both markdown and JSON' },
72
+ ];
73
+ /**
74
+ * Prompt user for interactive configuration.
75
+ */
76
+ export async function promptForConfig(existingConfig, providedCommand, providedArgs) {
77
+ const rl = createPrompt();
78
+ try {
79
+ output.info('\n=== Bellwether Interactive Mode ===\n');
80
+ // Server command
81
+ let serverCommand = providedCommand || '';
82
+ let serverArgs = providedArgs || [];
83
+ if (!serverCommand) {
84
+ output.info('Enter the command to start your MCP server.');
85
+ output.info('Examples:');
86
+ output.info(' npx @modelcontextprotocol/server-filesystem /path/to/dir');
87
+ output.info(' python mcp_server.py');
88
+ output.info(' node my-server.js\n');
89
+ const fullCommand = await ask(rl, 'Server command: ');
90
+ if (!fullCommand) {
91
+ throw new Error('Server command is required');
92
+ }
93
+ const parts = fullCommand.split(/\s+/);
94
+ serverCommand = parts[0];
95
+ serverArgs = parts.slice(1);
96
+ }
97
+ // Persona selection
98
+ output.info('\nSelect personas to use during testing:');
99
+ const selectedPersonas = [];
100
+ for (const persona of AVAILABLE_PERSONAS) {
101
+ const selected = await confirm(rl, ` Use ${persona.name}? (${persona.description})`, existingConfig.interview.personas?.includes(persona.name) ?? persona.name === 'technical_writer');
102
+ if (selected) {
103
+ selectedPersonas.push(persona.name);
104
+ }
105
+ }
106
+ if (selectedPersonas.length === 0) {
107
+ output.info('No personas selected. Using default "technical_writer" persona.');
108
+ selectedPersonas.push('technical_writer');
109
+ }
110
+ // Output format
111
+ output.info('\nSelect output format:');
112
+ const formatIndex = await selectOption(rl, '', OUTPUT_FORMATS.map((f) => `${f.value} - ${f.description}`));
113
+ const outputFormat = OUTPUT_FORMATS[formatIndex].value;
114
+ // Output directory
115
+ const outputDir = await ask(rl, '\nOutput directory [.]: ') || '.';
116
+ // Max questions per tool
117
+ const maxQuestionsInput = await ask(rl, `\nMax questions per tool [${existingConfig.interview.maxQuestionsPerTool}]: `);
118
+ const maxQuestions = maxQuestionsInput
119
+ ? parseInt(maxQuestionsInput, 10)
120
+ : existingConfig.interview.maxQuestionsPerTool;
121
+ // Baseline options
122
+ const saveBaseline = await confirm(rl, '\nSave baseline for future drift detection?', true);
123
+ let baselinePath;
124
+ if (saveBaseline) {
125
+ baselinePath = await ask(rl, 'Baseline path [bellwether-baseline.json]: ') || 'bellwether-baseline.json';
126
+ }
127
+ const compareBaseline = await ask(rl, '\nCompare against existing baseline (leave empty to skip): ');
128
+ return {
129
+ serverCommand,
130
+ serverArgs,
131
+ selectedPersonas,
132
+ outputFormat,
133
+ outputDir,
134
+ saveBaseline,
135
+ baselinePath,
136
+ compareBaseline: compareBaseline || undefined,
137
+ maxQuestions,
138
+ };
139
+ }
140
+ finally {
141
+ rl.close();
142
+ }
143
+ }
144
+ /**
145
+ * Create a pause controller for test control.
146
+ */
147
+ export function createPauseController() {
148
+ let paused = false;
149
+ let resumePromiseResolve = null;
150
+ return {
151
+ get isPaused() {
152
+ return paused;
153
+ },
154
+ pause() {
155
+ paused = true;
156
+ output.info('\n[Test paused. Press Enter to resume, or Ctrl+C to abort]');
157
+ },
158
+ resume() {
159
+ paused = false;
160
+ if (resumePromiseResolve) {
161
+ resumePromiseResolve();
162
+ resumePromiseResolve = null;
163
+ }
164
+ output.info('[Resumed]');
165
+ },
166
+ async waitIfPaused() {
167
+ if (!paused)
168
+ return;
169
+ return new Promise((resolve) => {
170
+ resumePromiseResolve = resolve;
171
+ });
172
+ },
173
+ };
174
+ }
175
+ /**
176
+ * Setup keyboard listener for pause/resume during test.
177
+ */
178
+ export function setupInteractiveKeyboard(controller) {
179
+ const rl = createPrompt();
180
+ // Don't block the process
181
+ rl.on('line', () => {
182
+ if (controller.isPaused) {
183
+ controller.resume();
184
+ }
185
+ else {
186
+ controller.pause();
187
+ }
188
+ });
189
+ // Handle SIGINT gracefully
190
+ rl.on('SIGINT', () => {
191
+ output.info('\nTest aborted by user.');
192
+ process.exit(130);
193
+ });
194
+ return () => {
195
+ rl.close();
196
+ };
197
+ }
198
+ /**
199
+ * Display a summary of the interactive configuration.
200
+ */
201
+ export function displayConfigSummary(config) {
202
+ output.info('\n=== Configuration Summary ===');
203
+ output.info(`Server: ${config.serverCommand} ${config.serverArgs.join(' ')}`);
204
+ output.info(`Personas: ${config.selectedPersonas.join(', ')}`);
205
+ output.info(`Output format: ${config.outputFormat}`);
206
+ output.info(`Output directory: ${config.outputDir}`);
207
+ output.info(`Max questions: ${config.maxQuestions ?? 'default'}`);
208
+ if (config.saveBaseline) {
209
+ output.info(`Save baseline: ${config.baselinePath}`);
210
+ }
211
+ if (config.compareBaseline) {
212
+ output.info(`Compare baseline: ${config.compareBaseline}`);
213
+ }
214
+ output.newline();
215
+ }
216
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Terminal formatting helpers for check command output.
3
+ */
4
+ import type { InterviewResult, ToolProfile } from '../../interview/types.js';
5
+ import type { ToolProgressSummary } from '../../interview/interviewer.js';
6
+ export interface CheckSummary {
7
+ fullyTested: number;
8
+ skipped: string[];
9
+ mocked: string[];
10
+ issueTools: string[];
11
+ lines: string[];
12
+ nextSteps: string[];
13
+ }
14
+ export declare function formatToolResultLine(summary: ToolProgressSummary): string;
15
+ export declare function buildCheckSummary(result: InterviewResult): CheckSummary;
16
+ export declare function formatConfidenceLevel(level?: 'high' | 'medium' | 'low'): string;
17
+ export declare function colorizeConfidence(label: string, level?: 'high' | 'medium' | 'low'): string;
18
+ export declare function profileHasIssues(profile: ToolProfile): boolean;
19
+ //# sourceMappingURL=terminal-reporter.d.ts.map
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Terminal formatting helpers for check command output.
3
+ */
4
+ import chalk from 'chalk';
5
+ import { RELIABILITY_DISPLAY, CONFIDENCE_INDICATORS, DISPLAY_LIMITS } from '../../constants.js';
6
+ import { getOutputConfig } from '../output.js';
7
+ export function formatToolResultLine(summary) {
8
+ const statusSymbol = resolveStatusSymbol(summary);
9
+ const toolLabel = summary.toolName;
10
+ const base = `${statusSymbol} ${toolLabel}`;
11
+ if (summary.skipped) {
12
+ const reason = summary.skipReason ?? 'Skipped: external service not configured';
13
+ return `${base} skipped (${reason})`;
14
+ }
15
+ const passPart = `${summary.passedTests}/${summary.totalTests} passed`;
16
+ const validationPart = summary.validationTotal > 0
17
+ ? ` (validation: ${summary.validationPassed}/${summary.validationTotal})`
18
+ : '';
19
+ const timingPart = summary.avgMs > 0 ? ` (${summary.avgMs}ms avg)` : '';
20
+ const mockPart = summary.mocked
21
+ ? ` (mocked${summary.mockService ? `: ${summary.mockService}` : ''})`
22
+ : '';
23
+ return `${base} ${passPart}${validationPart}${mockPart}${timingPart}`;
24
+ }
25
+ export function buildCheckSummary(result) {
26
+ const toolProfiles = result.toolProfiles;
27
+ const skipped = toolProfiles.filter(p => p.skipped).map(p => p.name);
28
+ const mocked = toolProfiles.filter(p => p.mocked).map(p => p.name);
29
+ const issueTools = toolProfiles.filter(profileHasIssues).map(p => p.name);
30
+ const fullyTested = toolProfiles.filter(p => !p.skipped && !p.mocked).length;
31
+ const lines = [];
32
+ lines.push('Summary:');
33
+ lines.push(`✓ ${fullyTested} tools fully tested`);
34
+ if (skipped.length > 0) {
35
+ lines.push(`⚠ ${skipped.length} tools skipped`);
36
+ }
37
+ if (mocked.length > 0) {
38
+ lines.push(`⚠ ${mocked.length} tools mocked`);
39
+ }
40
+ if (issueTools.length > 0) {
41
+ lines.push(`✗ ${issueTools.length} tools have issues`);
42
+ }
43
+ const nextSteps = [];
44
+ const externalServices = result.metadata.externalServices;
45
+ if (externalServices?.unconfiguredServices.length) {
46
+ const services = externalServices.unconfiguredServices.join(', ');
47
+ nextSteps.push(`Configure ${services} credentials to test skipped tools`);
48
+ }
49
+ if (issueTools.length > 0) {
50
+ const issueList = issueTools.slice(0, DISPLAY_LIMITS.SUMMARY_ISSUE_PREVIEW).join(', ');
51
+ const extra = issueTools.length > DISPLAY_LIMITS.SUMMARY_ISSUE_PREVIEW ? '...' : '';
52
+ nextSteps.push(`Review issues in CONTRACT.md (${issueList}${extra})`);
53
+ }
54
+ if (mocked.length > 0) {
55
+ nextSteps.push('Re-run with real credentials to confirm mocked tool behavior');
56
+ }
57
+ return { fullyTested, skipped, mocked, issueTools, lines, nextSteps };
58
+ }
59
+ export function formatConfidenceLevel(level) {
60
+ if (!level) {
61
+ return '-';
62
+ }
63
+ const indicator = CONFIDENCE_INDICATORS[level];
64
+ return `${indicator} ${level.toUpperCase()}`;
65
+ }
66
+ export function colorizeConfidence(label, level) {
67
+ if (!level || !supportsColor()) {
68
+ return label;
69
+ }
70
+ switch (level) {
71
+ case 'high':
72
+ return chalk.green(label);
73
+ case 'medium':
74
+ return chalk.yellow(label);
75
+ case 'low':
76
+ return chalk.red(label);
77
+ }
78
+ }
79
+ export function profileHasIssues(profile) {
80
+ return profile.interactions.some(i => !i.mocked && i.outcomeAssessment && !i.outcomeAssessment.correct);
81
+ }
82
+ function resolveStatusSymbol(summary) {
83
+ if (summary.skipped) {
84
+ return RELIABILITY_DISPLAY.SYMBOLS.WARN;
85
+ }
86
+ if (summary.totalTests === 0) {
87
+ return RELIABILITY_DISPLAY.SYMBOLS.WARN;
88
+ }
89
+ if (summary.passedTests === summary.totalTests) {
90
+ return RELIABILITY_DISPLAY.SYMBOLS.PASS;
91
+ }
92
+ if (summary.passedTests === 0) {
93
+ return RELIABILITY_DISPLAY.SYMBOLS.FAIL;
94
+ }
95
+ return RELIABILITY_DISPLAY.SYMBOLS.WARN;
96
+ }
97
+ function supportsColor() {
98
+ const config = getOutputConfig();
99
+ if (config.noColor) {
100
+ return false;
101
+ }
102
+ return process.stderr.isTTY ?? false;
103
+ }
104
+ //# sourceMappingURL=terminal-reporter.js.map
@@ -0,0 +1,226 @@
1
+ /**
2
+ * CLI Output Module
3
+ *
4
+ * Provides structured output for CLI commands with support for:
5
+ * - Different message types (info, success, error, warning)
6
+ * - Quiet mode to suppress non-essential output
7
+ * - Consistent formatting across all commands
8
+ *
9
+ * This module is for USER-FACING output only. For diagnostic/debug logging,
10
+ * use the logging module (src/logging/logger.ts).
11
+ */
12
+ /**
13
+ * Output configuration options.
14
+ */
15
+ export interface OutputConfig {
16
+ /** Suppress non-essential output */
17
+ quiet?: boolean;
18
+ /** Disable colored output */
19
+ noColor?: boolean;
20
+ }
21
+ /**
22
+ * Configure global output settings.
23
+ */
24
+ export declare function configureOutput(config: OutputConfig): void;
25
+ /**
26
+ * Get current output configuration.
27
+ */
28
+ export declare function getOutputConfig(): OutputConfig;
29
+ /**
30
+ * Reset output configuration to defaults.
31
+ */
32
+ export declare function resetOutput(): void;
33
+ /**
34
+ * Check if output is in quiet mode.
35
+ */
36
+ export declare function isQuiet(): boolean;
37
+ /**
38
+ * Standard information output.
39
+ * Use for progress messages, status updates, and general information.
40
+ */
41
+ export declare function info(message: string): void;
42
+ /**
43
+ * Success message output.
44
+ * Use for completion messages and positive confirmations.
45
+ */
46
+ export declare function success(message: string): void;
47
+ /**
48
+ * Warning message output.
49
+ * Always shown (not suppressed by quiet mode) as warnings are important.
50
+ */
51
+ export declare function warn(message: string): void;
52
+ /**
53
+ * Error message output.
54
+ * Always shown (not suppressed by quiet mode) as errors are critical.
55
+ */
56
+ export declare function error(message: string): void;
57
+ /**
58
+ * Debug output (only shown in verbose mode).
59
+ * For detailed information during development/troubleshooting.
60
+ */
61
+ export declare function debug(message: string, verbose?: boolean): void;
62
+ /**
63
+ * Print a blank line for formatting.
64
+ */
65
+ export declare function newline(): void;
66
+ /**
67
+ * Print multiple lines.
68
+ */
69
+ export declare function lines(...messages: string[]): void;
70
+ /**
71
+ * Print formatted JSON output.
72
+ * Always shown as this is typically requested data output.
73
+ */
74
+ export declare function json(data: unknown): void;
75
+ /**
76
+ * Print a section header.
77
+ */
78
+ export declare function section(title: string): void;
79
+ /**
80
+ * Print a key-value pair.
81
+ */
82
+ export declare function keyValue(key: string, value: string | number | boolean | undefined): void;
83
+ /**
84
+ * Print a list item.
85
+ */
86
+ export declare function listItem(item: string, indent?: number): void;
87
+ /**
88
+ * Print numbered list items.
89
+ */
90
+ export declare function numberedList(items: string[], startIndex?: number): void;
91
+ /**
92
+ * Create a scoped output instance for a specific command.
93
+ * Useful for commands that need to track their own quiet state.
94
+ */
95
+ export declare function createOutput(config?: OutputConfig): Output;
96
+ /**
97
+ * Output class for scoped output with its own configuration.
98
+ */
99
+ export declare class Output {
100
+ private config;
101
+ constructor(config?: OutputConfig);
102
+ info(message: string): void;
103
+ success(message: string): void;
104
+ warn(message: string): void;
105
+ error(message: string): void;
106
+ debug(message: string, verbose?: boolean): void;
107
+ newline(): void;
108
+ lines(...messages: string[]): void;
109
+ json(data: unknown): void;
110
+ section(title: string): void;
111
+ keyValue(key: string, value: string | number | boolean | undefined): void;
112
+ listItem(item: string, indent?: number): void;
113
+ numberedList(items: string[], startIndex?: number): void;
114
+ }
115
+ /**
116
+ * Streaming text display configuration.
117
+ */
118
+ export interface StreamingDisplayConfig {
119
+ /** Prefix to show before streaming output */
120
+ prefix?: string;
121
+ /** Suffix to show after streaming completes */
122
+ suffix?: string;
123
+ /** Whether to show a spinner during streaming */
124
+ showSpinner?: boolean;
125
+ /** Maximum line width before wrapping */
126
+ maxWidth?: number;
127
+ /** Stream to write to (defaults to stdout) */
128
+ stream?: NodeJS.WriteStream;
129
+ /** Color/style for the streaming text */
130
+ style?: 'dim' | 'normal' | 'bright';
131
+ }
132
+ /**
133
+ * Streaming display controller for real-time LLM output.
134
+ * Provides clean, formatted output during streaming operations.
135
+ */
136
+ export declare class StreamingDisplay {
137
+ private config;
138
+ private stream;
139
+ private buffer;
140
+ private lineLength;
141
+ private isActive;
142
+ private quietMode;
143
+ constructor(config?: StreamingDisplayConfig);
144
+ /**
145
+ * Start streaming display with optional prefix.
146
+ */
147
+ start(prefix?: string): void;
148
+ /**
149
+ * Write a chunk of streaming text.
150
+ */
151
+ write(chunk: string): void;
152
+ /**
153
+ * Complete the streaming display.
154
+ */
155
+ finish(suffix?: string): string;
156
+ /**
157
+ * Abort the streaming display (e.g., on error).
158
+ */
159
+ abort(message?: string): void;
160
+ /**
161
+ * Get the complete buffer content.
162
+ */
163
+ getBuffer(): string;
164
+ /**
165
+ * Check if streaming is currently active.
166
+ */
167
+ isStreaming(): boolean;
168
+ }
169
+ /**
170
+ * Create a streaming display for interview operations.
171
+ * Provides context-appropriate prefixes and styling.
172
+ */
173
+ export declare function createStreamingDisplay(operation: 'generating' | 'analyzing' | 'synthesizing', context?: string): StreamingDisplay;
174
+ /**
175
+ * Simple streaming callback that writes to stdout.
176
+ * Use this for basic streaming output without the full StreamingDisplay.
177
+ */
178
+ export declare function createStreamingCallback(prefix?: string): {
179
+ onStart: (operation: string, context?: string) => void;
180
+ onChunk: (chunk: string, operation: string) => void;
181
+ onComplete: (text: string, operation: string) => void;
182
+ onError: (error: Error, operation: string) => void;
183
+ };
184
+ /**
185
+ * Diff summary data used for displaying comparison results.
186
+ */
187
+ export interface DiffSummary {
188
+ severity: string;
189
+ toolsAdded: number;
190
+ toolsRemoved: number;
191
+ toolsModified: number;
192
+ behaviorChanges: number;
193
+ }
194
+ /**
195
+ * Get the icon for a severity level.
196
+ */
197
+ export declare function getSeverityIcon(severity: string): string;
198
+ /**
199
+ * Default export for convenient importing.
200
+ */
201
+ declare const _default: {
202
+ configureOutput: typeof configureOutput;
203
+ getOutputConfig: typeof getOutputConfig;
204
+ resetOutput: typeof resetOutput;
205
+ isQuiet: typeof isQuiet;
206
+ info: typeof info;
207
+ success: typeof success;
208
+ warn: typeof warn;
209
+ error: typeof error;
210
+ debug: typeof debug;
211
+ newline: typeof newline;
212
+ lines: typeof lines;
213
+ json: typeof json;
214
+ section: typeof section;
215
+ keyValue: typeof keyValue;
216
+ listItem: typeof listItem;
217
+ numberedList: typeof numberedList;
218
+ createOutput: typeof createOutput;
219
+ Output: typeof Output;
220
+ StreamingDisplay: typeof StreamingDisplay;
221
+ createStreamingDisplay: typeof createStreamingDisplay;
222
+ createStreamingCallback: typeof createStreamingCallback;
223
+ getSeverityIcon: typeof getSeverityIcon;
224
+ };
225
+ export default _default;
226
+ //# sourceMappingURL=output.d.ts.map