@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,113 @@
1
+ /**
2
+ * Tests for `collectFitnessReportData` — fitness's contribution to
3
+ * the cross-tool dashboard composed by the CLI (audit 2026-05-29, L2).
4
+ *
5
+ * The collector returns ONLY fitness-owned inputs (check catalog, recipe
6
+ * catalog, editor protocol) keyed by the field names
7
+ * `generateDashboardHtml` consumes. It does NOT read sessions, the graph
8
+ * catalog, write any file, or open a browser — those are the CLI
9
+ * composition root's job now.
10
+ */
11
+ import { dirname } from 'node:path';
12
+ import { fileURLToPath } from 'node:url';
13
+ import { LanguageRegistry, RunScope, ToolRegistry, createCapabilityRegistry, admitTool, loadToolManifest, registerCapabilityDomainsFromManifest, runWithScope, } from '@opensip-cli/core';
14
+ import { describe, expect, it } from 'vitest';
15
+ /** Fresh scope with empty registries — local equivalent of the retired
16
+ * `@opensip-cli/core/test-utils` helper. The fitness engine's own tests
17
+ * cannot use `@opensip-cli/test-support` (it depends on this package —
18
+ * the dev edge would make the package graph cyclic; ADR-0040). */
19
+ const makeTestScope = () => new RunScope({ languages: new LanguageRegistry(), tools: new ToolRegistry() });
20
+ const withScope = runWithScope;
21
+ import { fitnessTool } from '../../tool.js';
22
+ import { collectFitnessReportData } from '../report-data.js';
23
+ /** The fitness engine package root (carries the manifest), 4 dirs up from this test. */
24
+ const ENGINE_DIR = dirname(dirname(dirname(dirname(fileURLToPath(import.meta.url)))));
25
+ /**
26
+ * Wire fitness's capability plane onto a scope exactly as the CLI host does:
27
+ * register the manifest-declared domains (fit-pack, fit-recipe) and swap in the
28
+ * tool's real registrars. `ensureChecksLoaded` drives discovery through this, so
29
+ * without it the dashboard catalog would be empty.
30
+ */
31
+ function wireFitnessCapabilities(scope) {
32
+ const capabilities = createCapabilityRegistry();
33
+ const manifest = loadToolManifest('bundled', ENGINE_DIR);
34
+ if (manifest) {
35
+ const result = admitTool({
36
+ manifest,
37
+ source: 'bundled',
38
+ dir: ENGINE_DIR,
39
+ explicitlyRequested: true,
40
+ });
41
+ if (result.decision === 'admit') {
42
+ registerCapabilityDomainsFromManifest(result.manifest, capabilities);
43
+ }
44
+ }
45
+ for (const [domainId, registrar] of Object.entries(fitnessTool.capabilityRegistrars ?? {})) {
46
+ if (capabilities.hasDomain(domainId))
47
+ capabilities.setRegistrar(domainId, registrar);
48
+ }
49
+ Object.assign(scope, { capabilities });
50
+ }
51
+ /**
52
+ * Build a RunScope carrying fitness's contributed subscope. The collector
53
+ * reads the check/recipe registries and the `ensureChecksLoaded` lifecycle
54
+ * slot off the ambient current scope, so test calls must run inside this scope.
55
+ */
56
+ function makeFitnessScope() {
57
+ const scope = makeTestScope();
58
+ Object.assign(scope, fitnessTool.contributeScope?.() ?? {});
59
+ wireFitnessCapabilities(scope);
60
+ return scope;
61
+ }
62
+ function collectWithFitnessScope() {
63
+ const scope = makeFitnessScope();
64
+ return withScope(scope, () => collectFitnessReportData(scope));
65
+ }
66
+ describe('collectFitnessReportData', () => {
67
+ it('returns only the fitness-owned dashboard keys', async () => {
68
+ const result = await collectWithFitnessScope();
69
+ expect(Object.keys(result).sort()).toEqual(['checkCatalog', 'editorProtocol', 'recipeCatalog']);
70
+ });
71
+ it('does NOT contribute sessions or graphCatalog (CLI / graph own those)', async () => {
72
+ const result = await collectWithFitnessScope();
73
+ expect(result).not.toHaveProperty('sessions');
74
+ expect(result).not.toHaveProperty('graphCatalog');
75
+ });
76
+ it('builds a non-empty check catalog with the expected entry shape', async () => {
77
+ const result = await collectWithFitnessScope();
78
+ const checkCatalog = result.checkCatalog;
79
+ expect(Array.isArray(checkCatalog)).toBe(true);
80
+ expect(checkCatalog.length).toBeGreaterThan(0);
81
+ const entry = checkCatalog[0];
82
+ expect(entry).toEqual(expect.objectContaining({
83
+ slug: expect.any(String),
84
+ name: expect.any(String),
85
+ icon: expect.any(String),
86
+ description: expect.any(String),
87
+ confidence: expect.stringMatching(/^(high|medium|low)$/),
88
+ source: expect.stringMatching(/^(built-in|community)$/),
89
+ }));
90
+ });
91
+ it('builds a recipe catalog with the expected entry shape', async () => {
92
+ const result = await collectWithFitnessScope();
93
+ const recipeCatalog = result.recipeCatalog;
94
+ expect(Array.isArray(recipeCatalog)).toBe(true);
95
+ if (recipeCatalog.length > 0) {
96
+ expect(recipeCatalog[0]).toEqual(expect.objectContaining({
97
+ name: expect.any(String),
98
+ displayName: expect.any(String),
99
+ selectorType: expect.any(String),
100
+ mode: expect.any(String),
101
+ timeout: expect.any(Number),
102
+ }));
103
+ }
104
+ });
105
+ it('degrades editorProtocol to null when no signalers config is present', async () => {
106
+ // makeTestScope() carries no projectContext, so the collector reads
107
+ // process.cwd() — which in the test sandbox has no dashboard.editor
108
+ // config, exercising the graceful-degradation path.
109
+ const result = await collectWithFitnessScope();
110
+ expect(result.editorProtocol === null || typeof result.editorProtocol === 'string').toBe(true);
111
+ });
112
+ });
113
+ //# sourceMappingURL=report-data.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-data.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/report-data.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview The §5.3 display fold: display (icon + name) travels ON each
3
+ * check (`check.config.icon`/`displayName`), folded from a pack's authoring map
4
+ * via `applyCheckDisplay`; `getDisplayName`/`getIcon` resolve a slug against the
5
+ * CURRENT scope's check registry — there is NO merged-display singleton (F3).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=display-fold.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-fold.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/fit/__tests__/display-fold.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @fileoverview The §5.3 display fold: display (icon + name) travels ON each
3
+ * check (`check.config.icon`/`displayName`), folded from a pack's authoring map
4
+ * via `applyCheckDisplay`; `getDisplayName`/`getIcon` resolve a slug against the
5
+ * CURRENT scope's check registry — there is NO merged-display singleton (F3).
6
+ */
7
+ import { RunScope, runWithScopeSync } from '@opensip-cli/core';
8
+ import { describe, expect, it } from 'vitest';
9
+ import { applyCheckDisplay } from '../../../check-utils/display.js';
10
+ import { defineCheck } from '../../../framework/define-check.js';
11
+ import { currentCheckRegistry } from '../../../framework/scope-registry.js';
12
+ import { fitnessTool } from '../../../tool.js';
13
+ import { getDisplayName, getIcon } from '../display-registry.js';
14
+ let nextId = 0;
15
+ function stubCheck(slug) {
16
+ nextId++;
17
+ return defineCheck({
18
+ id: `00000000-0000-4000-8000-${nextId.toString(16).padStart(12, '0')}`,
19
+ slug,
20
+ description: slug,
21
+ tags: ['demo'],
22
+ analyze: () => [],
23
+ });
24
+ }
25
+ /** A RunScope carrying fitness's contributed subscope (fresh check registry). */
26
+ function fitnessScope() {
27
+ const scope = new RunScope();
28
+ Object.assign(scope, fitnessTool.contributeScope?.() ?? {});
29
+ return scope;
30
+ }
31
+ describe('applyCheckDisplay', () => {
32
+ it('folds icon + displayName onto a check whose slug has a map entry', () => {
33
+ const map = { 'my-check': ['🚀', 'My Check'] };
34
+ const [folded] = applyCheckDisplay([stubCheck('my-check')], map);
35
+ expect(folded?.config.icon).toBe('🚀');
36
+ expect(folded?.config.displayName).toBe('My Check');
37
+ });
38
+ it('passes a check with no map entry through unchanged (no display set)', () => {
39
+ const [plain] = applyCheckDisplay([stubCheck('no-entry')], {});
40
+ expect(plain?.config.icon).toBeUndefined();
41
+ expect(plain?.config.displayName).toBeUndefined();
42
+ });
43
+ it('does not mutate the original check (returns a new object)', () => {
44
+ const original = stubCheck('immutable');
45
+ const [folded] = applyCheckDisplay([original], { immutable: ['🔒', 'Immutable'] });
46
+ expect(original.config.icon).toBeUndefined();
47
+ expect(folded).not.toBe(original);
48
+ });
49
+ });
50
+ describe('getDisplayName / getIcon read from the scope check registry (no singleton)', () => {
51
+ it('returns the folded display for a registered check', () => {
52
+ runWithScopeSync(fitnessScope(), () => {
53
+ const [folded] = applyCheckDisplay([stubCheck('rocket-check')], {
54
+ 'rocket-check': ['🚀', 'Rocket Check'],
55
+ });
56
+ currentCheckRegistry().register(folded);
57
+ expect(getDisplayName('rocket-check')).toBe('Rocket Check');
58
+ expect(getIcon('rocket-check')).toBe('🚀');
59
+ });
60
+ });
61
+ it('falls back to kebab-title-case name + default icon for an unknown slug', () => {
62
+ runWithScopeSync(fitnessScope(), () => {
63
+ expect(getDisplayName('some-unknown-slug')).toBe('Some Unknown Slug');
64
+ expect(getIcon('some-unknown-slug')).toBe('🔍');
65
+ });
66
+ });
67
+ it('two concurrent scopes resolve display independently (F3: no shared singleton)', () => {
68
+ const scopeA = fitnessScope();
69
+ const scopeB = fitnessScope();
70
+ runWithScopeSync(scopeA, () => {
71
+ const [a] = applyCheckDisplay([stubCheck('shared-slug')], {
72
+ 'shared-slug': ['🅰️', 'From A'],
73
+ });
74
+ currentCheckRegistry().register(a);
75
+ });
76
+ runWithScopeSync(scopeB, () => {
77
+ const [b] = applyCheckDisplay([stubCheck('shared-slug')], {
78
+ 'shared-slug': ['🅱️', 'From B'],
79
+ });
80
+ currentCheckRegistry().register(b);
81
+ });
82
+ // Each scope sees only its own registration — no cross-scope leakage.
83
+ runWithScopeSync(scopeA, () => expect(getDisplayName('shared-slug')).toBe('From A'));
84
+ runWithScopeSync(scopeB, () => expect(getDisplayName('shared-slug')).toBe('From B'));
85
+ });
86
+ });
87
+ //# sourceMappingURL=display-fold.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-fold.test.js","sourceRoot":"","sources":["../../../../src/cli/fit/__tests__/display-fold.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * gate-resolved-config — proves fit's findings policy (ADR-0035) reads its
3
+ * `failOnErrors` / `failOnWarnings` thresholds off the host-RESOLVED config block
4
+ * (`scope.toolConfig.fitness`), NOT the re-parsed `signalersConfig.fitness.*`
5
+ * (ADR-0023, Phase 4), and falls back to `signalersConfig` (then `{1,0}`) when no
6
+ * toolConfig is present (config-less / off-CLI).
7
+ *
8
+ * Post-ADR-0035, this resolution lives in `resolveFitVerdictPolicy` and feeds
9
+ * `envelope.verdict.passed` — the single exit driver. The declared env bindings
10
+ * OPENSIP_FIT_FAIL_ON_ERRORS / OPENSIP_FIT_FAIL_ON_WARNINGS resolve into
11
+ * `scope.toolConfig.fitness`; these tests pin that they drive the policy
12
+ * (overriding the file source) and that the fallback chain holds. This is the
13
+ * regression guard that env bindings are no longer no-ops at the gate.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=gate-resolved-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-resolved-config.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/fit/__tests__/gate-resolved-config.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * gate-resolved-config — proves fit's findings policy (ADR-0035) reads its
3
+ * `failOnErrors` / `failOnWarnings` thresholds off the host-RESOLVED config block
4
+ * (`scope.toolConfig.fitness`), NOT the re-parsed `signalersConfig.fitness.*`
5
+ * (ADR-0023, Phase 4), and falls back to `signalersConfig` (then `{1,0}`) when no
6
+ * toolConfig is present (config-less / off-CLI).
7
+ *
8
+ * Post-ADR-0035, this resolution lives in `resolveFitVerdictPolicy` and feeds
9
+ * `envelope.verdict.passed` — the single exit driver. The declared env bindings
10
+ * OPENSIP_FIT_FAIL_ON_ERRORS / OPENSIP_FIT_FAIL_ON_WARNINGS resolve into
11
+ * `scope.toolConfig.fitness`; these tests pin that they drive the policy
12
+ * (overriding the file source) and that the fallback chain holds. This is the
13
+ * regression guard that env bindings are no longer no-ops at the gate.
14
+ */
15
+ import { LanguageRegistry, RunScope, ToolRegistry, policyPasses, runWithScopeSync, } from '@opensip-cli/core';
16
+ import { describe, expect, it } from 'vitest';
17
+ import { resolveFitVerdictPolicy } from '../result-builders.js';
18
+ /** Fresh scope with empty registries — local equivalent of the retired
19
+ * `@opensip-cli/core/test-utils` helper. The fitness engine's own tests
20
+ * cannot use `@opensip-cli/test-support` (it depends on this package —
21
+ * the dev edge would make the package graph cyclic; ADR-0040). */
22
+ const makeTestScope = () => new RunScope({ languages: new LanguageRegistry(), tools: new ToolRegistry() });
23
+ /** The minimal `signalersConfig` shape `resolveFitVerdictPolicy` reads as the FALLBACK source. */
24
+ function makeSignalersConfig(failOnErrors, failOnWarnings) {
25
+ return {
26
+ fitness: { failOnErrors, failOnWarnings, disabledChecks: [] },
27
+ cli: {},
28
+ };
29
+ }
30
+ /** Resolve fit's policy inside a scope carrying the given resolved toolConfig. */
31
+ function policyWith(signalers, toolConfig) {
32
+ const scope = makeTestScope();
33
+ if (toolConfig !== undefined)
34
+ Object.assign(scope, { toolConfig });
35
+ return runWithScopeSync(scope, () => resolveFitVerdictPolicy(signalers));
36
+ }
37
+ describe('fit findings policy reads thresholds off scope.toolConfig.fitness (ADR-0023 / ADR-0035)', () => {
38
+ it('OPENSIP_FIT_FAIL_ON_ERRORS=0 (resolved) → an error-emitting run does NOT fail, even though the file says failOnErrors:1', () => {
39
+ // File source says fail-on-errors:1 — the OLD behaviour would fail here.
40
+ const policy = policyWith(makeSignalersConfig(1, 0), {
41
+ fitness: { failOnErrors: 0, failOnWarnings: 0 },
42
+ });
43
+ expect(policy.failOnErrors).toBe(0);
44
+ // 0 = never fail on errors → a 3-error run passes.
45
+ expect(policyPasses({ errors: 3, warnings: 0 }, policy)).toBe(true);
46
+ });
47
+ it('OPENSIP_FIT_FAIL_ON_WARNINGS=1 (resolved) → a warning-only run FAILs, even though the file says failOnWarnings:0', () => {
48
+ // File source says fail-on-warnings:0 — the OLD behaviour would pass here.
49
+ const policy = policyWith(makeSignalersConfig(1, 0), {
50
+ fitness: { failOnErrors: 1, failOnWarnings: 1 },
51
+ });
52
+ expect(policy.failOnWarnings).toBe(1);
53
+ expect(policyPasses({ errors: 0, warnings: 2 }, policy)).toBe(false);
54
+ });
55
+ it('falls back to signalersConfig when the scope carries no toolConfig (config-less / off-CLI)', () => {
56
+ // No resolved block on the scope → the file source drives the policy.
57
+ const policy = policyWith(makeSignalersConfig(1, 0), undefined);
58
+ expect(policy.failOnErrors).toBe(1);
59
+ expect(policyPasses({ errors: 2, warnings: 0 }, policy)).toBe(false);
60
+ });
61
+ });
62
+ //# sourceMappingURL=gate-resolved-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-resolved-config.test.js","sourceRoot":"","sources":["../../../../src/cli/fit/__tests__/gate-resolved-config.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAKhE;;;mEAGmE;AACnE,MAAM,aAAa,GAAG,GAAa,EAAE,CACnC,IAAI,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,YAAY,EAAE,EAAE,CAAC,CAAC;AAEjF,kGAAkG;AAClG,SAAS,mBAAmB,CAAC,YAAoB,EAAE,cAAsB;IACvE,OAAO;QACL,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,EAAE;QAC7D,GAAG,EAAE,EAAE;KACsB,CAAC;AAClC,CAAC;AAED,kFAAkF;AAClF,SAAS,UAAU,CACjB,SAA0B,EAC1B,UAA0C;IAE1C,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACnE,OAAO,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,QAAQ,CAAC,yFAAyF,EAAE,GAAG,EAAE;IACvG,EAAE,CAAC,yHAAyH,EAAE,GAAG,EAAE;QACjI,yEAAyE;QACzE,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACnD,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAChD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,mDAAmD;QACnD,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kHAAkH,EAAE,GAAG,EAAE;QAC1H,2EAA2E;QAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACnD,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAChD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4FAA4F,EAAE,GAAG,EAAE;QACpG,sEAAsE;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Plugin/check discovery + registration for the `fit` command.
3
+ *
4
+ * Owns the fit-lifecycle state (`loadedFor`, `pluginLoadErrors`,
5
+ * `loadWarnings`) — a single unit of state, written exactly once per RUN
6
+ * by `ensureChecksLoaded()` and read by the phase helpers downstream
7
+ * (`buildFitEnvelope`, `buildFitDoneResult`) plus the public
8
+ * `getPluginLoadErrors()` / `getDisplayName()` / `getIcon()` accessors
9
+ * that `FitView` and `report-data.ts` consume.
10
+ *
11
+ * As of the scope-owned-registries refactor (2.10.0) this state lives on
12
+ * the RunScope (`scope.fitness.load`), NOT module singletons — two
13
+ * concurrent fit runs (different scopes) carry independent load state.
14
+ * The accessors read the current scope's slot via
15
+ * `currentFitnessLoadState()`.
16
+ *
17
+ * Invariant: each binding is set by `ensureChecksLoaded()` and read by
18
+ * the phase helpers; `executeFit`'s phase ordering is sequenced so the
19
+ * readers always run after the setter completes.
20
+ */
21
+ /** Warnings collected during the most recent ensureChecksLoaded() call.
22
+ * Returned alongside plugin errors and run-time validation warnings via
23
+ * executeFit's result so the live renderer and JSON output both see them. */
24
+ export declare function getLoadWarnings(): readonly string[];
25
+ /**
26
+ * Plugin load errors recorded during the most recent ensureChecksLoaded() call.
27
+ * Read by runFit to fail the run if any plugin failed to import — otherwise a
28
+ * malicious or broken plugin could silently suppress its own checks while the
29
+ * CLI exits 0, masking a compliance failure or a supply-chain compromise.
30
+ */
31
+ export declare function getPluginLoadErrors(): readonly string[];
32
+ /** Get the number of enabled checks (available after ensureChecksLoaded). */
33
+ export declare function getEnabledCheckCount(): number;
34
+ /** Lazily discovers and registers all check packs for the given project
35
+ * (idempotent per project, scoped to the current RunScope). */
36
+ export declare function ensureChecksLoaded(projectDir?: string): Promise<void>;
37
+ //# sourceMappingURL=check-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-loader.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/check-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAgBH;;6EAE6E;AAC7E,wBAAgB,eAAe,IAAI,SAAS,MAAM,EAAE,CAEnD;AAED;;;;;GAKG;AAEH,wBAAgB,mBAAmB,IAAI,SAAS,MAAM,EAAE,CAEvD;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAMD;+DAC+D;AAC/D,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D3E"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Plugin/check discovery + registration for the `fit` command.
3
+ *
4
+ * Owns the fit-lifecycle state (`loadedFor`, `pluginLoadErrors`,
5
+ * `loadWarnings`) — a single unit of state, written exactly once per RUN
6
+ * by `ensureChecksLoaded()` and read by the phase helpers downstream
7
+ * (`buildFitEnvelope`, `buildFitDoneResult`) plus the public
8
+ * `getPluginLoadErrors()` / `getDisplayName()` / `getIcon()` accessors
9
+ * that `FitView` and `report-data.ts` consume.
10
+ *
11
+ * As of the scope-owned-registries refactor (2.10.0) this state lives on
12
+ * the RunScope (`scope.fitness.load`), NOT module singletons — two
13
+ * concurrent fit runs (different scopes) carry independent load state.
14
+ * The accessors read the current scope's slot via
15
+ * `currentFitnessLoadState()`.
16
+ *
17
+ * Invariant: each binding is set by `ensureChecksLoaded()` and read by
18
+ * the phase helpers; `executeFit`'s phase ordering is sequenced so the
19
+ * readers always run after the setter completes.
20
+ */
21
+ import { dirname } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { currentScope, loadCapabilityDomain, logger } from '@opensip-cli/core';
24
+ import { currentCheckRegistry, currentFitnessLoadState } from '../../framework/scope-registry.js';
25
+ import { readCheckPackagePreferences } from '../../plugins/check-package-discovery.js';
26
+ import { loadAllPlugins } from '../../plugins/loader.js';
27
+ // ---------------------------------------------------------------------------
28
+ // Public accessors — all read the current RunScope's fitness load state
29
+ // (`scope.fitness.load`), set once per run by `ensureChecksLoaded()`.
30
+ // ---------------------------------------------------------------------------
31
+ /** Warnings collected during the most recent ensureChecksLoaded() call.
32
+ * Returned alongside plugin errors and run-time validation warnings via
33
+ * executeFit's result so the live renderer and JSON output both see them. */
34
+ export function getLoadWarnings() {
35
+ return currentFitnessLoadState().loadWarnings;
36
+ }
37
+ /**
38
+ * Plugin load errors recorded during the most recent ensureChecksLoaded() call.
39
+ * Read by runFit to fail the run if any plugin failed to import — otherwise a
40
+ * malicious or broken plugin could silently suppress its own checks while the
41
+ * CLI exits 0, masking a compliance failure or a supply-chain compromise.
42
+ */
43
+ // @fitness-ignore-next-line duplicate-utility-functions -- intentionally parallel per-tool scope accessor: fit reads scope.fitness.load, sim reads scope.simulation.load; they cannot consolidate (different registries) and mirror getLoadWarnings.
44
+ export function getPluginLoadErrors() {
45
+ return currentFitnessLoadState().pluginLoadErrors;
46
+ }
47
+ /** Get the number of enabled checks (available after ensureChecksLoaded). */
48
+ export function getEnabledCheckCount() {
49
+ return currentCheckRegistry().listEnabled().length;
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Lazy-load fitness checks
53
+ // ---------------------------------------------------------------------------
54
+ /** Lazily discovers and registers all check packs for the given project
55
+ * (idempotent per project, scoped to the current RunScope). */
56
+ export async function ensureChecksLoaded(projectDir) {
57
+ const key = projectDir ?? '';
58
+ // Per-run lifecycle state lives on the scope (`scope.fitness.load`), so
59
+ // two concurrent fit runs (different scopes) load independently.
60
+ const load = currentFitnessLoadState();
61
+ if (load.loadedFor === key)
62
+ return;
63
+ // Reset per-run warning buffer. Its lifetime mirrors loadedFor —
64
+ // a fresh load (new projectDir or first call) starts with no warnings.
65
+ load.loadWarnings = [];
66
+ // 1. Load fit plugins — discovers .mjs files in
67
+ // <projectDir>/opensip-cli/fit/{checks,recipes}/ and any
68
+ // npm packages declared in plugins.fit in the project config.
69
+ //
70
+ // Bundled language adapters (TypeScript, Rust, Python, etc.)
71
+ // are registered separately by the CLI bootstrap; fitness
72
+ // doesn't take direct deps on @opensip-cli/lang-* packages,
73
+ // and there's no project-local 'lang' plugin discovery path
74
+ // (the lang adapter set is fixed and shipped with the CLI).
75
+ const pluginResult = await loadAllPlugins('fit', projectDir);
76
+ load.pluginLoadErrors = pluginResult.errors;
77
+ if (pluginResult.errors.length > 0) {
78
+ // Plugin load errors go to loadWarnings (rendered via the result) and
79
+ // logger.warn (structured logs). Direct stderr writes are forbidden
80
+ // during live-view runs — they desync Ink's frame tracking.
81
+ for (const err of pluginResult.errors) {
82
+ load.loadWarnings.push(`plugin failed to load — ${err}`);
83
+ logger.warn({ evt: 'cli.plugin.warning', module: 'cli:fit', message: err });
84
+ }
85
+ }
86
+ // 2. Discover + load fit-pack check packages through the GENERIC capability
87
+ // substrate (§5.3): marker discovery, the `@opensip-cli` built-in split,
88
+ // explicit `plugins.checkPackages` (augmented onto markers), and the
89
+ // single-core guard all live in core now — fitness no longer carries a
90
+ // bespoke loader. The fit-pack registrar registers each check; co-located
91
+ // `recipes` route to the fit-recipe domain. Memoized per (domain, project)
92
+ // on the scope capability registry, so the CLI pre-action hook and this
93
+ // call don't double-load. Discovery errors (incl. the single-core guard's
94
+ // foreign-core skips) surface as load warnings.
95
+ for (const err of await loadFitCheckPackages(projectDir ?? cliInstallDir())) {
96
+ load.loadWarnings.push(err);
97
+ }
98
+ // 3. No-checks-loaded guard. Silent zero-checks would let a misconfig or
99
+ // missing dep produce a green run that scanned nothing — the failure mode
100
+ // the CLI exists to prevent. Checks the TOTAL registry count (the load may
101
+ // have been memoized by the pre-action hook, so a per-call delta is wrong).
102
+ if (currentCheckRegistry().listEnabled().length === 0) {
103
+ load.loadWarnings.push('no check packages were loaded. ' +
104
+ 'Install at least one package declaring opensipTools.kind: "fit-pack", ' +
105
+ 'or declare plugins.checkPackages in opensip-cli.config.yml.');
106
+ logger.warn({
107
+ evt: 'cli.check_packages.empty',
108
+ module: 'cli:fit',
109
+ msg: 'no check packages loaded',
110
+ });
111
+ }
112
+ load.loadedFor = key;
113
+ }
114
+ /**
115
+ * Drive the generic capability loader for the `fit-pack` domain. Returns any
116
+ * discovery/routing errors (foreign-core skips, load failures) as warning
117
+ * strings. A no-op when the run carries no capability registry (a programmatic
118
+ * fitness use that never wired the host capability plane) or the fit-pack domain
119
+ * is unregistered. Preferences come from fitness's own `plugins.checkPackages`
120
+ * reader — no dependency on `@opensip-cli/config`.
121
+ */
122
+ async function loadFitCheckPackages(projectDir) {
123
+ const registry = currentScope()?.capabilities;
124
+ if (!registry?.hasDomain('fit-pack'))
125
+ return [];
126
+ const prefs = readCheckPackagePreferences(projectDir);
127
+ const preferences = prefs.checkPackages === undefined ? {} : { packages: prefs.checkPackages };
128
+ return registry.isDomainLoaded('fit-pack', projectDir)
129
+ ? registry.domainLoadErrors('fit-pack')
130
+ : loadCapabilityDomain({
131
+ registry,
132
+ domainId: 'fit-pack',
133
+ projectDir,
134
+ cliDir: cliInstallDir(),
135
+ preferences,
136
+ });
137
+ }
138
+ /**
139
+ * Resolve the directory the CLI was installed into. Built-in check packs
140
+ * (the @opensip-cli/* fit-packs declared as deps in cli/package.json) always
141
+ * resolve from here, so a globally-installed CLI runs ITS OWN bundled checks at
142
+ * its own version — a project pinning an older @opensip-cli/checks-* cannot
143
+ * shadow them. Also the discovery fallback when no projectDir is supplied.
144
+ * Walks up from this module's URL to the opensip-cli package root so
145
+ * node_modules lookup sees the CLI's own dependency tree.
146
+ */
147
+ function cliInstallDir() {
148
+ // import.meta.url points at this file inside the CLI's dist/. The CLI
149
+ // package root is two levels up from dist/commands/. Resolve via the
150
+ // Node URL → path bridge to keep this OS-agnostic.
151
+ const thisFile = fileURLToPath(import.meta.url);
152
+ return dirname(dirname(dirname(thisFile)));
153
+ }
154
+ //# sourceMappingURL=check-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-loader.js","sourceRoot":"","sources":["../../../src/cli/fit/check-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `opensip-cli.config.yml` parsing + validation for the `fit` command.
3
+ *
4
+ * Wraps `loadSignalersConfig` and `loadTargetsConfig` so that
5
+ * `executeFit` gets a single resolve-or-error step. A missing/invalid
6
+ * config is a HARD error — otherwise file-based checks silently produce
7
+ * zero findings, the exact failure mode the CLI exists to prevent.
8
+ */
9
+ import { loadTargetsConfig } from '../../targets/index.js';
10
+ import type { SignalersConfig } from '../../signalers/types.js';
11
+ import type { ErrorResult, FitOptions } from '@opensip-cli/contracts';
12
+ export interface LoadedFitConfig {
13
+ signalersConfig: SignalersConfig;
14
+ targetsConfig: ReturnType<typeof loadTargetsConfig>['config'];
15
+ targetRegistry: ReturnType<typeof loadTargetsConfig>['registry'];
16
+ }
17
+ /**
18
+ * Resolve `signalersConfig` + `targetsConfig` for this run. Scope-first
19
+ * (ADR-0023 one-reader): on CLI paths both loaders project from the
20
+ * host-validated `scope.configDocument`; the file read is the scope-less
21
+ * fallback (programmatic use, unit tests). Returns an `ErrorResult` instead
22
+ * of throwing so the caller maps it directly to the public failure shape — a
23
+ * missing/invalid config is a HARD error (otherwise file-based checks
24
+ * silently produce zero findings).
25
+ */
26
+ export declare function loadFitConfig(args: FitOptions): LoadedFitConfig | {
27
+ error: ErrorResult;
28
+ };
29
+ /**
30
+ * Warn loudly when the targets config declares a `languages:` tag that is
31
+ * neither backed by a content-filter adapter NOR a recognized non-code
32
+ * format — i.e. a likely typo. Silent acceptance would let users ship
33
+ * configs whose files match no check and skip filtering with no signal.
34
+ *
35
+ * `languages:` is a *matching dimension* (it routes files to checks via
36
+ * `findByScope`). A subset of those tags have a registered
37
+ * {@link LanguageAdapter} that strips strings/comments; another set are
38
+ * recognized non-code formats (JSON, YAML, Markdown, …) that are valid
39
+ * matching tags but intentionally have no adapter — files in those scan
40
+ * raw, which is correct, so they are NOT warned about. Only genuinely
41
+ * unrecognized tags (e.g. `pythonn`) warn.
42
+ *
43
+ * Returns warning strings (one per unknown-language batch) rather than
44
+ * writing to stderr — stderr writes during the Ink live view desync the
45
+ * renderer's frame tracking. `executeFit` collects these and threads
46
+ * them into `FitDoneResult.warnings`.
47
+ *
48
+ * Async only because `currentScope` is imported via dynamic import to
49
+ * keep the executeFit body free of fitness↔core import arrows beyond
50
+ * the kernel barrel. The scope is bound by the CLI pre-action-hook.
51
+ *
52
+ * @throws {Error} When called outside `runWithScope(...)` (no current scope).
53
+ */
54
+ export declare function validateLanguagesAgainstAdapters(targetRegistry: LoadedFitConfig['targetRegistry']): Promise<readonly string[]>;
55
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,cAAc,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;CAClE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAsBxF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,gCAAgC,CACpD,cAAc,EAAE,eAAe,CAAC,gBAAgB,CAAC,GAChD,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAuC5B"}