@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,223 @@
1
+ /**
2
+ * Upload command for uploading baselines to Bellwether Cloud.
3
+ *
4
+ * Can read baseline path from bellwether.yaml config.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { existsSync, readFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { getSessionToken, getLinkedProject } from '../../cloud/auth.js';
10
+ import { createCloudClient } from '../../cloud/client.js';
11
+ import { loadBaseline } from '../../baseline/saver.js';
12
+ import { convertToCloudBaseline } from '../../baseline/converter.js';
13
+ import { loadConfig } from '../../config/loader.js';
14
+ import { PATHS, EXIT_CODES } from '../../constants.js';
15
+ import * as output from '../output.js';
16
+ import { getSeverityIcon } from '../output.js';
17
+ /**
18
+ * Default baseline file name.
19
+ */
20
+ const DEFAULT_BASELINE_FILE = PATHS.DEFAULT_BASELINE_FILE;
21
+ /**
22
+ * Try to get baseline config from config file.
23
+ * Returns output directory and optional baseline path from config.
24
+ */
25
+ function getBaselineConfigFromFile(configPath) {
26
+ try {
27
+ const config = loadConfig(configPath);
28
+ return {
29
+ outputDir: config.output.dir,
30
+ baselinePath: config.baseline.path,
31
+ };
32
+ }
33
+ catch {
34
+ return { outputDir: '.' };
35
+ }
36
+ }
37
+ export const uploadCommand = new Command('upload')
38
+ .description('Upload a baseline to Bellwether Cloud')
39
+ .argument('[baseline]', `Path to baseline JSON file (default: ${DEFAULT_BASELINE_FILE})`)
40
+ .option('-b, --baseline <path>', 'Path to baseline JSON file')
41
+ .option('-c, --config <path>', 'Path to config file')
42
+ .option('-p, --project <id>', 'Project ID to upload to (uses linked project if not specified)')
43
+ .option('--ci', 'CI mode - output URL only, exit 1 on breaking drift')
44
+ .option('--session <session>', 'Session token (overrides stored/env session)')
45
+ .option('--fail-on-drift', 'Exit with error if any behavioral drift detected')
46
+ .action(async (baselineArg, options) => {
47
+ // Get config settings
48
+ const configSettings = getBaselineConfigFromFile(options.config);
49
+ const outputDir = configSettings.outputDir;
50
+ // Determine baseline path with priority:
51
+ // 1. Positional argument
52
+ // 2. --baseline flag
53
+ // 3. baseline.path from config
54
+ // 4. Default file in output.dir
55
+ // 5. Default file in current directory
56
+ let baselinePath = baselineArg ?? options.baseline ?? configSettings.baselinePath;
57
+ if (!baselinePath) {
58
+ const configBaseline = join(outputDir, DEFAULT_BASELINE_FILE);
59
+ if (existsSync(configBaseline)) {
60
+ baselinePath = configBaseline;
61
+ }
62
+ else {
63
+ baselinePath = DEFAULT_BASELINE_FILE;
64
+ }
65
+ }
66
+ const isCiMode = options.ci;
67
+ // Get session
68
+ const sessionToken = options.session ?? getSessionToken();
69
+ if (!sessionToken) {
70
+ if (isCiMode) {
71
+ output.error('BELLWETHER_SESSION not set');
72
+ process.exit(EXIT_CODES.ERROR);
73
+ }
74
+ output.error('Not authenticated. Run `bellwether login` first or set BELLWETHER_SESSION.');
75
+ process.exit(EXIT_CODES.ERROR);
76
+ }
77
+ // Check baseline file exists
78
+ if (!existsSync(baselinePath)) {
79
+ if (isCiMode) {
80
+ output.error(`Baseline not found: ${baselinePath}`);
81
+ process.exit(EXIT_CODES.ERROR);
82
+ }
83
+ output.error(`Baseline file not found: ${baselinePath}`);
84
+ output.error('\nCreate a baseline first:');
85
+ output.error(' 1. Run `bellwether check` (with output.format: json in config)');
86
+ output.error(' 2. Run `bellwether baseline save`');
87
+ process.exit(EXIT_CODES.ERROR);
88
+ }
89
+ // Determine project ID
90
+ let projectId = options.project;
91
+ if (!projectId) {
92
+ const link = getLinkedProject();
93
+ if (link) {
94
+ projectId = link.projectId;
95
+ if (!isCiMode) {
96
+ output.info(`Using linked project: ${link.projectName}`);
97
+ }
98
+ }
99
+ }
100
+ if (!projectId) {
101
+ if (isCiMode) {
102
+ output.error('No project specified');
103
+ process.exit(EXIT_CODES.ERROR);
104
+ }
105
+ output.error('No project specified.');
106
+ output.error('\nEither:');
107
+ output.error(' - Use --project <id> to specify a project');
108
+ output.error(' - Run `bellwether link` to link this directory to a project');
109
+ process.exit(EXIT_CODES.ERROR);
110
+ }
111
+ // Load and convert baseline
112
+ let cloudBaseline;
113
+ try {
114
+ // Try loading as cloud baseline first
115
+ const content = readFileSync(baselinePath, 'utf-8');
116
+ const parsed = JSON.parse(content);
117
+ if (parsed.version === '1.0' && parsed.metadata?.formatVersion === '1.0') {
118
+ // Already in cloud format
119
+ cloudBaseline = parsed;
120
+ }
121
+ else {
122
+ // Convert from local format
123
+ const localBaseline = loadBaseline(baselinePath);
124
+ cloudBaseline = convertToCloudBaseline(localBaseline);
125
+ }
126
+ }
127
+ catch (error) {
128
+ if (isCiMode) {
129
+ output.error(`Failed to load baseline: ${error instanceof Error ? error.message : error}`);
130
+ process.exit(EXIT_CODES.ERROR);
131
+ }
132
+ output.error('Failed to load baseline: ' + (error instanceof Error ? error.message : String(error)));
133
+ process.exit(EXIT_CODES.ERROR);
134
+ }
135
+ // Create client and upload
136
+ const client = createCloudClient({ sessionToken });
137
+ if (!client.isAuthenticated()) {
138
+ if (isCiMode) {
139
+ output.error('Authentication failed');
140
+ process.exit(EXIT_CODES.ERROR);
141
+ }
142
+ output.error('Authentication failed. Run `bellwether login` to re-authenticate.');
143
+ process.exit(EXIT_CODES.ERROR);
144
+ }
145
+ if (!isCiMode) {
146
+ output.info(`Uploading baseline to project ${projectId}...`);
147
+ }
148
+ try {
149
+ const result = await client.uploadBaseline(projectId, cloudBaseline);
150
+ if (isCiMode) {
151
+ // CI mode - minimal output
152
+ output.info(result.viewUrl);
153
+ // Check for drift
154
+ if (result.version > 1) {
155
+ const diff = await client.getLatestDiff(projectId);
156
+ if (diff) {
157
+ if (diff.severity === 'breaking') {
158
+ output.error('Breaking changes detected');
159
+ process.exit(EXIT_CODES.ERROR);
160
+ }
161
+ if (options.failOnDrift && diff.severity !== 'none') {
162
+ output.error(`Behavioral drift detected: ${diff.severity}`);
163
+ process.exit(EXIT_CODES.ERROR);
164
+ }
165
+ }
166
+ }
167
+ }
168
+ else {
169
+ // Interactive mode - detailed output
170
+ output.info(`\nUpload successful!`);
171
+ output.info(`Version: ${result.version}`);
172
+ output.info(`View: ${result.viewUrl}`);
173
+ if (result.diffUrl) {
174
+ output.info(`Diff: ${result.diffUrl}`);
175
+ // Show diff summary
176
+ const diff = await client.getLatestDiff(projectId);
177
+ if (diff) {
178
+ output.info('\nChanges from previous version:');
179
+ printDiffSummary(diff);
180
+ if (diff.severity === 'breaking') {
181
+ output.info('\n⚠️ Breaking changes detected!');
182
+ }
183
+ }
184
+ }
185
+ else {
186
+ output.info('\nThis is the first baseline for this project.');
187
+ }
188
+ }
189
+ }
190
+ catch (error) {
191
+ if (isCiMode) {
192
+ output.error(`Upload failed: ${error instanceof Error ? error.message : error}`);
193
+ process.exit(EXIT_CODES.ERROR);
194
+ }
195
+ output.error('Upload failed: ' + (error instanceof Error ? error.message : String(error)));
196
+ process.exit(EXIT_CODES.ERROR);
197
+ }
198
+ });
199
+ /**
200
+ * Print a diff summary in human-readable format (verbose format).
201
+ */
202
+ function printDiffSummary(diff) {
203
+ output.info(` Severity: ${getSeverityIcon(diff.severity)} ${diff.severity}`);
204
+ if (diff.toolsAdded > 0) {
205
+ output.info(` Tools added: +${diff.toolsAdded}`);
206
+ }
207
+ if (diff.toolsRemoved > 0) {
208
+ output.info(` Tools removed: -${diff.toolsRemoved}`);
209
+ }
210
+ if (diff.toolsModified > 0) {
211
+ output.info(` Tools modified: ~${diff.toolsModified}`);
212
+ }
213
+ if (diff.behaviorChanges > 0) {
214
+ output.info(` Behavior changes: ${diff.behaviorChanges}`);
215
+ }
216
+ if (diff.toolsAdded === 0 &&
217
+ diff.toolsRemoved === 0 &&
218
+ diff.toolsModified === 0 &&
219
+ diff.behaviorChanges === 0) {
220
+ output.info(' No changes detected');
221
+ }
222
+ }
223
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * validate-config command - Validate bellwether.yaml without running tests.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const validateConfigCommand: Command;
6
+ //# sourceMappingURL=validate-config.d.ts.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * validate-config command - Validate bellwether.yaml without running tests.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { loadConfig, ConfigNotFoundError } from '../../config/loader.js';
6
+ import { getConfigWarnings } from '../../config/validator.js';
7
+ import { EXIT_CODES, PATHS } from '../../constants.js';
8
+ import * as output from '../output.js';
9
+ export const validateConfigCommand = new Command('validate-config')
10
+ .description('Validate bellwether.yaml configuration without running tests')
11
+ .option('-c, --config <path>', 'Path to config file', PATHS.DEFAULT_CONFIG_FILENAME)
12
+ .action((options) => {
13
+ try {
14
+ const config = loadConfig(options.config);
15
+ output.success('Configuration is valid.');
16
+ const warnings = getConfigWarnings(config);
17
+ if (warnings.length > 0) {
18
+ output.warn('Configuration warnings:');
19
+ for (const warning of warnings) {
20
+ output.warn(` - ${warning}`);
21
+ }
22
+ }
23
+ process.exit(EXIT_CODES.CLEAN);
24
+ }
25
+ catch (error) {
26
+ if (error instanceof ConfigNotFoundError) {
27
+ output.error(error.message);
28
+ }
29
+ else {
30
+ output.error(error instanceof Error ? error.message : String(error));
31
+ }
32
+ process.exit(EXIT_CODES.ERROR);
33
+ }
34
+ });
35
+ //# sourceMappingURL=validate-config.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Verify command - generate verification reports for the Verified by Bellwether program.
3
+ */
4
+ import { Command } from 'commander';
5
+ /**
6
+ * Create a new verify command instance.
7
+ * Useful for testing where fresh command instances are needed.
8
+ */
9
+ export declare function createVerifyCommand(): Command;
10
+ export declare const verifyCommand: Command;
11
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Verify command - generate verification reports for the Verified by Bellwether program.
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import { writeFile } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import { generateVerificationReport, generateBadgeUrl, generateBadgeMarkdown, } from '../../verification/index.js';
9
+ import { Interviewer, DEFAULT_CONFIG } from '../../interview/interviewer.js';
10
+ import { MCPClient } from '../../transport/mcp-client.js';
11
+ import { discover } from '../../discovery/discovery.js';
12
+ import { createLLMClient, DEFAULT_MODELS } from '../../llm/index.js';
13
+ import { loadConfig, ConfigNotFoundError } from '../../config/loader.js';
14
+ import { CostTracker } from '../../cost/index.js';
15
+ import { BUILTIN_PERSONAS } from '../../persona/builtins.js';
16
+ import { EXIT_CODES, PATHS } from '../../constants.js';
17
+ import * as output from '../output.js';
18
+ import { InterviewProgressBar } from '../utils/progress.js';
19
+ import { createCloudClient } from '../../cloud/client.js';
20
+ import { getLinkedProject, getSessionToken } from '../../cloud/auth.js';
21
+ // Convert BUILTIN_PERSONAS record to array
22
+ const ALL_PERSONAS = Object.values(BUILTIN_PERSONAS);
23
+ /**
24
+ * Create a new verify command instance.
25
+ * Useful for testing where fresh command instances are needed.
26
+ */
27
+ export function createVerifyCommand() {
28
+ return new Command('verify')
29
+ .description('Generate a verification report for the Verified by Bellwether program')
30
+ .argument('[server-command]', 'Server command (overrides config)')
31
+ .argument('[args...]', 'Server arguments')
32
+ .option('-c, --config <path>', 'Path to config file', PATHS.DEFAULT_CONFIG_FILENAME)
33
+ .option('-o, --output <dir>', 'Output directory')
34
+ .option('--server-id <id>', 'Server identifier (namespace/name)')
35
+ .option('--version <version>', 'Server version to verify')
36
+ .option('--tier <tier>', 'Target verification tier (bronze, silver, gold, platinum)')
37
+ .option('--security', 'Include security testing (required for gold+ tiers)')
38
+ .option('--json', 'Output verification result as JSON')
39
+ .option('--badge-only', 'Only output badge URL')
40
+ .option('-p, --project <id>', 'Project ID to submit verification to (requires login)')
41
+ .action(async (serverCommandArg, serverArgs, options) => {
42
+ await handleVerify(serverCommandArg, serverArgs, options);
43
+ });
44
+ }
45
+ export const verifyCommand = createVerifyCommand();
46
+ async function handleVerify(serverCommandArg, serverArgs, options) {
47
+ output.info(chalk.bold('\n🔒 Bellwether Verification\n'));
48
+ // Load configuration
49
+ let bellwetherConfig;
50
+ try {
51
+ bellwetherConfig = loadConfig(options.config);
52
+ }
53
+ catch (error) {
54
+ if (error instanceof ConfigNotFoundError) {
55
+ output.error(error.message);
56
+ process.exit(EXIT_CODES.ERROR);
57
+ }
58
+ throw error;
59
+ }
60
+ // Determine server command (CLI arg overrides config)
61
+ const serverCommand = serverCommandArg || bellwetherConfig.server.command;
62
+ const args = serverArgs.length > 0 ? serverArgs : bellwetherConfig.server.args;
63
+ if (!serverCommand) {
64
+ output.error('Error: No server command provided.');
65
+ output.error('Either specify a server command as an argument or configure it in bellwether.yaml');
66
+ process.exit(EXIT_CODES.ERROR);
67
+ }
68
+ // Get LLM settings from config
69
+ const provider = bellwetherConfig.llm.provider;
70
+ const model = bellwetherConfig.llm.model || undefined;
71
+ const outputDir = options.output ?? bellwetherConfig.output.dir;
72
+ const serverTimeout = bellwetherConfig.server.timeout;
73
+ const serverEnv = bellwetherConfig.server.env;
74
+ const targetTier = (options.tier ?? bellwetherConfig.verify.tier);
75
+ const includeSecurity = options.security ? true : bellwetherConfig.verify.security;
76
+ const outputJson = options.json ? true : bellwetherConfig.verify.json;
77
+ const badgeOnly = options.badgeOnly ? true : bellwetherConfig.verify.badgeOnly;
78
+ // Initialize cost tracker
79
+ const effectiveModel = model || DEFAULT_MODELS[provider];
80
+ const costTracker = new CostTracker(effectiveModel);
81
+ // Create LLM client with usage tracking
82
+ let llm;
83
+ try {
84
+ llm = createLLMClient({
85
+ provider: provider,
86
+ model,
87
+ onUsage: (inputTokens, outputTokens) => {
88
+ costTracker.addUsage(inputTokens, outputTokens);
89
+ },
90
+ });
91
+ }
92
+ catch {
93
+ output.error(chalk.red('Error: Could not create LLM client. Check your API keys.'));
94
+ process.exit(EXIT_CODES.ERROR);
95
+ }
96
+ output.info(chalk.gray(`Using model: ${effectiveModel}`));
97
+ // Connect to server
98
+ output.info(chalk.gray(`Connecting to ${serverCommand} ${args.join(' ')}...`));
99
+ const client = new MCPClient({ timeout: serverTimeout });
100
+ try {
101
+ await client.connect(serverCommand, args, serverEnv);
102
+ const discovery = await discover(client, serverCommand, args);
103
+ output.info(chalk.green(`✓ Connected to ${discovery.serverInfo.name} v${discovery.serverInfo.version}`));
104
+ output.info(chalk.gray(` ${discovery.tools.length} tools, ${discovery.prompts.length} prompts, ${(discovery.resources ?? []).length} resources`));
105
+ output.newline();
106
+ // Determine personas based on tier and security option
107
+ const personas = selectPersonasForTier(targetTier, includeSecurity);
108
+ output.info(chalk.gray(`Target tier: ${targetTier}`));
109
+ output.info(chalk.gray(`Using personas: ${personas.map((p) => p.name).join(', ')}`));
110
+ output.newline();
111
+ // Run interview
112
+ output.info(chalk.bold('Running verification test...\n'));
113
+ const interviewer = new Interviewer(llm, {
114
+ ...DEFAULT_CONFIG,
115
+ personas,
116
+ maxQuestionsPerTool: targetTier === 'platinum' ? 5 : targetTier === 'gold' ? 4 : 3,
117
+ });
118
+ // Set up progress bar
119
+ const progressBar = new InterviewProgressBar({ enabled: !output.isQuiet() });
120
+ const progressCallback = (progress) => {
121
+ if (progress.phase === 'starting') {
122
+ progressBar.start(progress.totalTools, progress.totalPersonas, progress.totalPrompts ?? 0, progress.totalResources ?? 0);
123
+ }
124
+ else if (['interviewing', 'prompts', 'resources'].includes(progress.phase)) {
125
+ progressBar.update(progress);
126
+ }
127
+ else if (progress.phase === 'complete' || progress.phase === 'synthesizing') {
128
+ progressBar.stop();
129
+ }
130
+ };
131
+ const interview = await interviewer.interview(client, discovery, progressCallback);
132
+ progressBar.stop();
133
+ output.newline();
134
+ output.info(chalk.green('✓ Test complete'));
135
+ // Display cost summary
136
+ const costEstimate = costTracker.getCost();
137
+ const usage = costEstimate.usage;
138
+ if (usage.totalTokens > 0) {
139
+ const costStr = costEstimate.costUSD > 0
140
+ ? `$${costEstimate.costUSD.toFixed(4)}`
141
+ : 'Free (local model)';
142
+ output.info(chalk.gray(` Tokens: ${usage.totalTokens.toLocaleString()} (${usage.inputTokens.toLocaleString()} in, ${usage.outputTokens.toLocaleString()} out)`));
143
+ output.info(chalk.gray(` Estimated cost: ${costStr}`));
144
+ }
145
+ output.newline();
146
+ // Generate verification
147
+ const serverId = options.serverId ?? `${discovery.serverInfo.name}`;
148
+ const verificationConfig = {
149
+ serverId,
150
+ version: options.version ?? discovery.serverInfo.version,
151
+ targetTier,
152
+ includeSecurity,
153
+ outputDir,
154
+ };
155
+ const report = generateVerificationReport(interview, verificationConfig);
156
+ const result = report.result;
157
+ // Output results
158
+ if (badgeOnly) {
159
+ output.info(generateBadgeUrl(result));
160
+ return;
161
+ }
162
+ if (outputJson) {
163
+ output.json(report);
164
+ return;
165
+ }
166
+ // Display verification result
167
+ displayVerificationResult(result);
168
+ // Save report
169
+ const reportPath = join(outputDir, bellwetherConfig.output.files.verificationReport);
170
+ await writeFile(reportPath, JSON.stringify(report, null, 2));
171
+ output.info(chalk.gray(`\nReport saved to: ${reportPath}`));
172
+ // Display badge
173
+ output.info('\n' + chalk.bold('Badge:'));
174
+ output.info(chalk.cyan(generateBadgeUrl(result)));
175
+ output.newline();
176
+ output.info(chalk.bold('Markdown:'));
177
+ output.info(chalk.gray(generateBadgeMarkdown(result)));
178
+ // Submit to cloud if project ID is specified
179
+ const projectId = options.project ?? getLinkedProject()?.projectId;
180
+ if (projectId) {
181
+ output.newline();
182
+ // Check if logged in
183
+ if (!getSessionToken()) {
184
+ output.warn(chalk.yellow('⚠ Not logged in. Run `bellwether login` to submit verification to the platform.'));
185
+ }
186
+ else {
187
+ output.info(chalk.gray('Submitting verification to platform...'));
188
+ try {
189
+ const cloudClient = createCloudClient();
190
+ // Convert local result to cloud format
191
+ const cloudResult = {
192
+ serverId: result.serverId,
193
+ version: result.version,
194
+ status: result.status,
195
+ tier: result.tier,
196
+ verifiedAt: result.verifiedAt,
197
+ expiresAt: result.expiresAt,
198
+ toolsVerified: result.toolsVerified,
199
+ testsPassed: result.testsPassed,
200
+ testsTotal: result.testsTotal,
201
+ passRate: result.passRate,
202
+ reportHash: result.reportHash,
203
+ bellwetherVersion: result.bellwetherVersion,
204
+ };
205
+ const submission = await cloudClient.submitVerification(projectId, cloudResult, report);
206
+ output.info(chalk.green(`✓ Verification submitted successfully`));
207
+ output.info(chalk.gray(` View at: ${submission.viewUrl}`));
208
+ }
209
+ catch (submitError) {
210
+ output.error(chalk.red(`Failed to submit verification: ${submitError instanceof Error ? submitError.message : 'Unknown error'}`));
211
+ // Don't exit with error - local verification succeeded
212
+ }
213
+ }
214
+ }
215
+ // Exit with appropriate code
216
+ if (result.status !== 'verified') {
217
+ process.exit(EXIT_CODES.ERROR);
218
+ }
219
+ }
220
+ catch (error) {
221
+ output.error(chalk.red(`\nError: ${error instanceof Error ? error.message : 'Unknown error'}`));
222
+ process.exit(EXIT_CODES.ERROR);
223
+ }
224
+ finally {
225
+ await client.disconnect();
226
+ }
227
+ }
228
+ function selectPersonasForTier(tier, includeSecurity) {
229
+ switch (tier) {
230
+ case 'platinum':
231
+ // All personas including security
232
+ return ALL_PERSONAS;
233
+ case 'gold':
234
+ // Technical Writer, QA Engineer, Security Tester
235
+ if (includeSecurity) {
236
+ return ALL_PERSONAS.filter((p) => ['technical_writer', 'qa_engineer', 'security_tester'].includes(p.id));
237
+ }
238
+ return ALL_PERSONAS.filter((p) => ['technical_writer', 'qa_engineer', 'novice_user'].includes(p.id));
239
+ case 'silver':
240
+ // Technical Writer and QA Engineer
241
+ return ALL_PERSONAS.filter((p) => ['technical_writer', 'qa_engineer'].includes(p.id));
242
+ case 'bronze':
243
+ default:
244
+ // Just Technical Writer
245
+ return ALL_PERSONAS.filter((p) => p.id === 'technical_writer');
246
+ }
247
+ }
248
+ function displayVerificationResult(result) {
249
+ const statusColor = result.status === 'verified' ? chalk.green : chalk.red;
250
+ const tierColor = getTierChalk(result.tier);
251
+ output.info('─'.repeat(60));
252
+ output.newline();
253
+ output.info(chalk.bold('Verification Result'));
254
+ output.newline();
255
+ output.info(` Server: ${result.serverId} v${result.version}`);
256
+ output.info(` Status: ${statusColor(result.status.toUpperCase())}`);
257
+ if (result.tier) {
258
+ output.info(` Tier: ${tierColor(result.tier.toUpperCase())}`);
259
+ }
260
+ output.newline();
261
+ output.info(` Pass Rate: ${result.passRate}% (${result.testsPassed}/${result.testsTotal} tests)`);
262
+ output.info(` Tools: ${result.toolsVerified} verified`);
263
+ output.newline();
264
+ output.info(` Verified: ${new Date(result.verifiedAt).toLocaleDateString()}`);
265
+ output.info(` Expires: ${new Date(result.expiresAt).toLocaleDateString()}`);
266
+ output.newline();
267
+ output.info('─'.repeat(60));
268
+ }
269
+ function getTierChalk(tier) {
270
+ switch (tier) {
271
+ case 'platinum':
272
+ return (text) => chalk.cyan(text);
273
+ case 'gold':
274
+ return (text) => chalk.yellow(text);
275
+ case 'silver':
276
+ return (text) => chalk.gray(text);
277
+ case 'bronze':
278
+ return (text) => chalk.hex('#CD7F32')(text);
279
+ default:
280
+ return (text) => text;
281
+ }
282
+ }
283
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Watch command - watch for file changes and auto-check.
3
+ *
4
+ * Uses bellwether.yaml for configuration.
5
+ * Only watch-specific options are available as flags.
6
+ *
7
+ * Note: Watch mode only runs schema validation (check mode).
8
+ * For LLM-powered exploration, use 'bellwether explore' directly.
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare const watchCommand: Command;
12
+ //# sourceMappingURL=watch.d.ts.map