@opensip-cli/fitness 0.1.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 (576) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/baseline-plane.test.d.ts +12 -0
  5. package/dist/__tests__/baseline-plane.test.d.ts.map +1 -0
  6. package/dist/__tests__/baseline-plane.test.js +63 -0
  7. package/dist/__tests__/baseline-plane.test.js.map +1 -0
  8. package/dist/__tests__/check-utils.test.d.ts +10 -0
  9. package/dist/__tests__/check-utils.test.d.ts.map +1 -0
  10. package/dist/__tests__/check-utils.test.js +193 -0
  11. package/dist/__tests__/check-utils.test.js.map +1 -0
  12. package/dist/__tests__/fingerprint-parity.test.d.ts +14 -0
  13. package/dist/__tests__/fingerprint-parity.test.d.ts.map +1 -0
  14. package/dist/__tests__/fingerprint-parity.test.js +59 -0
  15. package/dist/__tests__/fingerprint-parity.test.js.map +1 -0
  16. package/dist/__tests__/fit-execute-opts.test.d.ts +15 -0
  17. package/dist/__tests__/fit-execute-opts.test.d.ts.map +1 -0
  18. package/dist/__tests__/fit-execute-opts.test.js +124 -0
  19. package/dist/__tests__/fit-execute-opts.test.js.map +1 -0
  20. package/dist/__tests__/public-api.test.d.ts +19 -0
  21. package/dist/__tests__/public-api.test.d.ts.map +1 -0
  22. package/dist/__tests__/public-api.test.js +85 -0
  23. package/dist/__tests__/public-api.test.js.map +1 -0
  24. package/dist/__tests__/tool.test.d.ts +10 -0
  25. package/dist/__tests__/tool.test.d.ts.map +1 -0
  26. package/dist/__tests__/tool.test.js +57 -0
  27. package/dist/__tests__/tool.test.js.map +1 -0
  28. package/dist/baseline-strategy.d.ts +21 -0
  29. package/dist/baseline-strategy.d.ts.map +1 -0
  30. package/dist/baseline-strategy.js +21 -0
  31. package/dist/baseline-strategy.js.map +1 -0
  32. package/dist/check-utils/display.d.ts +52 -0
  33. package/dist/check-utils/display.d.ts.map +1 -0
  34. package/dist/check-utils/display.js +66 -0
  35. package/dist/check-utils/display.js.map +1 -0
  36. package/dist/check-utils/index.d.ts +17 -0
  37. package/dist/check-utils/index.d.ts.map +1 -0
  38. package/dist/check-utils/index.js +13 -0
  39. package/dist/check-utils/index.js.map +1 -0
  40. package/dist/check-utils/path-matching.d.ts +40 -0
  41. package/dist/check-utils/path-matching.d.ts.map +1 -0
  42. package/dist/check-utils/path-matching.js +38 -0
  43. package/dist/check-utils/path-matching.js.map +1 -0
  44. package/dist/check-utils/source-analysis.d.ts +36 -0
  45. package/dist/check-utils/source-analysis.d.ts.map +1 -0
  46. package/dist/check-utils/source-analysis.js +44 -0
  47. package/dist/check-utils/source-analysis.js.map +1 -0
  48. package/dist/check-utils/test-helpers.d.ts +57 -0
  49. package/dist/check-utils/test-helpers.d.ts.map +1 -0
  50. package/dist/check-utils/test-helpers.js +71 -0
  51. package/dist/check-utils/test-helpers.js.map +1 -0
  52. package/dist/cli/__tests__/fit-gate-mode.test.d.ts +14 -0
  53. package/dist/cli/__tests__/fit-gate-mode.test.d.ts.map +1 -0
  54. package/dist/cli/__tests__/fit-gate-mode.test.js +110 -0
  55. package/dist/cli/__tests__/fit-gate-mode.test.js.map +1 -0
  56. package/dist/cli/__tests__/fit-modes-live.test.d.ts +13 -0
  57. package/dist/cli/__tests__/fit-modes-live.test.d.ts.map +1 -0
  58. package/dist/cli/__tests__/fit-modes-live.test.js +182 -0
  59. package/dist/cli/__tests__/fit-modes-live.test.js.map +1 -0
  60. package/dist/cli/__tests__/report-data.test.d.ts +12 -0
  61. package/dist/cli/__tests__/report-data.test.d.ts.map +1 -0
  62. package/dist/cli/__tests__/report-data.test.js +113 -0
  63. package/dist/cli/__tests__/report-data.test.js.map +1 -0
  64. package/dist/cli/fit/__tests__/display-fold.test.d.ts +8 -0
  65. package/dist/cli/fit/__tests__/display-fold.test.d.ts.map +1 -0
  66. package/dist/cli/fit/__tests__/display-fold.test.js +87 -0
  67. package/dist/cli/fit/__tests__/display-fold.test.js.map +1 -0
  68. package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts +16 -0
  69. package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts.map +1 -0
  70. package/dist/cli/fit/__tests__/gate-resolved-config.test.js +62 -0
  71. package/dist/cli/fit/__tests__/gate-resolved-config.test.js.map +1 -0
  72. package/dist/cli/fit/check-loader.d.ts +37 -0
  73. package/dist/cli/fit/check-loader.d.ts.map +1 -0
  74. package/dist/cli/fit/check-loader.js +154 -0
  75. package/dist/cli/fit/check-loader.js.map +1 -0
  76. package/dist/cli/fit/config-loader.d.ts +55 -0
  77. package/dist/cli/fit/config-loader.d.ts.map +1 -0
  78. package/dist/cli/fit/config-loader.js +107 -0
  79. package/dist/cli/fit/config-loader.js.map +1 -0
  80. package/dist/cli/fit/display-registry.d.ts +19 -0
  81. package/dist/cli/fit/display-registry.d.ts.map +1 -0
  82. package/dist/cli/fit/display-registry.js +33 -0
  83. package/dist/cli/fit/display-registry.js.map +1 -0
  84. package/dist/cli/fit/envelope-view.d.ts +49 -0
  85. package/dist/cli/fit/envelope-view.d.ts.map +1 -0
  86. package/dist/cli/fit/envelope-view.js +85 -0
  87. package/dist/cli/fit/envelope-view.js.map +1 -0
  88. package/dist/cli/fit/fit-aux-command-specs.d.ts +35 -0
  89. package/dist/cli/fit/fit-aux-command-specs.d.ts.map +1 -0
  90. package/dist/cli/fit/fit-aux-command-specs.js +110 -0
  91. package/dist/cli/fit/fit-aux-command-specs.js.map +1 -0
  92. package/dist/cli/fit/fit-command-spec.d.ts +24 -0
  93. package/dist/cli/fit/fit-command-spec.d.ts.map +1 -0
  94. package/dist/cli/fit/fit-command-spec.js +131 -0
  95. package/dist/cli/fit/fit-command-spec.js.map +1 -0
  96. package/dist/cli/fit/gate-compare-render.d.ts +13 -0
  97. package/dist/cli/fit/gate-compare-render.d.ts.map +1 -0
  98. package/dist/cli/fit/gate-compare-render.js +87 -0
  99. package/dist/cli/fit/gate-compare-render.js.map +1 -0
  100. package/dist/cli/fit/recipe-selector.d.ts +53 -0
  101. package/dist/cli/fit/recipe-selector.d.ts.map +1 -0
  102. package/dist/cli/fit/recipe-selector.js +106 -0
  103. package/dist/cli/fit/recipe-selector.js.map +1 -0
  104. package/dist/cli/fit/recipe-selector.test.d.ts +2 -0
  105. package/dist/cli/fit/recipe-selector.test.d.ts.map +1 -0
  106. package/dist/cli/fit/recipe-selector.test.js +69 -0
  107. package/dist/cli/fit/recipe-selector.test.js.map +1 -0
  108. package/dist/cli/fit/resolved-fitness-config.d.ts +48 -0
  109. package/dist/cli/fit/resolved-fitness-config.d.ts.map +1 -0
  110. package/dist/cli/fit/resolved-fitness-config.js +46 -0
  111. package/dist/cli/fit/resolved-fitness-config.js.map +1 -0
  112. package/dist/cli/fit/result-builders.d.ts +91 -0
  113. package/dist/cli/fit/result-builders.d.ts.map +1 -0
  114. package/dist/cli/fit/result-builders.js +206 -0
  115. package/dist/cli/fit/result-builders.js.map +1 -0
  116. package/dist/cli/fit-list.d.ts +7 -0
  117. package/dist/cli/fit-list.d.ts.map +1 -0
  118. package/dist/cli/fit-list.js +24 -0
  119. package/dist/cli/fit-list.js.map +1 -0
  120. package/dist/cli/fit-modes.d.ts +42 -0
  121. package/dist/cli/fit-modes.d.ts.map +1 -0
  122. package/dist/cli/fit-modes.js +322 -0
  123. package/dist/cli/fit-modes.js.map +1 -0
  124. package/dist/cli/fit-recipes.d.ts +7 -0
  125. package/dist/cli/fit-recipes.d.ts.map +1 -0
  126. package/dist/cli/fit-recipes.js +34 -0
  127. package/dist/cli/fit-recipes.js.map +1 -0
  128. package/dist/cli/fit-runner-views.d.ts +33 -0
  129. package/dist/cli/fit-runner-views.d.ts.map +1 -0
  130. package/dist/cli/fit-runner-views.js +92 -0
  131. package/dist/cli/fit-runner-views.js.map +1 -0
  132. package/dist/cli/fit-runner.d.ts +44 -0
  133. package/dist/cli/fit-runner.d.ts.map +1 -0
  134. package/dist/cli/fit-runner.js +250 -0
  135. package/dist/cli/fit-runner.js.map +1 -0
  136. package/dist/cli/fit-worker.d.ts +26 -0
  137. package/dist/cli/fit-worker.d.ts.map +1 -0
  138. package/dist/cli/fit-worker.js +67 -0
  139. package/dist/cli/fit-worker.js.map +1 -0
  140. package/dist/cli/fit.d.ts +74 -0
  141. package/dist/cli/fit.d.ts.map +1 -0
  142. package/dist/cli/fit.js +149 -0
  143. package/dist/cli/fit.js.map +1 -0
  144. package/dist/cli/report-data.d.ts +44 -0
  145. package/dist/cli/report-data.d.ts.map +1 -0
  146. package/dist/cli/report-data.js +89 -0
  147. package/dist/cli/report-data.js.map +1 -0
  148. package/dist/config/__tests__/fitness-config-schema.test.d.ts +6 -0
  149. package/dist/config/__tests__/fitness-config-schema.test.d.ts.map +1 -0
  150. package/dist/config/__tests__/fitness-config-schema.test.js +37 -0
  151. package/dist/config/__tests__/fitness-config-schema.test.js.map +1 -0
  152. package/dist/config/fitness-config-schema.d.ts +48 -0
  153. package/dist/config/fitness-config-schema.d.ts.map +1 -0
  154. package/dist/config/fitness-config-schema.js +62 -0
  155. package/dist/config/fitness-config-schema.js.map +1 -0
  156. package/dist/framework/__tests__/abortable-exec.test.d.ts +9 -0
  157. package/dist/framework/__tests__/abortable-exec.test.d.ts.map +1 -0
  158. package/dist/framework/__tests__/abortable-exec.test.js +102 -0
  159. package/dist/framework/__tests__/abortable-exec.test.js.map +1 -0
  160. package/dist/framework/__tests__/check-config.test.d.ts +2 -0
  161. package/dist/framework/__tests__/check-config.test.d.ts.map +1 -0
  162. package/dist/framework/__tests__/check-config.test.js +56 -0
  163. package/dist/framework/__tests__/check-config.test.js.map +1 -0
  164. package/dist/framework/__tests__/check-types.test.d.ts +2 -0
  165. package/dist/framework/__tests__/check-types.test.d.ts.map +1 -0
  166. package/dist/framework/__tests__/check-types.test.js +76 -0
  167. package/dist/framework/__tests__/check-types.test.js.map +1 -0
  168. package/dist/framework/__tests__/command-executor.test.d.ts +2 -0
  169. package/dist/framework/__tests__/command-executor.test.d.ts.map +1 -0
  170. package/dist/framework/__tests__/command-executor.test.js +110 -0
  171. package/dist/framework/__tests__/command-executor.test.js.map +1 -0
  172. package/dist/framework/__tests__/content-filter-dispatch.test.d.ts +2 -0
  173. package/dist/framework/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
  174. package/dist/framework/__tests__/content-filter-dispatch.test.js +122 -0
  175. package/dist/framework/__tests__/content-filter-dispatch.test.js.map +1 -0
  176. package/dist/framework/__tests__/define-check.test.d.ts +2 -0
  177. package/dist/framework/__tests__/define-check.test.d.ts.map +1 -0
  178. package/dist/framework/__tests__/define-check.test.js +402 -0
  179. package/dist/framework/__tests__/define-check.test.js.map +1 -0
  180. package/dist/framework/__tests__/define-regex-list-check.test.d.ts +15 -0
  181. package/dist/framework/__tests__/define-regex-list-check.test.d.ts.map +1 -0
  182. package/dist/framework/__tests__/define-regex-list-check.test.js +299 -0
  183. package/dist/framework/__tests__/define-regex-list-check.test.js.map +1 -0
  184. package/dist/framework/__tests__/directive-inventory.test.d.ts +2 -0
  185. package/dist/framework/__tests__/directive-inventory.test.d.ts.map +1 -0
  186. package/dist/framework/__tests__/directive-inventory.test.js +111 -0
  187. package/dist/framework/__tests__/directive-inventory.test.js.map +1 -0
  188. package/dist/framework/__tests__/directive-parsing.test.d.ts +13 -0
  189. package/dist/framework/__tests__/directive-parsing.test.d.ts.map +1 -0
  190. package/dist/framework/__tests__/directive-parsing.test.js +86 -0
  191. package/dist/framework/__tests__/directive-parsing.test.js.map +1 -0
  192. package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts +2 -0
  193. package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts.map +1 -0
  194. package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.js +56 -0
  195. package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.js.map +1 -0
  196. package/dist/framework/__tests__/execution-context.test.d.ts +2 -0
  197. package/dist/framework/__tests__/execution-context.test.d.ts.map +1 -0
  198. package/dist/framework/__tests__/execution-context.test.js +140 -0
  199. package/dist/framework/__tests__/execution-context.test.js.map +1 -0
  200. package/dist/framework/__tests__/file-accessor.test.d.ts +2 -0
  201. package/dist/framework/__tests__/file-accessor.test.d.ts.map +1 -0
  202. package/dist/framework/__tests__/file-accessor.test.js +106 -0
  203. package/dist/framework/__tests__/file-accessor.test.js.map +1 -0
  204. package/dist/framework/__tests__/file-cache.test.d.ts +2 -0
  205. package/dist/framework/__tests__/file-cache.test.d.ts.map +1 -0
  206. package/dist/framework/__tests__/file-cache.test.js +122 -0
  207. package/dist/framework/__tests__/file-cache.test.js.map +1 -0
  208. package/dist/framework/__tests__/file-type-filter.test.d.ts +9 -0
  209. package/dist/framework/__tests__/file-type-filter.test.d.ts.map +1 -0
  210. package/dist/framework/__tests__/file-type-filter.test.js +39 -0
  211. package/dist/framework/__tests__/file-type-filter.test.js.map +1 -0
  212. package/dist/framework/__tests__/ignore-processing.test.d.ts +11 -0
  213. package/dist/framework/__tests__/ignore-processing.test.d.ts.map +1 -0
  214. package/dist/framework/__tests__/ignore-processing.test.js +175 -0
  215. package/dist/framework/__tests__/ignore-processing.test.js.map +1 -0
  216. package/dist/framework/__tests__/import-graph.test.d.ts +15 -0
  217. package/dist/framework/__tests__/import-graph.test.d.ts.map +1 -0
  218. package/dist/framework/__tests__/import-graph.test.js +164 -0
  219. package/dist/framework/__tests__/import-graph.test.js.map +1 -0
  220. package/dist/framework/__tests__/memory-profiler.test.d.ts +9 -0
  221. package/dist/framework/__tests__/memory-profiler.test.d.ts.map +1 -0
  222. package/dist/framework/__tests__/memory-profiler.test.js +108 -0
  223. package/dist/framework/__tests__/memory-profiler.test.js.map +1 -0
  224. package/dist/framework/__tests__/parse-cache.test.d.ts +9 -0
  225. package/dist/framework/__tests__/parse-cache.test.d.ts.map +1 -0
  226. package/dist/framework/__tests__/parse-cache.test.js +51 -0
  227. package/dist/framework/__tests__/parse-cache.test.js.map +1 -0
  228. package/dist/framework/__tests__/path-matcher.test.d.ts +2 -0
  229. package/dist/framework/__tests__/path-matcher.test.d.ts.map +1 -0
  230. package/dist/framework/__tests__/path-matcher.test.js +113 -0
  231. package/dist/framework/__tests__/path-matcher.test.js.map +1 -0
  232. package/dist/framework/__tests__/register-helpers.test.d.ts +2 -0
  233. package/dist/framework/__tests__/register-helpers.test.d.ts.map +1 -0
  234. package/dist/framework/__tests__/register-helpers.test.js +51 -0
  235. package/dist/framework/__tests__/register-helpers.test.js.map +1 -0
  236. package/dist/framework/__tests__/registry.test.d.ts +2 -0
  237. package/dist/framework/__tests__/registry.test.d.ts.map +1 -0
  238. package/dist/framework/__tests__/registry.test.js +211 -0
  239. package/dist/framework/__tests__/registry.test.js.map +1 -0
  240. package/dist/framework/__tests__/result-builder.test.d.ts +2 -0
  241. package/dist/framework/__tests__/result-builder.test.d.ts.map +1 -0
  242. package/dist/framework/__tests__/result-builder.test.js +153 -0
  243. package/dist/framework/__tests__/result-builder.test.js.map +1 -0
  244. package/dist/framework/__tests__/scope-registry.test.d.ts +8 -0
  245. package/dist/framework/__tests__/scope-registry.test.d.ts.map +1 -0
  246. package/dist/framework/__tests__/scope-registry.test.js +156 -0
  247. package/dist/framework/__tests__/scope-registry.test.js.map +1 -0
  248. package/dist/framework/__tests__/scope-resolver.golden.test.d.ts +2 -0
  249. package/dist/framework/__tests__/scope-resolver.golden.test.d.ts.map +1 -0
  250. package/dist/framework/__tests__/scope-resolver.golden.test.js +105 -0
  251. package/dist/framework/__tests__/scope-resolver.golden.test.js.map +1 -0
  252. package/dist/framework/__tests__/scope-resolver.test.d.ts +2 -0
  253. package/dist/framework/__tests__/scope-resolver.test.d.ts.map +1 -0
  254. package/dist/framework/__tests__/scope-resolver.test.js +150 -0
  255. package/dist/framework/__tests__/scope-resolver.test.js.map +1 -0
  256. package/dist/framework/__tests__/severity-mapping.test.d.ts +2 -0
  257. package/dist/framework/__tests__/severity-mapping.test.d.ts.map +1 -0
  258. package/dist/framework/__tests__/severity-mapping.test.js +74 -0
  259. package/dist/framework/__tests__/severity-mapping.test.js.map +1 -0
  260. package/dist/framework/__tests__/strip-literals.test.d.ts +2 -0
  261. package/dist/framework/__tests__/strip-literals.test.d.ts.map +1 -0
  262. package/dist/framework/__tests__/strip-literals.test.js +87 -0
  263. package/dist/framework/__tests__/strip-literals.test.js.map +1 -0
  264. package/dist/framework/abortable-exec.d.ts +34 -0
  265. package/dist/framework/abortable-exec.d.ts.map +1 -0
  266. package/dist/framework/abortable-exec.js +143 -0
  267. package/dist/framework/abortable-exec.js.map +1 -0
  268. package/dist/framework/check-config.d.ts +175 -0
  269. package/dist/framework/check-config.d.ts.map +1 -0
  270. package/dist/framework/check-config.js +115 -0
  271. package/dist/framework/check-config.js.map +1 -0
  272. package/dist/framework/check-types.d.ts +82 -0
  273. package/dist/framework/check-types.d.ts.map +1 -0
  274. package/dist/framework/check-types.js +63 -0
  275. package/dist/framework/check-types.js.map +1 -0
  276. package/dist/framework/command-executor.d.ts +25 -0
  277. package/dist/framework/command-executor.d.ts.map +1 -0
  278. package/dist/framework/command-executor.js +63 -0
  279. package/dist/framework/command-executor.js.map +1 -0
  280. package/dist/framework/comment-openers.d.ts +11 -0
  281. package/dist/framework/comment-openers.d.ts.map +1 -0
  282. package/dist/framework/comment-openers.js +11 -0
  283. package/dist/framework/comment-openers.js.map +1 -0
  284. package/dist/framework/constants.d.ts +9 -0
  285. package/dist/framework/constants.d.ts.map +1 -0
  286. package/dist/framework/constants.js +16 -0
  287. package/dist/framework/constants.js.map +1 -0
  288. package/dist/framework/define-check.d.ts +38 -0
  289. package/dist/framework/define-check.d.ts.map +1 -0
  290. package/dist/framework/define-check.js +296 -0
  291. package/dist/framework/define-check.js.map +1 -0
  292. package/dist/framework/define-regex-list-check.d.ts +160 -0
  293. package/dist/framework/define-regex-list-check.d.ts.map +1 -0
  294. package/dist/framework/define-regex-list-check.js +177 -0
  295. package/dist/framework/define-regex-list-check.js.map +1 -0
  296. package/dist/framework/directive-inventory.d.ts +37 -0
  297. package/dist/framework/directive-inventory.d.ts.map +1 -0
  298. package/dist/framework/directive-inventory.js +82 -0
  299. package/dist/framework/directive-inventory.js.map +1 -0
  300. package/dist/framework/directive-parsing.d.ts +23 -0
  301. package/dist/framework/directive-parsing.d.ts.map +1 -0
  302. package/dist/framework/directive-parsing.js +39 -0
  303. package/dist/framework/directive-parsing.js.map +1 -0
  304. package/dist/framework/execution-context.d.ts +98 -0
  305. package/dist/framework/execution-context.d.ts.map +1 -0
  306. package/dist/framework/execution-context.js +145 -0
  307. package/dist/framework/execution-context.js.map +1 -0
  308. package/dist/framework/file-accessor.d.ts +20 -0
  309. package/dist/framework/file-accessor.d.ts.map +1 -0
  310. package/dist/framework/file-accessor.js +122 -0
  311. package/dist/framework/file-accessor.js.map +1 -0
  312. package/dist/framework/file-cache.d.ts +70 -0
  313. package/dist/framework/file-cache.d.ts.map +1 -0
  314. package/dist/framework/file-cache.js +199 -0
  315. package/dist/framework/file-cache.js.map +1 -0
  316. package/dist/framework/file-type-filter.d.ts +11 -0
  317. package/dist/framework/file-type-filter.d.ts.map +1 -0
  318. package/dist/framework/file-type-filter.js +21 -0
  319. package/dist/framework/file-type-filter.js.map +1 -0
  320. package/dist/framework/ignore-processing.d.ts +36 -0
  321. package/dist/framework/ignore-processing.d.ts.map +1 -0
  322. package/dist/framework/ignore-processing.js +172 -0
  323. package/dist/framework/ignore-processing.js.map +1 -0
  324. package/dist/framework/import-graph.d.ts +51 -0
  325. package/dist/framework/import-graph.d.ts.map +1 -0
  326. package/dist/framework/import-graph.js +217 -0
  327. package/dist/framework/import-graph.js.map +1 -0
  328. package/dist/framework/memory-profiler.d.ts +53 -0
  329. package/dist/framework/memory-profiler.d.ts.map +1 -0
  330. package/dist/framework/memory-profiler.js +92 -0
  331. package/dist/framework/memory-profiler.js.map +1 -0
  332. package/dist/framework/parse-cache.d.ts +24 -0
  333. package/dist/framework/parse-cache.d.ts.map +1 -0
  334. package/dist/framework/parse-cache.js +41 -0
  335. package/dist/framework/parse-cache.js.map +1 -0
  336. package/dist/framework/path-matcher.d.ts +86 -0
  337. package/dist/framework/path-matcher.d.ts.map +1 -0
  338. package/dist/framework/path-matcher.js +138 -0
  339. package/dist/framework/path-matcher.js.map +1 -0
  340. package/dist/framework/register-helpers.d.ts +11 -0
  341. package/dist/framework/register-helpers.d.ts.map +1 -0
  342. package/dist/framework/register-helpers.js +19 -0
  343. package/dist/framework/register-helpers.js.map +1 -0
  344. package/dist/framework/registry.d.ts +51 -0
  345. package/dist/framework/registry.d.ts.map +1 -0
  346. package/dist/framework/registry.js +131 -0
  347. package/dist/framework/registry.js.map +1 -0
  348. package/dist/framework/result-builder.d.ts +74 -0
  349. package/dist/framework/result-builder.d.ts.map +1 -0
  350. package/dist/framework/result-builder.js +154 -0
  351. package/dist/framework/result-builder.js.map +1 -0
  352. package/dist/framework/scope-registry.d.ts +38 -0
  353. package/dist/framework/scope-registry.d.ts.map +1 -0
  354. package/dist/framework/scope-registry.js +77 -0
  355. package/dist/framework/scope-registry.js.map +1 -0
  356. package/dist/framework/scope-resolver.d.ts +23 -0
  357. package/dist/framework/scope-resolver.d.ts.map +1 -0
  358. package/dist/framework/scope-resolver.js +102 -0
  359. package/dist/framework/scope-resolver.js.map +1 -0
  360. package/dist/framework/severity-mapping.d.ts +17 -0
  361. package/dist/framework/severity-mapping.d.ts.map +1 -0
  362. package/dist/framework/severity-mapping.js +71 -0
  363. package/dist/framework/severity-mapping.js.map +1 -0
  364. package/dist/framework/strip-literals.d.ts +73 -0
  365. package/dist/framework/strip-literals.d.ts.map +1 -0
  366. package/dist/framework/strip-literals.js +213 -0
  367. package/dist/framework/strip-literals.js.map +1 -0
  368. package/dist/index.d.ts +47 -0
  369. package/dist/index.d.ts.map +1 -0
  370. package/dist/index.js +64 -0
  371. package/dist/index.js.map +1 -0
  372. package/dist/internal.d.ts +17 -0
  373. package/dist/internal.d.ts.map +1 -0
  374. package/dist/internal.js +17 -0
  375. package/dist/internal.js.map +1 -0
  376. package/dist/persistence/session-payload.d.ts +68 -0
  377. package/dist/persistence/session-payload.d.ts.map +1 -0
  378. package/dist/persistence/session-payload.js +78 -0
  379. package/dist/persistence/session-payload.js.map +1 -0
  380. package/dist/persistence/session-payload.test.d.ts +11 -0
  381. package/dist/persistence/session-payload.test.d.ts.map +1 -0
  382. package/dist/persistence/session-payload.test.js +80 -0
  383. package/dist/persistence/session-payload.test.js.map +1 -0
  384. package/dist/persistence/session-replay.d.ts +14 -0
  385. package/dist/persistence/session-replay.d.ts.map +1 -0
  386. package/dist/persistence/session-replay.js +85 -0
  387. package/dist/persistence/session-replay.js.map +1 -0
  388. package/dist/persistence/session-replay.test.d.ts +10 -0
  389. package/dist/persistence/session-replay.test.d.ts.map +1 -0
  390. package/dist/persistence/session-replay.test.js +171 -0
  391. package/dist/persistence/session-replay.test.js.map +1 -0
  392. package/dist/plugins/__tests__/check-package-discovery.test.d.ts +2 -0
  393. package/dist/plugins/__tests__/check-package-discovery.test.d.ts.map +1 -0
  394. package/dist/plugins/__tests__/check-package-discovery.test.js +48 -0
  395. package/dist/plugins/__tests__/check-package-discovery.test.js.map +1 -0
  396. package/dist/plugins/__tests__/lang-domain.test.d.ts +2 -0
  397. package/dist/plugins/__tests__/lang-domain.test.d.ts.map +1 -0
  398. package/dist/plugins/__tests__/lang-domain.test.js +192 -0
  399. package/dist/plugins/__tests__/lang-domain.test.js.map +1 -0
  400. package/dist/plugins/__tests__/loader.test.d.ts +2 -0
  401. package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
  402. package/dist/plugins/__tests__/loader.test.js +271 -0
  403. package/dist/plugins/__tests__/loader.test.js.map +1 -0
  404. package/dist/plugins/check-package-discovery.d.ts +19 -0
  405. package/dist/plugins/check-package-discovery.d.ts.map +1 -0
  406. package/dist/plugins/check-package-discovery.js +34 -0
  407. package/dist/plugins/check-package-discovery.js.map +1 -0
  408. package/dist/plugins/loader.d.ts +32 -0
  409. package/dist/plugins/loader.d.ts.map +1 -0
  410. package/dist/plugins/loader.js +198 -0
  411. package/dist/plugins/loader.js.map +1 -0
  412. package/dist/plugins/types.d.ts +29 -0
  413. package/dist/plugins/types.d.ts.map +1 -0
  414. package/dist/plugins/types.js +9 -0
  415. package/dist/plugins/types.js.map +1 -0
  416. package/dist/recipes/__tests__/built-in-recipes.test.d.ts +2 -0
  417. package/dist/recipes/__tests__/built-in-recipes.test.d.ts.map +1 -0
  418. package/dist/recipes/__tests__/built-in-recipes.test.js +93 -0
  419. package/dist/recipes/__tests__/built-in-recipes.test.js.map +1 -0
  420. package/dist/recipes/__tests__/check-config.test.d.ts +12 -0
  421. package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
  422. package/dist/recipes/__tests__/check-config.test.js +90 -0
  423. package/dist/recipes/__tests__/check-config.test.js.map +1 -0
  424. package/dist/recipes/__tests__/check-resolution.test.d.ts +2 -0
  425. package/dist/recipes/__tests__/check-resolution.test.d.ts.map +1 -0
  426. package/dist/recipes/__tests__/check-resolution.test.js +160 -0
  427. package/dist/recipes/__tests__/check-resolution.test.js.map +1 -0
  428. package/dist/recipes/__tests__/execution-branches.test.d.ts +10 -0
  429. package/dist/recipes/__tests__/execution-branches.test.d.ts.map +1 -0
  430. package/dist/recipes/__tests__/execution-branches.test.js +612 -0
  431. package/dist/recipes/__tests__/execution-branches.test.js.map +1 -0
  432. package/dist/recipes/__tests__/execution-paths.test.d.ts +10 -0
  433. package/dist/recipes/__tests__/execution-paths.test.d.ts.map +1 -0
  434. package/dist/recipes/__tests__/execution-paths.test.js +280 -0
  435. package/dist/recipes/__tests__/execution-paths.test.js.map +1 -0
  436. package/dist/recipes/__tests__/registry.test.d.ts +2 -0
  437. package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
  438. package/dist/recipes/__tests__/registry.test.js +89 -0
  439. package/dist/recipes/__tests__/registry.test.js.map +1 -0
  440. package/dist/recipes/__tests__/retry.test.d.ts +2 -0
  441. package/dist/recipes/__tests__/retry.test.d.ts.map +1 -0
  442. package/dist/recipes/__tests__/retry.test.js +75 -0
  443. package/dist/recipes/__tests__/retry.test.js.map +1 -0
  444. package/dist/recipes/__tests__/run-one-check.test.d.ts +14 -0
  445. package/dist/recipes/__tests__/run-one-check.test.d.ts.map +1 -0
  446. package/dist/recipes/__tests__/run-one-check.test.js +182 -0
  447. package/dist/recipes/__tests__/run-one-check.test.js.map +1 -0
  448. package/dist/recipes/__tests__/service.test.d.ts +11 -0
  449. package/dist/recipes/__tests__/service.test.d.ts.map +1 -0
  450. package/dist/recipes/__tests__/service.test.js +572 -0
  451. package/dist/recipes/__tests__/service.test.js.map +1 -0
  452. package/dist/recipes/built-in-recipes.d.ts +14 -0
  453. package/dist/recipes/built-in-recipes.d.ts.map +1 -0
  454. package/dist/recipes/built-in-recipes.js +241 -0
  455. package/dist/recipes/built-in-recipes.js.map +1 -0
  456. package/dist/recipes/check-config.d.ts +56 -0
  457. package/dist/recipes/check-config.d.ts.map +1 -0
  458. package/dist/recipes/check-config.js +61 -0
  459. package/dist/recipes/check-config.js.map +1 -0
  460. package/dist/recipes/check-resolution.d.ts +36 -0
  461. package/dist/recipes/check-resolution.d.ts.map +1 -0
  462. package/dist/recipes/check-resolution.js +81 -0
  463. package/dist/recipes/check-resolution.js.map +1 -0
  464. package/dist/recipes/check-result-processor.d.ts +51 -0
  465. package/dist/recipes/check-result-processor.d.ts.map +1 -0
  466. package/dist/recipes/check-result-processor.js +197 -0
  467. package/dist/recipes/check-result-processor.js.map +1 -0
  468. package/dist/recipes/parallel-execution.d.ts +38 -0
  469. package/dist/recipes/parallel-execution.d.ts.map +1 -0
  470. package/dist/recipes/parallel-execution.js +61 -0
  471. package/dist/recipes/parallel-execution.js.map +1 -0
  472. package/dist/recipes/registry.d.ts +47 -0
  473. package/dist/recipes/registry.d.ts.map +1 -0
  474. package/dist/recipes/registry.js +70 -0
  475. package/dist/recipes/registry.js.map +1 -0
  476. package/dist/recipes/retry.d.ts +29 -0
  477. package/dist/recipes/retry.d.ts.map +1 -0
  478. package/dist/recipes/retry.js +23 -0
  479. package/dist/recipes/retry.js.map +1 -0
  480. package/dist/recipes/run-one-check.d.ts +59 -0
  481. package/dist/recipes/run-one-check.d.ts.map +1 -0
  482. package/dist/recipes/run-one-check.js +174 -0
  483. package/dist/recipes/run-one-check.js.map +1 -0
  484. package/dist/recipes/sequential-execution.d.ts +12 -0
  485. package/dist/recipes/sequential-execution.d.ts.map +1 -0
  486. package/dist/recipes/sequential-execution.js +48 -0
  487. package/dist/recipes/sequential-execution.js.map +1 -0
  488. package/dist/recipes/service-types.d.ts +87 -0
  489. package/dist/recipes/service-types.d.ts.map +1 -0
  490. package/dist/recipes/service-types.js +8 -0
  491. package/dist/recipes/service-types.js.map +1 -0
  492. package/dist/recipes/service.d.ts +73 -0
  493. package/dist/recipes/service.d.ts.map +1 -0
  494. package/dist/recipes/service.js +438 -0
  495. package/dist/recipes/service.js.map +1 -0
  496. package/dist/recipes/types.d.ts +155 -0
  497. package/dist/recipes/types.d.ts.map +1 -0
  498. package/dist/recipes/types.js +56 -0
  499. package/dist/recipes/types.js.map +1 -0
  500. package/dist/scaffold/config-block.d.ts +17 -0
  501. package/dist/scaffold/config-block.d.ts.map +1 -0
  502. package/dist/scaffold/config-block.js +30 -0
  503. package/dist/scaffold/config-block.js.map +1 -0
  504. package/dist/scaffold/examples.d.ts +30 -0
  505. package/dist/scaffold/examples.d.ts.map +1 -0
  506. package/dist/scaffold/examples.js +129 -0
  507. package/dist/scaffold/examples.js.map +1 -0
  508. package/dist/scope-augmentation.d.ts +77 -0
  509. package/dist/scope-augmentation.d.ts.map +1 -0
  510. package/dist/scope-augmentation.js +31 -0
  511. package/dist/scope-augmentation.js.map +1 -0
  512. package/dist/signalers/__tests__/loader.test.d.ts +2 -0
  513. package/dist/signalers/__tests__/loader.test.d.ts.map +1 -0
  514. package/dist/signalers/__tests__/loader.test.js +141 -0
  515. package/dist/signalers/__tests__/loader.test.js.map +1 -0
  516. package/dist/signalers/__tests__/violation-to-signal.test.d.ts +2 -0
  517. package/dist/signalers/__tests__/violation-to-signal.test.d.ts.map +1 -0
  518. package/dist/signalers/__tests__/violation-to-signal.test.js +59 -0
  519. package/dist/signalers/__tests__/violation-to-signal.test.js.map +1 -0
  520. package/dist/signalers/index.d.ts +8 -0
  521. package/dist/signalers/index.d.ts.map +1 -0
  522. package/dist/signalers/index.js +9 -0
  523. package/dist/signalers/index.js.map +1 -0
  524. package/dist/signalers/loader.d.ts +30 -0
  525. package/dist/signalers/loader.d.ts.map +1 -0
  526. package/dist/signalers/loader.js +120 -0
  527. package/dist/signalers/loader.js.map +1 -0
  528. package/dist/signalers/schema.d.ts +60 -0
  529. package/dist/signalers/schema.d.ts.map +1 -0
  530. package/dist/signalers/schema.js +74 -0
  531. package/dist/signalers/schema.js.map +1 -0
  532. package/dist/signalers/types.d.ts +13 -0
  533. package/dist/signalers/types.d.ts.map +1 -0
  534. package/dist/signalers/types.js +5 -0
  535. package/dist/signalers/types.js.map +1 -0
  536. package/dist/signalers/violation-to-signal.d.ts +38 -0
  537. package/dist/signalers/violation-to-signal.d.ts.map +1 -0
  538. package/dist/signalers/violation-to-signal.js +43 -0
  539. package/dist/signalers/violation-to-signal.js.map +1 -0
  540. package/dist/targets/__tests__/loader.test.d.ts +2 -0
  541. package/dist/targets/__tests__/loader.test.d.ts.map +1 -0
  542. package/dist/targets/__tests__/loader.test.js +190 -0
  543. package/dist/targets/__tests__/loader.test.js.map +1 -0
  544. package/dist/targets/__tests__/target-registry.test.d.ts +2 -0
  545. package/dist/targets/__tests__/target-registry.test.d.ts.map +1 -0
  546. package/dist/targets/__tests__/target-registry.test.js +182 -0
  547. package/dist/targets/__tests__/target-registry.test.js.map +1 -0
  548. package/dist/targets/index.d.ts +18 -0
  549. package/dist/targets/index.d.ts.map +1 -0
  550. package/dist/targets/index.js +21 -0
  551. package/dist/targets/index.js.map +1 -0
  552. package/dist/targets/loader.d.ts +27 -0
  553. package/dist/targets/loader.d.ts.map +1 -0
  554. package/dist/targets/loader.js +178 -0
  555. package/dist/targets/loader.js.map +1 -0
  556. package/dist/targets/target-registry.d.ts +41 -0
  557. package/dist/targets/target-registry.d.ts.map +1 -0
  558. package/dist/targets/target-registry.js +71 -0
  559. package/dist/targets/target-registry.js.map +1 -0
  560. package/dist/targets/types.d.ts +14 -0
  561. package/dist/targets/types.d.ts.map +1 -0
  562. package/dist/targets/types.js +14 -0
  563. package/dist/targets/types.js.map +1 -0
  564. package/dist/tool.d.ts +61 -0
  565. package/dist/tool.d.ts.map +1 -0
  566. package/dist/tool.js +260 -0
  567. package/dist/tool.js.map +1 -0
  568. package/dist/types/findings.d.ts +113 -0
  569. package/dist/types/findings.d.ts.map +1 -0
  570. package/dist/types/findings.js +89 -0
  571. package/dist/types/findings.js.map +1 -0
  572. package/dist/types/severity.d.ts +15 -0
  573. package/dist/types/severity.d.ts.map +1 -0
  574. package/dist/types/severity.js +33 -0
  575. package/dist/types/severity.js.map +1 -0
  576. package/package.json +137 -0
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview fit's gate-compare human renderer (ADR-0036).
3
+ *
4
+ * Renders the generic host `GateCompareResult` (full-`Signal` added/resolved/
5
+ * unchanged buckets) to fit's plain-text gate-compare report. Byte-preserved from
6
+ * the pre-ADR-0036 `gate.ts` `renderGateCompareOutput` — only the bucket element
7
+ * type changed (`GateViolation` → `Signal`), and `Signal` carries the same
8
+ * `ruleId`/`filePath`/`line`/`message` fields the old renderer read.
9
+ */
10
+ import type { GateCompareResult } from '@opensip-cli/core';
11
+ /** Render fit's gate-compare report. Byte-preserved from the old gate.ts renderer. */
12
+ export declare function renderGateCompareOutput(result: GateCompareResult): string;
13
+ //# sourceMappingURL=gate-compare-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-compare-render.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/gate-compare-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,mBAAmB,CAAC;AAkEnE,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CASzE"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview fit's gate-compare human renderer (ADR-0036).
3
+ *
4
+ * Renders the generic host `GateCompareResult` (full-`Signal` added/resolved/
5
+ * unchanged buckets) to fit's plain-text gate-compare report. Byte-preserved from
6
+ * the pre-ADR-0036 `gate.ts` `renderGateCompareOutput` — only the bucket element
7
+ * type changed (`GateViolation` → `Signal`), and `Signal` carries the same
8
+ * `ruleId`/`filePath`/`line`/`message` fields the old renderer read.
9
+ */
10
+ function formatLocation(s) {
11
+ if (!s.filePath)
12
+ return '(no location)';
13
+ return s.line == null ? s.filePath : `${s.filePath}:${s.line}`;
14
+ }
15
+ function sortSignals(signals) {
16
+ return [...signals].sort((a, b) => {
17
+ if (a.ruleId !== b.ruleId)
18
+ return a.ruleId.localeCompare(b.ruleId);
19
+ if (a.filePath !== b.filePath)
20
+ return a.filePath.localeCompare(b.filePath);
21
+ return (a.line ?? 0) - (b.line ?? 0);
22
+ });
23
+ }
24
+ function truncate(s, max) {
25
+ if (s.length <= max)
26
+ return s;
27
+ return s.slice(0, max - 1) + '…';
28
+ }
29
+ /** `Added (n):` block — each entry plus its (truncated) message line. */
30
+ function renderAdded(added) {
31
+ if (added.length === 0)
32
+ return [];
33
+ const lines = [`Added (${added.length}):`];
34
+ for (const v of sortSignals(added)) {
35
+ lines.push(` ✗ ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
36
+ if (v.message && v.message !== v.ruleId)
37
+ lines.push(` ${truncate(v.message, 120)}`);
38
+ }
39
+ lines.push('');
40
+ return lines;
41
+ }
42
+ /** `Resolved (n):` block. */
43
+ function renderResolved(resolved) {
44
+ if (resolved.length === 0)
45
+ return [];
46
+ const lines = [`Resolved (${resolved.length}):`];
47
+ for (const v of sortSignals(resolved))
48
+ lines.push(` ✓ ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
49
+ lines.push('');
50
+ return lines;
51
+ }
52
+ /** `Unchanged (n):` block — truncated to the first 5 (usually long, not actionable). */
53
+ function renderUnchanged(unchanged) {
54
+ if (unchanged.length === 0)
55
+ return [];
56
+ const lines = [`Unchanged (${unchanged.length}):`];
57
+ const sample = sortSignals(unchanged).slice(0, 5);
58
+ for (const v of sample)
59
+ lines.push(` · ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
60
+ if (unchanged.length > sample.length) {
61
+ lines.push(` · ... and ${unchanged.length - sample.length} more`);
62
+ }
63
+ lines.push('');
64
+ return lines;
65
+ }
66
+ /** The verdict footer (`DEGRADED` / `IMPROVED` / `STABLE`). */
67
+ function renderVerdict(result) {
68
+ if (result.degraded) {
69
+ return `✗ DEGRADED — ${result.added.length} new violation${result.added.length === 1 ? '' : 's'}`;
70
+ }
71
+ if (result.resolved.length > 0) {
72
+ return `✓ IMPROVED — ${result.resolved.length} violation${result.resolved.length === 1 ? '' : 's'} resolved, none added`;
73
+ }
74
+ return `✓ STABLE — no change`;
75
+ }
76
+ /** Render fit's gate-compare report. Byte-preserved from the old gate.ts renderer. */
77
+ export function renderGateCompareOutput(result) {
78
+ return [
79
+ 'opensip gate compare',
80
+ '',
81
+ ...renderAdded(result.added),
82
+ ...renderResolved(result.resolved),
83
+ ...renderUnchanged(result.unchanged),
84
+ renderVerdict(result),
85
+ ].join('\n');
86
+ }
87
+ //# sourceMappingURL=gate-compare-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-compare-render.js","sourceRoot":"","sources":["../../../src/cli/fit/gate-compare-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Recipe-pick + recipe-run helpers for the `fit` command.
3
+ *
4
+ * `selectRecipe()` decides between a named recipe (looked up in the
5
+ * current scope's recipe registry) and an ad-hoc recipe constructed from
6
+ * `--check` / `--tags`. `runRecipeOrAdHoc()` then executes the chosen
7
+ * shape via `FitnessRecipeService`.
8
+ */
9
+ import { FitnessRecipeService } from '../../recipes/service.js';
10
+ import type { FitnessRecipeResult } from '../../recipes/types.js';
11
+ import type { ErrorResult, FitOptions } from '@opensip-cli/contracts';
12
+ /**
13
+ * Tool-scoped recipe defaults for `fit` (ADR-0022), read from the project
14
+ * config by the caller: `toolRecipe` is `fitness.recipe`.
15
+ */
16
+ export interface FitRecipeDefaults {
17
+ readonly toolRecipe?: string;
18
+ }
19
+ /**
20
+ * Flatten the (repeatable, possibly comma-separated) `--tags` values into a
21
+ * trimmed, non-empty tag-filter list. `--tags a,b --tags c` → `['a','b','c']`.
22
+ */
23
+ export declare function tagFiltersFrom(tags: readonly string[] | undefined): string[];
24
+ /**
25
+ * Decide which recipe to execute. `--check` and `--tags` each create an
26
+ * ad-hoc recipe (recipeName=undefined); otherwise resolve a named recipe with
27
+ * tool-scoped precedence (ADR-0022): `--recipe` flag > `fitness.recipe` >
28
+ * built-in `default`. A config-sourced unknown name tolerantly falls back to
29
+ * `default` with a warning (the default may belong to another tool); an explicit
30
+ * `--recipe` typo returns an `ErrorResult`.
31
+ *
32
+ * **Precondition:** must run *after* `ensureChecksLoaded` so that any
33
+ * user-defined recipes (loaded as `.mjs` plugins under
34
+ * `<cwd>/opensip-cli/fit/recipes/`) are present in the scope's recipe
35
+ * registry by the time the lookup runs. Inverting the two
36
+ * lines silently breaks recipe lookup for plugin-provided recipes.
37
+ */
38
+ export declare function selectRecipe(args: FitOptions, defaults?: FitRecipeDefaults): {
39
+ recipeName: string | undefined;
40
+ } | {
41
+ error: ErrorResult;
42
+ };
43
+ /**
44
+ * Run the recipe (or ad-hoc selector built from `--check` / `--tags`).
45
+ *
46
+ * @throws {Error} When neither `args.check` nor `args.tags` is set but
47
+ * `recipeName` is `undefined` — an invariant violation in the caller
48
+ * (`selectRecipe` returns `recipeName` non-`undefined` in that branch).
49
+ */
50
+ export declare function runRecipeOrAdHoc(service: FitnessRecipeService, args: FitOptions, recipeName: string | undefined): Promise<FitnessRecipeResult | {
51
+ error: ErrorResult;
52
+ }>;
53
+ //# sourceMappingURL=recipe-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-selector.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAK5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,iBAAsB,GAC/B;IAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAiC7D;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CA6BvD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Recipe-pick + recipe-run helpers for the `fit` command.
3
+ *
4
+ * `selectRecipe()` decides between a named recipe (looked up in the
5
+ * current scope's recipe registry) and an ad-hoc recipe constructed from
6
+ * `--check` / `--tags`. `runRecipeOrAdHoc()` then executes the chosen
7
+ * shape via `FitnessRecipeService`.
8
+ */
9
+ import { BUILTIN_DEFAULT_RECIPE, EXIT_CODES, resolveToolRecipeName } from '@opensip-cli/contracts';
10
+ import { ConfigurationError, logger } from '@opensip-cli/core';
11
+ import { currentRecipeRegistry } from '../../framework/scope-registry.js';
12
+ import { FitnessRecipeService } from '../../recipes/service.js';
13
+ /**
14
+ * Flatten the (repeatable, possibly comma-separated) `--tags` values into a
15
+ * trimmed, non-empty tag-filter list. `--tags a,b --tags c` → `['a','b','c']`.
16
+ */
17
+ export function tagFiltersFrom(tags) {
18
+ return (tags ?? [])
19
+ .flatMap((t) => t.split(','))
20
+ .map((t) => t.trim())
21
+ .filter(Boolean);
22
+ }
23
+ /**
24
+ * Decide which recipe to execute. `--check` and `--tags` each create an
25
+ * ad-hoc recipe (recipeName=undefined); otherwise resolve a named recipe with
26
+ * tool-scoped precedence (ADR-0022): `--recipe` flag > `fitness.recipe` >
27
+ * built-in `default`. A config-sourced unknown name tolerantly falls back to
28
+ * `default` with a warning (the default may belong to another tool); an explicit
29
+ * `--recipe` typo returns an `ErrorResult`.
30
+ *
31
+ * **Precondition:** must run *after* `ensureChecksLoaded` so that any
32
+ * user-defined recipes (loaded as `.mjs` plugins under
33
+ * `<cwd>/opensip-cli/fit/recipes/`) are present in the scope's recipe
34
+ * registry by the time the lookup runs. Inverting the two
35
+ * lines silently breaks recipe lookup for plugin-provided recipes.
36
+ */
37
+ export function selectRecipe(args, defaults = {}) {
38
+ const useAdHoc = args.check != null || tagFiltersFrom(args.tags).length > 0;
39
+ if (useAdHoc)
40
+ return { recipeName: undefined };
41
+ const resolved = resolveToolRecipeName({
42
+ explicit: args.recipe,
43
+ toolRecipe: defaults.toolRecipe,
44
+ });
45
+ if (!currentRecipeRegistry().has(resolved.name)) {
46
+ // Config-sourced unknown name → fall back to the built-in default rather
47
+ // than abort (it may be a shared/cross-tool default targeting another tool).
48
+ if (resolved.tolerant && resolved.name !== BUILTIN_DEFAULT_RECIPE) {
49
+ logger.warn({
50
+ evt: 'fit.recipe.unknown_config_default',
51
+ module: 'cli:fit',
52
+ requested: resolved.name,
53
+ fallback: BUILTIN_DEFAULT_RECIPE,
54
+ msg: `Configured fit recipe '${resolved.name}' not found; using '${BUILTIN_DEFAULT_RECIPE}'. If '${resolved.name}' is a recipe for another tool, move it under that tool's <tool>.recipe key (ADR-0022).`,
55
+ });
56
+ return { recipeName: BUILTIN_DEFAULT_RECIPE };
57
+ }
58
+ // Explicit --recipe typo → hard error (unchanged typo protection).
59
+ return {
60
+ error: {
61
+ type: 'error',
62
+ message: `Unknown recipe '${resolved.name}'.`,
63
+ suggestion: 'Run opensip fit --recipes to see available recipes.',
64
+ exitCode: EXIT_CODES.CONFIGURATION_ERROR,
65
+ },
66
+ };
67
+ }
68
+ return { recipeName: resolved.name };
69
+ }
70
+ /**
71
+ * Run the recipe (or ad-hoc selector built from `--check` / `--tags`).
72
+ *
73
+ * @throws {Error} When neither `args.check` nor `args.tags` is set but
74
+ * `recipeName` is `undefined` — an invariant violation in the caller
75
+ * (`selectRecipe` returns `recipeName` non-`undefined` in that branch).
76
+ */
77
+ export async function runRecipeOrAdHoc(service, args, recipeName) {
78
+ try {
79
+ if (args.check) {
80
+ return await service.start(FitnessRecipeService.createAdHocRecipe({ check: args.check }));
81
+ }
82
+ const tagFilters = tagFiltersFrom(args.tags);
83
+ if (tagFilters.length > 0) {
84
+ return await service.start(FitnessRecipeService.createAdHocRecipe({ tagFilters }));
85
+ }
86
+ // selectRecipe sets recipeName to undefined only when args.check or
87
+ // args.tags are present — both of which return earlier in this function.
88
+ // Guard explicitly so the type system tracks the narrowing without `!`.
89
+ if (recipeName == null) {
90
+ throw new Error('runRecipeOrAdHoc: recipeName must be defined when args.check/args.tags are absent');
91
+ }
92
+ return await service.start(recipeName);
93
+ }
94
+ catch (error) {
95
+ const msg = error instanceof Error ? error.message : String(error);
96
+ const isConfigurationError = error instanceof ConfigurationError;
97
+ return {
98
+ error: {
99
+ type: 'error',
100
+ message: isConfigurationError ? msg : `Fitness run failed: ${msg}`,
101
+ exitCode: isConfigurationError ? EXIT_CODES.CONFIGURATION_ERROR : EXIT_CODES.RUNTIME_ERROR,
102
+ },
103
+ };
104
+ }
105
+ }
106
+ //# sourceMappingURL=recipe-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-selector.js","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recipe-selector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-selector.test.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { EXIT_CODES } from '@opensip-cli/contracts';
2
+ import { enterScope, RunScope } from '@opensip-cli/core';
3
+ import { beforeEach, describe, expect, it } from 'vitest';
4
+ import { CheckRegistry } from '../../framework/registry.js';
5
+ import { FitnessRecipeRegistry } from '../../recipes/registry.js';
6
+ import { FitnessRecipeService } from '../../recipes/service.js';
7
+ import { fitnessTool } from '../../tool.js';
8
+ import { runRecipeOrAdHoc, selectRecipe } from './recipe-selector.js';
9
+ /**
10
+ * `selectRecipe` resolves the fit recipe with tool-scoped precedence (ADR-0022)
11
+ * against the current scope's recipe registry, whose built-ins include
12
+ * `default` and `backend` but NOT `opensip` (a project-private fit recipe in the
13
+ * parent repo). These tests exercise the precedence + tolerance contract; each
14
+ * enters a fresh RunScope carrying fitness's contributed recipe registry.
15
+ */
16
+ const base = { cwd: '/tmp' };
17
+ beforeEach(() => {
18
+ const scope = new RunScope();
19
+ Object.assign(scope, fitnessTool.contributeScope?.() ?? {});
20
+ enterScope(scope);
21
+ });
22
+ describe('selectRecipe (ADR-0022 tool-scoped + tolerant)', () => {
23
+ it('explicit --recipe wins and resolves a real recipe', () => {
24
+ expect(selectRecipe({ ...base, recipe: 'backend' }, { toolRecipe: 'default' })).toEqual({
25
+ recipeName: 'backend',
26
+ });
27
+ });
28
+ it('explicit unknown --recipe hard-fails (typo protection)', () => {
29
+ const r = selectRecipe({ ...base, recipe: 'bogus-typo' });
30
+ expect('error' in r && r.error.message).toContain("Unknown recipe 'bogus-typo'");
31
+ });
32
+ it('uses fitness.recipe when no flag', () => {
33
+ expect(selectRecipe(base, { toolRecipe: 'backend' })).toEqual({
34
+ recipeName: 'backend',
35
+ });
36
+ });
37
+ it('a config-sourced UNKNOWN recipe tolerantly falls back to default (the leak fix)', () => {
38
+ // A copied tool-scoped recipe name that is absent from this registry must not
39
+ // abort — it falls back to default.
40
+ expect(selectRecipe(base, { toolRecipe: 'also-missing' })).toEqual({
41
+ recipeName: 'default',
42
+ });
43
+ });
44
+ it('--check / --tags force an ad-hoc recipe (recipeName undefined), ignoring config', () => {
45
+ expect(selectRecipe({ ...base, check: 'some-check' }, { toolRecipe: 'backend' })).toEqual({
46
+ recipeName: undefined,
47
+ });
48
+ expect(selectRecipe({ ...base, tags: ['quality'] }, { toolRecipe: 'backend' })).toEqual({
49
+ recipeName: undefined,
50
+ });
51
+ });
52
+ it('no flag and no config → built-in default', () => {
53
+ expect(selectRecipe(base)).toEqual({ recipeName: 'default' });
54
+ });
55
+ it('unknown explicit --check returns a configuration error result', async () => {
56
+ const service = new FitnessRecipeService({
57
+ cwd: '/tmp',
58
+ checkRegistry: new CheckRegistry(),
59
+ recipeRegistry: new FitnessRecipeRegistry(),
60
+ prewarmCache: false,
61
+ });
62
+ const result = await runRecipeOrAdHoc(service, { ...base, check: 'ghost-check' }, undefined);
63
+ expect('error' in result && result.error).toMatchObject({
64
+ message: "Unknown check 'ghost-check'.",
65
+ exitCode: EXIT_CODES.CONFIGURATION_ERROR,
66
+ });
67
+ });
68
+ });
69
+ //# sourceMappingURL=recipe-selector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-selector.test.js","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * resolved-fitness-config — read the fitness tool's RESOLVED config block off
3
+ * the per-run scope (ADR-0023, Phase 4).
4
+ *
5
+ * The CLI's pre-action hook composes every tool's namespaced
6
+ * `ToolConfigDeclaration` into ONE strict whole-document schema, validates the
7
+ * document, and resolves precedence (flag > env > file > defaults). The
8
+ * precedence-resolved result rides on `currentScope().toolConfig` — keyed by
9
+ * namespace (`fitness`/`graph`/`simulation`).
10
+ *
11
+ * Before this module, fitness re-read `opensip-cli.config.yml` through
12
+ * `loadSignalersConfig` and projected `signalersConfig.fitness.*`. That path
13
+ * NEVER saw the declared env bindings (`OPENSIP_FIT_FAIL_ON_ERRORS` /
14
+ * `OPENSIP_FIT_FAIL_ON_WARNINGS`) — they resolved into `scope.toolConfig` but
15
+ * were no-ops at the gate. Reading the resolved block here makes env (and any
16
+ * future flag) precedence the runtime source of truth for the fitness knobs.
17
+ *
18
+ * The shape mirrors `FitnessNamespaceSchema` (`config/fitness-config-schema.ts`)
19
+ * — kept as a plain readonly interface here rather than importing the Zod
20
+ * inferred type, because the kernel hands fitness a Zod-free
21
+ * `Record<string, unknown>` on `scope.toolConfig` (the kernel carries no
22
+ * config-layer dependency). The values were already strict-validated by the
23
+ * composer before they landed on the scope, so a structural narrowing is sound.
24
+ */
25
+ /** The fitness namespace's resolved knobs (mirror of `FitnessNamespaceSchema`). */
26
+ export interface ResolvedFitnessConfig {
27
+ readonly defaultTarget?: string;
28
+ readonly maxParallel?: number;
29
+ readonly timeout?: number;
30
+ readonly failOnErrors?: number;
31
+ readonly failOnWarnings?: number;
32
+ readonly disabledChecks?: readonly string[];
33
+ readonly recipe?: string;
34
+ }
35
+ /**
36
+ * Read the resolved `fitness:` block off the current scope's `toolConfig`.
37
+ *
38
+ * Returns `undefined` when there is no scope (a unit test that did not wrap in
39
+ * `runWithScope`) or no `toolConfig` (a config-less project, or a
40
+ * project-agnostic command). Callers fall back to their established
41
+ * file-sourced defaults in that case, so the gate stays defined even off the
42
+ * CLI dispatch path.
43
+ *
44
+ * The block is already strict-validated + precedence-resolved by the host
45
+ * (flag > env > file > defaults); this is a pure read, no validation.
46
+ */
47
+ export declare function resolvedFitnessConfig(): ResolvedFitnessConfig | undefined;
48
+ //# sourceMappingURL=resolved-fitness-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolved-fitness-config.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/resolved-fitness-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,GAAG,SAAS,CAGzE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * resolved-fitness-config — read the fitness tool's RESOLVED config block off
3
+ * the per-run scope (ADR-0023, Phase 4).
4
+ *
5
+ * The CLI's pre-action hook composes every tool's namespaced
6
+ * `ToolConfigDeclaration` into ONE strict whole-document schema, validates the
7
+ * document, and resolves precedence (flag > env > file > defaults). The
8
+ * precedence-resolved result rides on `currentScope().toolConfig` — keyed by
9
+ * namespace (`fitness`/`graph`/`simulation`).
10
+ *
11
+ * Before this module, fitness re-read `opensip-cli.config.yml` through
12
+ * `loadSignalersConfig` and projected `signalersConfig.fitness.*`. That path
13
+ * NEVER saw the declared env bindings (`OPENSIP_FIT_FAIL_ON_ERRORS` /
14
+ * `OPENSIP_FIT_FAIL_ON_WARNINGS`) — they resolved into `scope.toolConfig` but
15
+ * were no-ops at the gate. Reading the resolved block here makes env (and any
16
+ * future flag) precedence the runtime source of truth for the fitness knobs.
17
+ *
18
+ * The shape mirrors `FitnessNamespaceSchema` (`config/fitness-config-schema.ts`)
19
+ * — kept as a plain readonly interface here rather than importing the Zod
20
+ * inferred type, because the kernel hands fitness a Zod-free
21
+ * `Record<string, unknown>` on `scope.toolConfig` (the kernel carries no
22
+ * config-layer dependency). The values were already strict-validated by the
23
+ * composer before they landed on the scope, so a structural narrowing is sound.
24
+ */
25
+ import { currentScope } from '@opensip-cli/core';
26
+ /** A plain-object guard that treats arrays and null as non-objects. */
27
+ function isPlainObject(value) {
28
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
29
+ }
30
+ /**
31
+ * Read the resolved `fitness:` block off the current scope's `toolConfig`.
32
+ *
33
+ * Returns `undefined` when there is no scope (a unit test that did not wrap in
34
+ * `runWithScope`) or no `toolConfig` (a config-less project, or a
35
+ * project-agnostic command). Callers fall back to their established
36
+ * file-sourced defaults in that case, so the gate stays defined even off the
37
+ * CLI dispatch path.
38
+ *
39
+ * The block is already strict-validated + precedence-resolved by the host
40
+ * (flag > env > file > defaults); this is a pure read, no validation.
41
+ */
42
+ export function resolvedFitnessConfig() {
43
+ const block = currentScope()?.toolConfig?.fitness;
44
+ return isPlainObject(block) ? block : undefined;
45
+ }
46
+ //# sourceMappingURL=resolved-fitness-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolved-fitness-config.js","sourceRoot":"","sources":["../../../src/cli/fit/resolved-fitness-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,uEAAuE;AACvE,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC;IAClD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Pure builders that transform fitness recipe results into the run's
3
+ * `SignalEnvelope` (the universal output currency, ADR-0011) and the
4
+ * `FitDoneResult` that carries it — plus the formatting helpers they rely on
5
+ * and the best-effort session persistence side effect invoked at the
6
+ * `executeFit` boundary.
7
+ *
8
+ * Keeping these together (rather than per-output-shape) makes the
9
+ * signal-shape mapping visible in one place: `buildFitEnvelope` maps check
10
+ * violations to `Signal`s and `buildFitDoneResult` wraps the envelope.
11
+ */
12
+ import { type FitOptions, type SignalEnvelope, type FitDoneResult } from '@opensip-cli/contracts';
13
+ import { type VerdictPolicy } from '@opensip-cli/core';
14
+ import type { FitnessRecipeServiceCallbacks } from '../../recipes/service-types.js';
15
+ import type { FitnessRecipeResult } from '../../recipes/types.js';
16
+ import type { SignalersConfig } from '../../signalers/types.js';
17
+ /**
18
+ * Resolve fit's findings policy (ADR-0035). Reserved keys
19
+ * `failOnErrors`/`failOnWarnings` come from the host-RESOLVED
20
+ * `scope.toolConfig.fitness` (flag>env>file>defaults, ADR-0023), falling back to
21
+ * the file-sourced `signalersConfig.fitness` when no scope/toolConfig is present
22
+ * (a config-less project, or `executeFit` invoked off the CLI dispatch path),
23
+ * then to the host default `{1, 0}`. This is fit's historical gate resolution,
24
+ * now expressed as a VerdictPolicy the host verdict consumes — so
25
+ * `envelope.verdict.passed` is the single exit driver.
26
+ */
27
+ export declare function resolveFitVerdictPolicy(signalersConfig: SignalersConfig): VerdictPolicy;
28
+ /**
29
+ * Assemble the fit run's {@link SignalEnvelope} — the universal output
30
+ * currency the composition root renders (table), emits (`--json`), and
31
+ * delivers (cloud + `--report-to`).
32
+ *
33
+ * Each check violation becomes one {@link Signal} (`source === ruleId ===
34
+ * checkSlug`) via {@link violationToSignal}; every check that ran produces one
35
+ * {@link UnitResult} row (so a clean check still appears in the table). The
36
+ * fitness-only `Validated`/`Ignores` columns ride on the unit as
37
+ * `filesValidated`/`itemType`/`ignoredCount` (per-unit facts a flat signal
38
+ * list cannot express). The verdict/summary are computed centrally by
39
+ * {@link buildSignalEnvelope} so all three tools agree on "passed ⇔ no
40
+ * critical/high".
41
+ *
42
+ * Pure: the only clock read (`createdAt`) and the run id come from the caller's
43
+ * scope, matching graph/sim's envelope builders.
44
+ */
45
+ export declare function buildFitEnvelope(fitnessResult: FitnessRecipeResult, recipeName: string | undefined, signalersConfig: SignalersConfig): SignalEnvelope;
46
+ /** Input bundle for {@link buildFitDoneResult}: CLI args, recipe result, the run envelope, and signaler config. */
47
+ export interface BuildFitDoneArgs {
48
+ args: FitOptions;
49
+ fitnessResult: FitnessRecipeResult;
50
+ envelope: SignalEnvelope;
51
+ signalersConfig: SignalersConfig;
52
+ recipeName: string | undefined;
53
+ warnings?: readonly string[];
54
+ }
55
+ /**
56
+ * Build the {@link FitDoneResult} the live renderer / non-TTY render path
57
+ * consume. Carries the run's {@link SignalEnvelope} (the composition root
58
+ * derives the terminal table + summary AND the findings exit code FROM it — one
59
+ * row per check unit, `envelope.verdict.passed` the single verdict) plus the run
60
+ * label and non-fatal warnings.
61
+ *
62
+ * ADR-0035: the exit code is no longer carried on the result. `verdict.passed`
63
+ * (computed with fit's resolved failOnErrors/failOnWarnings policy + plugin-load
64
+ * `runFaulted`) is the single exit driver; the host derives it in `deliverSignals`.
65
+ *
66
+ * Pure builder: session persistence (SessionRepo.save) lives at the
67
+ * `executeFit` call site (post-call), not here. The envelope is assembled once
68
+ * in `executeFit` and threaded in so the gate, render, and session-payload
69
+ * paths all consume the same envelope.
70
+ */
71
+ export declare function buildFitDoneResult({ args, envelope, recipeName, warnings, }: BuildFitDoneArgs): FitDoneResult;
72
+ /**
73
+ * Wire up CLI-side progress callbacks for the recipe service.
74
+ *
75
+ * Monotonic completed-count: the service fires `onCheckStart(slug,
76
+ * displayIndex, total)` when a check STARTS and
77
+ * `onCheckComplete(slug, summary, displayIndex, total)` when it
78
+ * FINISHES. Under parallel execution `displayIndex` is the check's
79
+ * position in the queue (1..total), not "how many have completed" — so
80
+ * the last-started check's index hops above the current completion
81
+ * tally and then "resets" down when an earlier check finishes (the UI
82
+ * showed `147/148 → 121/148 → 78/148`).
83
+ *
84
+ * The progress bar wants a monotonic counter. We track completed
85
+ * locally, increment only on `onCheckComplete`, and ignore
86
+ * `onCheckStart`'s index. The counter is strictly non-decreasing and
87
+ * always reflects "N of M checks done."
88
+ */
89
+ export declare function buildFitCallbacks(onProgress?: (completed: number, total: number) => void): FitnessRecipeServiceCallbacks;
90
+ export { buildFitnessSessionPayload } from '../../persistence/session-payload.js';
91
+ //# sourceMappingURL=result-builders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-builders.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/result-builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EAEnB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAS1F,OAAO,KAAK,EAAE,6BAA6B,EAAgB,MAAM,gCAAgC,CAAC;AAClG,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,eAAe,GAAG,aAAa,CA0BvF;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,mBAAmB,EAClC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,eAAe,EAAE,eAAe,GAC/B,cAAc,CAuChB;AAED,mHAAmH;AACnH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,EAAE,gBAAgB,GAAG,aAAa,CAoBlC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACtD,6BAA6B,CA2B/B;AAOD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC"}