@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,271 @@
1
+ import { mkdirSync, writeFileSync, rmSync, mkdtempSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { enterScope, RunScope } from '@opensip-cli/core';
7
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
8
+ import { fitnessTool } from '../../tool.js';
9
+ import { loadPlugin, loadAllPlugins } from '../loader.js';
10
+ // Test fixtures are written to tmpdir() and dynamically imported. Node ESM
11
+ // resolution walks up from /tmp/... and can never reach the workspace's
12
+ // node_modules, so bare specifiers like '@opensip-cli/fitness' fail at
13
+ // import time. Resolve the fitness entrypoint here (the test file IS in
14
+ // fitness, so its require can resolve the package) and inject the absolute
15
+ // file URL into each fixture template.
16
+ const require = createRequire(import.meta.url);
17
+ const FITNESS_URL = pathToFileURL(require.resolve('@opensip-cli/fitness')).href;
18
+ let testDir;
19
+ beforeEach(() => {
20
+ // The fit plugin loader registers checks/recipes into the current scope's
21
+ // registries (`currentCheckRegistry()` / `currentRecipeRegistry()`), so each
22
+ // test runs inside a fresh RunScope carrying fitness's contributed subscope.
23
+ const scope = new RunScope();
24
+ Object.assign(scope, fitnessTool.contributeScope?.() ?? {});
25
+ enterScope(scope);
26
+ testDir = mkdtempSync(join(tmpdir(), 'opensip-loader-test-'));
27
+ });
28
+ afterEach(() => {
29
+ rmSync(testDir, { recursive: true, force: true });
30
+ });
31
+ describe('loadPlugin', () => {
32
+ it('loads a plugin that exports an empty checks array', async () => {
33
+ const pluginFile = join(testDir, 'empty-plugin.mjs');
34
+ writeFileSync(pluginFile, `
35
+ export const checks = [];
36
+ export const metadata = { name: 'empty', version: '1.0.0' };
37
+ `);
38
+ const plugin = {
39
+ type: 'file',
40
+ entryPoint: pluginFile,
41
+ namespace: 'empty-plugin',
42
+ source: 'empty-plugin.mjs',
43
+ };
44
+ const result = await loadPlugin(plugin);
45
+ expect(result.registered.checks).toBe(0);
46
+ expect(result.error).toBeUndefined();
47
+ expect(result.namespace).toBe('empty-plugin');
48
+ });
49
+ it('handles plugin that throws on import', async () => {
50
+ const pluginFile = join(testDir, 'broken-plugin.mjs');
51
+ writeFileSync(pluginFile, 'throw new Error("plugin init failed")');
52
+ const plugin = {
53
+ type: 'file',
54
+ entryPoint: pluginFile,
55
+ namespace: 'broken',
56
+ source: 'broken-plugin.mjs',
57
+ };
58
+ const result = await loadPlugin(plugin);
59
+ // On a load failure the kernel reports an empty count map.
60
+ expect(result.registered).toEqual({});
61
+ expect(result.error).toContain('plugin init failed');
62
+ });
63
+ it('handles plugin with no exports gracefully', async () => {
64
+ const pluginFile = join(testDir, 'no-exports.mjs');
65
+ writeFileSync(pluginFile, '// nothing exported');
66
+ const plugin = {
67
+ type: 'file',
68
+ entryPoint: pluginFile,
69
+ namespace: 'no-exports',
70
+ source: 'no-exports.mjs',
71
+ };
72
+ const result = await loadPlugin(plugin);
73
+ expect(result.registered.checks).toBe(0);
74
+ expect(result.registered.recipes).toBe(0);
75
+ expect(result.error).toBeUndefined();
76
+ });
77
+ it('skips non-Check objects in checks array', async () => {
78
+ const pluginFile = join(testDir, 'bad-checks.mjs');
79
+ writeFileSync(pluginFile, `
80
+ export const checks = [
81
+ { notACheck: true },
82
+ "string",
83
+ 42,
84
+ null,
85
+ ];
86
+ `);
87
+ const plugin = {
88
+ type: 'file',
89
+ entryPoint: pluginFile,
90
+ namespace: 'bad-checks',
91
+ source: 'bad-checks.mjs',
92
+ };
93
+ const result = await loadPlugin(plugin);
94
+ expect(result.registered.checks).toBe(0);
95
+ expect(result.error).toBeUndefined();
96
+ });
97
+ it('registers Check instances exported as named exports (no array wrapper)', async () => {
98
+ const pluginFile = join(testDir, 'named-export-checks.mjs');
99
+ writeFileSync(pluginFile, `
100
+ import { defineCheck } from '${FITNESS_URL}';
101
+
102
+ export const myFirstCheck = defineCheck({
103
+ id: '11111111-1111-1111-1111-111111111111',
104
+ slug: 'my-first',
105
+ description: 'First check via named export',
106
+ scope: { languages: ['rust'], concerns: [] },
107
+ tags: ['quality'],
108
+ analyze: () => [],
109
+ });
110
+
111
+ export const mySecondCheck = defineCheck({
112
+ id: '22222222-2222-2222-2222-222222222222',
113
+ slug: 'my-second',
114
+ description: 'Second check via named export',
115
+ scope: { languages: ['rust'], concerns: [] },
116
+ tags: ['quality'],
117
+ analyze: () => [],
118
+ });
119
+
120
+ // Non-check named exports are ignored
121
+ export const helper = (s) => s;
122
+ export const VERSION = '1.0.0';
123
+ `);
124
+ const plugin = {
125
+ type: 'file',
126
+ entryPoint: pluginFile,
127
+ namespace: 'named-export-checks',
128
+ source: 'named-export-checks.mjs',
129
+ };
130
+ const result = await loadPlugin(plugin);
131
+ expect(result.error).toBeUndefined();
132
+ expect(result.registered.checks).toBe(2);
133
+ });
134
+ it('registers a Check from default export', async () => {
135
+ const pluginFile = join(testDir, 'default-export-check.mjs');
136
+ writeFileSync(pluginFile, `
137
+ import { defineCheck } from '${FITNESS_URL}';
138
+
139
+ export default defineCheck({
140
+ id: '33333333-3333-3333-3333-333333333333',
141
+ slug: 'default-check',
142
+ description: 'Single check via default export',
143
+ scope: { languages: ['rust'], concerns: [] },
144
+ tags: ['quality'],
145
+ analyze: () => [],
146
+ });
147
+ `);
148
+ const plugin = {
149
+ type: 'file',
150
+ entryPoint: pluginFile,
151
+ namespace: 'default-export-check',
152
+ source: 'default-export-check.mjs',
153
+ };
154
+ const result = await loadPlugin(plugin);
155
+ expect(result.error).toBeUndefined();
156
+ expect(result.registered.checks).toBe(1);
157
+ });
158
+ it('warns and skips when checks export is not an array', async () => {
159
+ const pluginFile = join(testDir, 'non-array-checks.mjs');
160
+ writeFileSync(pluginFile, `
161
+ export const checks = { not: 'an-array' };
162
+ `);
163
+ const plugin = {
164
+ type: 'file',
165
+ entryPoint: pluginFile,
166
+ namespace: 'non-array-checks',
167
+ source: 'non-array-checks.mjs',
168
+ };
169
+ const result = await loadPlugin(plugin);
170
+ // Loader warns and continues — no error, zero registrations.
171
+ expect(result.error).toBeUndefined();
172
+ expect(result.registered.checks).toBe(0);
173
+ });
174
+ it('registers recipes alongside checks', async () => {
175
+ const pluginFile = join(testDir, 'with-recipes.mjs');
176
+ writeFileSync(pluginFile, `
177
+ export const recipes = [
178
+ {
179
+ id: 'URCP_plugin-test',
180
+ name: 'plugin-recipe-test',
181
+ displayName: 'Plugin Test',
182
+ description: 'recipe contributed by a plugin',
183
+ checks: { type: 'all', exclude: [] },
184
+ execution: { mode: 'parallel', stopOnFirstFailure: false, timeout: 30000 },
185
+ reporting: { format: 'table', verbose: false },
186
+ },
187
+ ];
188
+ `);
189
+ const plugin = {
190
+ type: 'file',
191
+ entryPoint: pluginFile,
192
+ namespace: 'plugin-recipes',
193
+ source: 'with-recipes.mjs',
194
+ };
195
+ const result = await loadPlugin(plugin);
196
+ expect(result.error).toBeUndefined();
197
+ expect(result.registered.recipes).toBeGreaterThanOrEqual(1);
198
+ });
199
+ it('warns on malformed recipe entries (missing id/name) without failing', async () => {
200
+ const pluginFile = join(testDir, 'malformed-recipes.mjs');
201
+ writeFileSync(pluginFile, `
202
+ export const recipes = [
203
+ { malformed: true },
204
+ null,
205
+ ];
206
+ `);
207
+ const plugin = {
208
+ type: 'file',
209
+ entryPoint: pluginFile,
210
+ namespace: 'malformed-recipes',
211
+ source: 'malformed-recipes.mjs',
212
+ };
213
+ const result = await loadPlugin(plugin);
214
+ expect(result.error).toBeUndefined();
215
+ expect(result.registered.recipes).toBe(0);
216
+ });
217
+ it('deduplicates checks appearing in both array and named exports', async () => {
218
+ const pluginFile = join(testDir, 'dedup-checks.mjs');
219
+ writeFileSync(pluginFile, `
220
+ import { defineCheck } from '${FITNESS_URL}';
221
+
222
+ export const sameCheck = defineCheck({
223
+ id: '44444444-4444-4444-4444-444444444444',
224
+ slug: 'same',
225
+ description: 'Same check exported two ways',
226
+ scope: { languages: ['rust'], concerns: [] },
227
+ tags: ['quality'],
228
+ analyze: () => [],
229
+ });
230
+
231
+ export const checks = [sameCheck];
232
+ `);
233
+ const plugin = {
234
+ type: 'file',
235
+ entryPoint: pluginFile,
236
+ namespace: 'dedup-checks',
237
+ source: 'dedup-checks.mjs',
238
+ };
239
+ const result = await loadPlugin(plugin);
240
+ expect(result.error).toBeUndefined();
241
+ expect(result.registered.checks).toBe(1);
242
+ });
243
+ });
244
+ describe('loadAllPlugins', () => {
245
+ it('returns empty result when no plugins found', async () => {
246
+ const result = await loadAllPlugins('fit', join(testDir, 'nonexistent'));
247
+ expect(result.plugins).toEqual([]);
248
+ expect(result.totals).toEqual({});
249
+ expect(result.errors).toEqual([]);
250
+ });
251
+ it('aggregates results from multiple plugins', async () => {
252
+ // Project layout: opensip-cli/fit/checks/<file>.mjs
253
+ const checksDir = join(testDir, 'opensip-cli', 'fit', 'checks');
254
+ mkdirSync(checksDir, { recursive: true });
255
+ writeFileSync(join(checksDir, 'a.mjs'), 'export const checks = []');
256
+ writeFileSync(join(checksDir, 'b.mjs'), 'export const checks = []');
257
+ const result = await loadAllPlugins('fit', testDir);
258
+ expect(result.plugins).toHaveLength(2);
259
+ });
260
+ it('collects errors from failed plugins', async () => {
261
+ const checksDir = join(testDir, 'opensip-cli', 'fit', 'checks');
262
+ mkdirSync(checksDir, { recursive: true });
263
+ writeFileSync(join(checksDir, 'ok.mjs'), 'export const checks = []');
264
+ writeFileSync(join(checksDir, 'bad.mjs'), 'throw new Error("boom")');
265
+ const result = await loadAllPlugins('fit', testDir);
266
+ expect(result.plugins).toHaveLength(2);
267
+ expect(result.errors).toHaveLength(1);
268
+ expect(result.errors[0]).toContain('boom');
269
+ });
270
+ });
271
+ //# sourceMappingURL=loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/plugins/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview The `plugins.checkPackages` preference reader.
3
+ *
4
+ * Check-pack discovery + resolution (marker walk, the `@opensip-cli` built-in
5
+ * split, explicit-name resolution, the single-core guard) lives in the GENERIC
6
+ * capability substrate (`@opensip-cli/core`) now. This module keeps only the
7
+ * fitness-side reader for the documented `plugins.checkPackages` config key —
8
+ * fitness resolves its own preference without depending on `@opensip-cli/config`,
9
+ * then hands an explicit-package list to the generic loader.
10
+ */
11
+ /**
12
+ * Read `plugins.checkPackages` from the project's opensip-cli.config.yml
13
+ * without a full schema parse. Mirrors the inline-yaml-read pattern used by
14
+ * `readProjectPluginsList()` — avoids a circular dep between plugins/ and targets/.
15
+ */
16
+ export declare function readCheckPackagePreferences(projectDir: string): {
17
+ readonly checkPackages?: readonly string[];
18
+ };
19
+ //# sourceMappingURL=check-package-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-package-discovery.d.ts","sourceRoot":"","sources":["../../src/plugins/check-package-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C,CAYA"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview The `plugins.checkPackages` preference reader.
3
+ *
4
+ * Check-pack discovery + resolution (marker walk, the `@opensip-cli` built-in
5
+ * split, explicit-name resolution, the single-core guard) lives in the GENERIC
6
+ * capability substrate (`@opensip-cli/core`) now. This module keeps only the
7
+ * fitness-side reader for the documented `plugins.checkPackages` config key —
8
+ * fitness resolves its own preference without depending on `@opensip-cli/config`,
9
+ * then hands an explicit-package list to the generic loader.
10
+ */
11
+ import { join } from 'node:path';
12
+ import { readYamlFile } from '@opensip-cli/core';
13
+ const CONFIG_FILENAME = 'opensip-cli.config.yml';
14
+ /**
15
+ * Read `plugins.checkPackages` from the project's opensip-cli.config.yml
16
+ * without a full schema parse. Mirrors the inline-yaml-read pattern used by
17
+ * `readProjectPluginsList()` — avoids a circular dep between plugins/ and targets/.
18
+ */
19
+ export function readCheckPackagePreferences(projectDir) {
20
+ const configPath = join(projectDir, CONFIG_FILENAME);
21
+ const doc = readYamlFile(configPath);
22
+ if (!doc || typeof doc !== 'object')
23
+ return {};
24
+ const plugins = doc.plugins;
25
+ if (!plugins || typeof plugins !== 'object')
26
+ return {};
27
+ const p = plugins;
28
+ const result = {};
29
+ if (Array.isArray(p.checkPackages)) {
30
+ result.checkPackages = p.checkPackages.filter((v) => typeof v === 'string');
31
+ }
32
+ return result;
33
+ }
34
+ //# sourceMappingURL=check-package-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-package-discovery.js","sourceRoot":"","sources":["../../src/plugins/check-package-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,UAAkB;IAG5D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAI,GAA+B,CAAC,OAAO,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,CAAC,GAAG,OAAkC,CAAC;IAC7C,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Fitness plugin loader — adapter over core's generic loader.
3
+ *
4
+ * Core owns the discovery, dynamic-import, error-wrap, and log machinery
5
+ * (see @opensip-cli/core's loadPlugin / loadAllPlugins). This file
6
+ * supplies the fitness-specific `registerExports` callback that knows
7
+ * how to interpret a `FitPluginExports`-shaped module: register
8
+ * language adapters (for the `lang` domain), checks (named or in a
9
+ * `checks` array), and recipes.
10
+ *
11
+ * Public API (`loadPlugin`, `loadAllPlugins`) is preserved so existing
12
+ * callers (fit.ts) don't change.
13
+ */
14
+ import type { DiscoveredPlugin, LoadedPlugin, PluginLayout, PluginLoadResult } from '@opensip-cli/core';
15
+ /**
16
+ * Fitness's project-local plugin layout — user checks/recipes live under
17
+ * `<project>/opensip-cli/fit/{checks,recipes}/`. Exported so the
18
+ * `fitnessTool` descriptor (`Tool.pluginLayout`) and the CLI's `plugin`
19
+ * command share one source of truth (ADR-0009 corollary 1).
20
+ */
21
+ export declare const FIT_PLUGIN_LAYOUT: PluginLayout;
22
+ /**
23
+ * Fitness-domain `loadPlugin` entry point. Dispatches to the right
24
+ * `registerExports` callback (fit vs lang) and delegates to core's loader.
25
+ */
26
+ export declare function loadPlugin(plugin: DiscoveredPlugin, domain?: string): Promise<LoadedPlugin>;
27
+ /**
28
+ * Fitness-domain `loadAllPlugins` entry point. Dispatches to the right
29
+ * `registerExports` callback (fit vs lang) and delegates to core's loader.
30
+ */
31
+ export declare function loadAllPlugins(domain: string, projectDir?: string): Promise<PluginLoadResult>;
32
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EACV,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAGjB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAG/B,CAAC;AA0KF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,SAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAGhG;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAI3B"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @fileoverview Fitness plugin loader — adapter over core's generic loader.
3
+ *
4
+ * Core owns the discovery, dynamic-import, error-wrap, and log machinery
5
+ * (see @opensip-cli/core's loadPlugin / loadAllPlugins). This file
6
+ * supplies the fitness-specific `registerExports` callback that knows
7
+ * how to interpret a `FitPluginExports`-shaped module: register
8
+ * language adapters (for the `lang` domain), checks (named or in a
9
+ * `checks` array), and recipes.
10
+ *
11
+ * Public API (`loadPlugin`, `loadAllPlugins`) is preserved so existing
12
+ * callers (fit.ts) don't change.
13
+ */
14
+ import { currentScope, loadAllPlugins as coreLoadAllPlugins, loadPlugin as coreLoadPlugin, registerRecipesFromMod, } from '@opensip-cli/core';
15
+ import { isCheck } from '../framework/check-types.js';
16
+ import { currentCheckRegistry, currentRecipeRegistry } from '../framework/scope-registry.js';
17
+ /**
18
+ * Fitness's project-local plugin layout — user checks/recipes live under
19
+ * `<project>/opensip-cli/fit/{checks,recipes}/`. Exported so the
20
+ * `fitnessTool` descriptor (`Tool.pluginLayout`) and the CLI's `plugin`
21
+ * command share one source of truth (ADR-0009 corollary 1).
22
+ */
23
+ export const FIT_PLUGIN_LAYOUT = {
24
+ domain: 'fit',
25
+ userSubdirs: ['checks', 'recipes'],
26
+ };
27
+ /**
28
+ * Language-adapter domain layout — adapters ship as direct CLI deps, so
29
+ * there is no project-local loose-file layout or `plugins.lang` config path.
30
+ * The direct lang-domain loader remains only for direct programmatic/plugin
31
+ * tests; production adapter registration happens in the CLI bootstrap.
32
+ */
33
+ const LANG_PLUGIN_LAYOUT = { domain: 'lang', userSubdirs: [] };
34
+ /**
35
+ * Register a fitness-domain plugin's exports. Supports two authorship
36
+ * styles for checks:
37
+ *
38
+ * 1. `export const checks = [...]` — array of Check instances
39
+ * 2. `export const myCheck = defineCheck(...)` — Check as a named export
40
+ *
41
+ * Both styles can coexist in the same module; checks are deduplicated
42
+ * by their stable id so a check appearing in both forms is registered
43
+ * exactly once. Recipes are registered from a `recipes` array.
44
+ */
45
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- fit plugin registrar: two authorship styles for checks + recipe registration + default-export fallback; splitting fragments the warn/skip control flow
46
+ function registerFitExports(mod, ctx) {
47
+ const fit = mod;
48
+ const checkRegistry = currentCheckRegistry();
49
+ const registeredIds = new Set();
50
+ let checksRegistered = 0;
51
+ let recipesRegistered = 0;
52
+ // Style 1: explicit `checks` array
53
+ if (fit.checks !== undefined) {
54
+ if (Array.isArray(fit.checks)) {
55
+ for (const [index, check] of fit.checks.entries()) {
56
+ if (isCheck(check)) {
57
+ if (!registeredIds.has(check.config.id)) {
58
+ checkRegistry.register(check, ctx.plugin.namespace);
59
+ registeredIds.add(check.config.id);
60
+ checksRegistered++;
61
+ }
62
+ }
63
+ else {
64
+ ctx.warn('plugin.loader.invalid_check_item', `Plugin "${ctx.plugin.namespace}" checks[${index}] is not a valid Check object — skipping.`, { index });
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ ctx.warn('plugin.loader.invalid_checks_export', `Plugin "${ctx.plugin.namespace}" exports "checks" but it is not an array — skipping checks registration.`);
70
+ }
71
+ }
72
+ // Style 2: any named export that is a Check instance
73
+ for (const [exportName, value] of Object.entries(mod)) {
74
+ if (exportName === 'default' ||
75
+ exportName === 'checks' ||
76
+ exportName === 'recipes' ||
77
+ exportName === 'metadata')
78
+ continue;
79
+ if (isCheck(value) && !registeredIds.has(value.config.id)) {
80
+ checkRegistry.register(value, ctx.plugin.namespace);
81
+ registeredIds.add(value.config.id);
82
+ checksRegistered++;
83
+ }
84
+ }
85
+ // Default export: a single Check instance
86
+ const defaultExport = mod.default;
87
+ if (isCheck(defaultExport) && !registeredIds.has(defaultExport.config.id)) {
88
+ checkRegistry.register(defaultExport, ctx.plugin.namespace);
89
+ registeredIds.add(defaultExport.config.id);
90
+ checksRegistered++;
91
+ }
92
+ // Recipes — delegate to the shared helper. ctx.warn adapts to the
93
+ // helper's onWarn channel; the helper uses registry.has() to skip
94
+ // duplicates rather than the dead try/catch this block used to wrap.
95
+ const { recipesRegistered: helperRecipesRegistered } = registerRecipesFromMod(fit, currentRecipeRegistry(), {
96
+ namespace: ctx.plugin.namespace,
97
+ onWarn: (evt, message, extra) => ctx.warn(evt, message, extra),
98
+ });
99
+ recipesRegistered += helperRecipesRegistered;
100
+ return { checks: checksRegistered, recipes: recipesRegistered };
101
+ }
102
+ /**
103
+ * Register a lang-domain plugin's exports. Pulls LanguageAdapter
104
+ * instances from `adapters` array, named exports, and the default
105
+ * export; deduplicates by adapter id.
106
+ */
107
+ function registerLangExports(mod, ctx) {
108
+ const lang = mod;
109
+ const registeredAdapterIds = new Set();
110
+ let adaptersRegistered = 0;
111
+ // The throws-documentation check requires JSDoc on functions with `throw`
112
+ // statements, but JSDoc placed above a `const arrow = ...` assignment is
113
+ // not attached to the arrow node (TS's leading-comment scan starts at the
114
+ // arrow's getFullStart, which is past the `=`). The closure captures
115
+ // `registeredAdapterIds` / `adaptersRegistered` / `ctx`, so it can't be
116
+ // hoisted to a top-level `function` declaration. Suppress the next-line
117
+ // directive with the same contract the JSDoc would carry.
118
+ // @fitness-ignore-next-line throws-documentation -- closure throws Error when called outside runWithScope; JSDoc cannot attach to a const-arrow
119
+ const tryRegisterAdapter = (value, sourceLabel) => {
120
+ if (!looksLikeLanguageAdapter(value))
121
+ return;
122
+ const id = value.id;
123
+ if (registeredAdapterIds.has(id))
124
+ return;
125
+ const scope = currentScope();
126
+ if (!scope) {
127
+ throw new Error('fitness plugin loader: language adapter registration attempted outside runWithScope. ' +
128
+ 'Plugin loading must run inside a RunScope so adapters land in cli.scope.languages.');
129
+ }
130
+ scope.languages.register(value);
131
+ registeredAdapterIds.add(id);
132
+ adaptersRegistered++;
133
+ ctx.debug('plugin.loader.adapter.registered', { source: sourceLabel, id });
134
+ };
135
+ if (lang.adapters !== undefined) {
136
+ if (Array.isArray(lang.adapters)) {
137
+ for (const [index, adapter] of lang.adapters.entries()) {
138
+ if (looksLikeLanguageAdapter(adapter)) {
139
+ tryRegisterAdapter(adapter, `adapters[${index}]`);
140
+ }
141
+ else {
142
+ ctx.warn('plugin.loader.invalid_adapter_item', `Plugin "${ctx.plugin.namespace}" adapters[${index}] is not a valid LanguageAdapter — skipping.`, { index });
143
+ }
144
+ }
145
+ }
146
+ else {
147
+ ctx.warn('plugin.loader.invalid_adapters_export', `Plugin "${ctx.plugin.namespace}" exports "adapters" but it is not an array — skipping adapter registration.`);
148
+ }
149
+ }
150
+ // Named exports that look like LanguageAdapter
151
+ for (const [exportName, value] of Object.entries(mod)) {
152
+ if (exportName === 'default' ||
153
+ exportName === 'adapters' ||
154
+ exportName === 'checks' ||
155
+ exportName === 'recipes' ||
156
+ exportName === 'metadata')
157
+ continue;
158
+ tryRegisterAdapter(value, `named:${exportName}`);
159
+ }
160
+ // Default export: a single LanguageAdapter
161
+ tryRegisterAdapter(mod.default, 'default');
162
+ return { adapters: adaptersRegistered };
163
+ }
164
+ /**
165
+ * Fitness-domain `loadPlugin` entry point. Dispatches to the right
166
+ * `registerExports` callback (fit vs lang) and delegates to core's loader.
167
+ */
168
+ export async function loadPlugin(plugin, domain = 'fit') {
169
+ const register = domain === 'lang' ? registerLangExports : registerFitExports;
170
+ return coreLoadPlugin(plugin, register);
171
+ }
172
+ /**
173
+ * Fitness-domain `loadAllPlugins` entry point. Dispatches to the right
174
+ * `registerExports` callback (fit vs lang) and delegates to core's loader.
175
+ */
176
+ export async function loadAllPlugins(domain, projectDir) {
177
+ const register = domain === 'lang' ? registerLangExports : registerFitExports;
178
+ const layout = domain === 'lang' ? LANG_PLUGIN_LAYOUT : FIT_PLUGIN_LAYOUT;
179
+ return coreLoadAllPlugins(layout, projectDir, register);
180
+ }
181
+ /**
182
+ * Structural check for LanguageAdapter — used by the lang plugin domain
183
+ * to identify adapter values among arbitrary named exports. We don't
184
+ * have a runtime type guard equivalent to isCheck() for adapters, so
185
+ * we duck-type the required surface (`id`, `fileExtensions`, `parse`,
186
+ * `stripStrings`, `stripComments`).
187
+ */
188
+ function looksLikeLanguageAdapter(value) {
189
+ if (!value || typeof value !== 'object')
190
+ return false;
191
+ const v = value;
192
+ return (typeof v.id === 'string' &&
193
+ Array.isArray(v.fileExtensions) &&
194
+ typeof v.parse === 'function' &&
195
+ typeof v.stripStrings === 'function' &&
196
+ typeof v.stripComments === 'function');
197
+ }
198
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Fitness plugin export contract
3
+ *
4
+ * What a fit-domain plugin exports.
5
+ * Held in fitness because it references Check / FitnessRecipe — types
6
+ * the kernel doesn't know about.
7
+ */
8
+ import type { Check } from '../framework/check-types.js';
9
+ import type { FitnessRecipe } from '../recipes/types.js';
10
+ /**
11
+ * Display entry for a fitness check: `[icon, displayName]`.
12
+ *
13
+ * A check pack keeps its checks' display in an authoring `CHECK_DISPLAY` map
14
+ * (slug → `[icon, displayName]`) and folds it ONTO its checks via
15
+ * `applyCheckDisplay` at the pack barrel — so display travels on each check's
16
+ * `config` (§5.3 separate-domains fold). There is no separate `checkDisplay`
17
+ * plugin export and no merged-display singleton; slugs without an entry fall
18
+ * back to kebab-to-title-case + a default icon.
19
+ *
20
+ * Owned by fitness (ADR-0009): this is tool-specific vocabulary that used to
21
+ * live in the kernel; check packs import it from `@opensip-cli/fitness`.
22
+ */
23
+ export type CheckDisplayEntry = readonly [icon: string, displayName: string];
24
+ /** What a fitness plugin package/file exports */
25
+ export interface FitPluginExports {
26
+ readonly checks?: readonly Check[];
27
+ readonly recipes?: readonly FitnessRecipe[];
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAE7E,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Fitness plugin export contract
3
+ *
4
+ * What a fit-domain plugin exports.
5
+ * Held in fitness because it references Check / FitnessRecipe — types
6
+ * the kernel doesn't know about.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=built-in-recipes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-recipes.test.d.ts","sourceRoot":"","sources":["../../../src/recipes/__tests__/built-in-recipes.test.ts"],"names":[],"mappings":""}