@opensip-tools/fitness 1.0.4

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 (461) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-typecheck.log +4 -0
  3. package/LICENSE +21 -0
  4. package/dist/__tests__/gate.test.d.ts +13 -0
  5. package/dist/__tests__/gate.test.d.ts.map +1 -0
  6. package/dist/__tests__/gate.test.js +422 -0
  7. package/dist/__tests__/gate.test.js.map +1 -0
  8. package/dist/__tests__/sarif.test.d.ts +2 -0
  9. package/dist/__tests__/sarif.test.d.ts.map +1 -0
  10. package/dist/__tests__/sarif.test.js +169 -0
  11. package/dist/__tests__/sarif.test.js.map +1 -0
  12. package/dist/cli/dashboard.d.ts +6 -0
  13. package/dist/cli/dashboard.d.ts.map +1 -0
  14. package/dist/cli/dashboard.js +77 -0
  15. package/dist/cli/dashboard.js.map +1 -0
  16. package/dist/cli/fit.d.ts +37 -0
  17. package/dist/cli/fit.d.ts.map +1 -0
  18. package/dist/cli/fit.js +539 -0
  19. package/dist/cli/fit.js.map +1 -0
  20. package/dist/cli/list-checks.d.ts +6 -0
  21. package/dist/cli/list-checks.d.ts.map +1 -0
  22. package/dist/cli/list-checks.js +23 -0
  23. package/dist/cli/list-checks.js.map +1 -0
  24. package/dist/cli/list-recipes.d.ts +6 -0
  25. package/dist/cli/list-recipes.d.ts.map +1 -0
  26. package/dist/cli/list-recipes.js +31 -0
  27. package/dist/cli/list-recipes.js.map +1 -0
  28. package/dist/framework/__tests__/ast-utilities.test.d.ts +2 -0
  29. package/dist/framework/__tests__/ast-utilities.test.d.ts.map +1 -0
  30. package/dist/framework/__tests__/ast-utilities.test.js +153 -0
  31. package/dist/framework/__tests__/ast-utilities.test.js.map +1 -0
  32. package/dist/framework/__tests__/check-config.test.d.ts +2 -0
  33. package/dist/framework/__tests__/check-config.test.d.ts.map +1 -0
  34. package/dist/framework/__tests__/check-config.test.js +56 -0
  35. package/dist/framework/__tests__/check-config.test.js.map +1 -0
  36. package/dist/framework/__tests__/command-executor.test.d.ts +2 -0
  37. package/dist/framework/__tests__/command-executor.test.d.ts.map +1 -0
  38. package/dist/framework/__tests__/command-executor.test.js +71 -0
  39. package/dist/framework/__tests__/command-executor.test.js.map +1 -0
  40. package/dist/framework/__tests__/content-filter-dispatch.test.d.ts +2 -0
  41. package/dist/framework/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
  42. package/dist/framework/__tests__/content-filter-dispatch.test.js +104 -0
  43. package/dist/framework/__tests__/content-filter-dispatch.test.js.map +1 -0
  44. package/dist/framework/__tests__/content-filter.test.d.ts +2 -0
  45. package/dist/framework/__tests__/content-filter.test.d.ts.map +1 -0
  46. package/dist/framework/__tests__/content-filter.test.js +126 -0
  47. package/dist/framework/__tests__/content-filter.test.js.map +1 -0
  48. package/dist/framework/__tests__/define-check.test.d.ts +2 -0
  49. package/dist/framework/__tests__/define-check.test.d.ts.map +1 -0
  50. package/dist/framework/__tests__/define-check.test.js +155 -0
  51. package/dist/framework/__tests__/define-check.test.js.map +1 -0
  52. package/dist/framework/__tests__/directive-inventory.test.d.ts +2 -0
  53. package/dist/framework/__tests__/directive-inventory.test.d.ts.map +1 -0
  54. package/dist/framework/__tests__/directive-inventory.test.js +44 -0
  55. package/dist/framework/__tests__/directive-inventory.test.js.map +1 -0
  56. package/dist/framework/__tests__/execution-context.test.d.ts +2 -0
  57. package/dist/framework/__tests__/execution-context.test.d.ts.map +1 -0
  58. package/dist/framework/__tests__/execution-context.test.js +62 -0
  59. package/dist/framework/__tests__/execution-context.test.js.map +1 -0
  60. package/dist/framework/__tests__/file-accessor.test.d.ts +2 -0
  61. package/dist/framework/__tests__/file-accessor.test.d.ts.map +1 -0
  62. package/dist/framework/__tests__/file-accessor.test.js +106 -0
  63. package/dist/framework/__tests__/file-accessor.test.js.map +1 -0
  64. package/dist/framework/__tests__/file-cache.test.d.ts +2 -0
  65. package/dist/framework/__tests__/file-cache.test.d.ts.map +1 -0
  66. package/dist/framework/__tests__/file-cache.test.js +122 -0
  67. package/dist/framework/__tests__/file-cache.test.js.map +1 -0
  68. package/dist/framework/__tests__/import-graph.test.d.ts +15 -0
  69. package/dist/framework/__tests__/import-graph.test.d.ts.map +1 -0
  70. package/dist/framework/__tests__/import-graph.test.js +164 -0
  71. package/dist/framework/__tests__/import-graph.test.js.map +1 -0
  72. package/dist/framework/__tests__/path-matcher.test.d.ts +2 -0
  73. package/dist/framework/__tests__/path-matcher.test.d.ts.map +1 -0
  74. package/dist/framework/__tests__/path-matcher.test.js +113 -0
  75. package/dist/framework/__tests__/path-matcher.test.js.map +1 -0
  76. package/dist/framework/__tests__/register-helpers.test.d.ts +2 -0
  77. package/dist/framework/__tests__/register-helpers.test.d.ts.map +1 -0
  78. package/dist/framework/__tests__/register-helpers.test.js +42 -0
  79. package/dist/framework/__tests__/register-helpers.test.js.map +1 -0
  80. package/dist/framework/__tests__/registry.test.d.ts +2 -0
  81. package/dist/framework/__tests__/registry.test.d.ts.map +1 -0
  82. package/dist/framework/__tests__/registry.test.js +208 -0
  83. package/dist/framework/__tests__/registry.test.js.map +1 -0
  84. package/dist/framework/__tests__/result-builder.test.d.ts +2 -0
  85. package/dist/framework/__tests__/result-builder.test.d.ts.map +1 -0
  86. package/dist/framework/__tests__/result-builder.test.js +153 -0
  87. package/dist/framework/__tests__/result-builder.test.js.map +1 -0
  88. package/dist/framework/__tests__/scope-resolver.test.d.ts +2 -0
  89. package/dist/framework/__tests__/scope-resolver.test.d.ts.map +1 -0
  90. package/dist/framework/__tests__/scope-resolver.test.js +140 -0
  91. package/dist/framework/__tests__/scope-resolver.test.js.map +1 -0
  92. package/dist/framework/__tests__/severity-mapping.test.d.ts +2 -0
  93. package/dist/framework/__tests__/severity-mapping.test.d.ts.map +1 -0
  94. package/dist/framework/__tests__/severity-mapping.test.js +42 -0
  95. package/dist/framework/__tests__/severity-mapping.test.js.map +1 -0
  96. package/dist/framework/__tests__/strip-literals.test.d.ts +2 -0
  97. package/dist/framework/__tests__/strip-literals.test.d.ts.map +1 -0
  98. package/dist/framework/__tests__/strip-literals.test.js +87 -0
  99. package/dist/framework/__tests__/strip-literals.test.js.map +1 -0
  100. package/dist/framework/abortable-exec.d.ts +34 -0
  101. package/dist/framework/abortable-exec.d.ts.map +1 -0
  102. package/dist/framework/abortable-exec.js +136 -0
  103. package/dist/framework/abortable-exec.js.map +1 -0
  104. package/dist/framework/ast-utilities.d.ts +41 -0
  105. package/dist/framework/ast-utilities.d.ts.map +1 -0
  106. package/dist/framework/ast-utilities.js +106 -0
  107. package/dist/framework/ast-utilities.js.map +1 -0
  108. package/dist/framework/check-config.d.ts +171 -0
  109. package/dist/framework/check-config.d.ts.map +1 -0
  110. package/dist/framework/check-config.js +114 -0
  111. package/dist/framework/check-config.js.map +1 -0
  112. package/dist/framework/check-types.d.ts +57 -0
  113. package/dist/framework/check-types.d.ts.map +1 -0
  114. package/dist/framework/check-types.js +35 -0
  115. package/dist/framework/check-types.js.map +1 -0
  116. package/dist/framework/command-executor.d.ts +25 -0
  117. package/dist/framework/command-executor.d.ts.map +1 -0
  118. package/dist/framework/command-executor.js +63 -0
  119. package/dist/framework/command-executor.js.map +1 -0
  120. package/dist/framework/constants.d.ts +9 -0
  121. package/dist/framework/constants.d.ts.map +1 -0
  122. package/dist/framework/constants.js +16 -0
  123. package/dist/framework/constants.js.map +1 -0
  124. package/dist/framework/content-filter.d.ts +33 -0
  125. package/dist/framework/content-filter.d.ts.map +1 -0
  126. package/dist/framework/content-filter.js +236 -0
  127. package/dist/framework/content-filter.js.map +1 -0
  128. package/dist/framework/define-check.d.ts +38 -0
  129. package/dist/framework/define-check.d.ts.map +1 -0
  130. package/dist/framework/define-check.js +252 -0
  131. package/dist/framework/define-check.js.map +1 -0
  132. package/dist/framework/directive-inventory.d.ts +34 -0
  133. package/dist/framework/directive-inventory.d.ts.map +1 -0
  134. package/dist/framework/directive-inventory.js +77 -0
  135. package/dist/framework/directive-inventory.js.map +1 -0
  136. package/dist/framework/directive-parsing.d.ts +20 -0
  137. package/dist/framework/directive-parsing.d.ts.map +1 -0
  138. package/dist/framework/directive-parsing.js +121 -0
  139. package/dist/framework/directive-parsing.js.map +1 -0
  140. package/dist/framework/execution-context.d.ts +95 -0
  141. package/dist/framework/execution-context.d.ts.map +1 -0
  142. package/dist/framework/execution-context.js +122 -0
  143. package/dist/framework/execution-context.js.map +1 -0
  144. package/dist/framework/file-accessor.d.ts +20 -0
  145. package/dist/framework/file-accessor.d.ts.map +1 -0
  146. package/dist/framework/file-accessor.js +122 -0
  147. package/dist/framework/file-accessor.js.map +1 -0
  148. package/dist/framework/file-cache.d.ts +70 -0
  149. package/dist/framework/file-cache.d.ts.map +1 -0
  150. package/dist/framework/file-cache.js +178 -0
  151. package/dist/framework/file-cache.js.map +1 -0
  152. package/dist/framework/file-type-filter.d.ts +11 -0
  153. package/dist/framework/file-type-filter.d.ts.map +1 -0
  154. package/dist/framework/file-type-filter.js +21 -0
  155. package/dist/framework/file-type-filter.js.map +1 -0
  156. package/dist/framework/ignore-processing.d.ts +22 -0
  157. package/dist/framework/ignore-processing.d.ts.map +1 -0
  158. package/dist/framework/ignore-processing.js +241 -0
  159. package/dist/framework/ignore-processing.js.map +1 -0
  160. package/dist/framework/import-graph.d.ts +51 -0
  161. package/dist/framework/import-graph.d.ts.map +1 -0
  162. package/dist/framework/import-graph.js +216 -0
  163. package/dist/framework/import-graph.js.map +1 -0
  164. package/dist/framework/memory-profiler.d.ts +53 -0
  165. package/dist/framework/memory-profiler.d.ts.map +1 -0
  166. package/dist/framework/memory-profiler.js +92 -0
  167. package/dist/framework/memory-profiler.js.map +1 -0
  168. package/dist/framework/parse-cache.d.ts +23 -0
  169. package/dist/framework/parse-cache.d.ts.map +1 -0
  170. package/dist/framework/parse-cache.js +37 -0
  171. package/dist/framework/parse-cache.js.map +1 -0
  172. package/dist/framework/path-matcher.d.ts +86 -0
  173. package/dist/framework/path-matcher.d.ts.map +1 -0
  174. package/dist/framework/path-matcher.js +138 -0
  175. package/dist/framework/path-matcher.js.map +1 -0
  176. package/dist/framework/register-helpers.d.ts +10 -0
  177. package/dist/framework/register-helpers.d.ts.map +1 -0
  178. package/dist/framework/register-helpers.js +17 -0
  179. package/dist/framework/register-helpers.js.map +1 -0
  180. package/dist/framework/registry.d.ts +41 -0
  181. package/dist/framework/registry.d.ts.map +1 -0
  182. package/dist/framework/registry.js +103 -0
  183. package/dist/framework/registry.js.map +1 -0
  184. package/dist/framework/result-builder.d.ts +74 -0
  185. package/dist/framework/result-builder.d.ts.map +1 -0
  186. package/dist/framework/result-builder.js +154 -0
  187. package/dist/framework/result-builder.js.map +1 -0
  188. package/dist/framework/scope-resolver.d.ts +23 -0
  189. package/dist/framework/scope-resolver.d.ts.map +1 -0
  190. package/dist/framework/scope-resolver.js +201 -0
  191. package/dist/framework/scope-resolver.js.map +1 -0
  192. package/dist/framework/severity-mapping.d.ts +13 -0
  193. package/dist/framework/severity-mapping.d.ts.map +1 -0
  194. package/dist/framework/severity-mapping.js +51 -0
  195. package/dist/framework/severity-mapping.js.map +1 -0
  196. package/dist/framework/strip-literals.d.ts +48 -0
  197. package/dist/framework/strip-literals.d.ts.map +1 -0
  198. package/dist/framework/strip-literals.js +188 -0
  199. package/dist/framework/strip-literals.js.map +1 -0
  200. package/dist/gate.d.ts +74 -0
  201. package/dist/gate.d.ts.map +1 -0
  202. package/dist/gate.js +257 -0
  203. package/dist/gate.js.map +1 -0
  204. package/dist/index.d.ts +47 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +51 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/plugins/__tests__/check-package-discovery.test.d.ts +2 -0
  209. package/dist/plugins/__tests__/check-package-discovery.test.d.ts.map +1 -0
  210. package/dist/plugins/__tests__/check-package-discovery.test.js +170 -0
  211. package/dist/plugins/__tests__/check-package-discovery.test.js.map +1 -0
  212. package/dist/plugins/__tests__/lang-domain.test.d.ts +2 -0
  213. package/dist/plugins/__tests__/lang-domain.test.d.ts.map +1 -0
  214. package/dist/plugins/__tests__/lang-domain.test.js +171 -0
  215. package/dist/plugins/__tests__/lang-domain.test.js.map +1 -0
  216. package/dist/plugins/__tests__/loader.test.d.ts +2 -0
  217. package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
  218. package/dist/plugins/__tests__/loader.test.js +194 -0
  219. package/dist/plugins/__tests__/loader.test.js.map +1 -0
  220. package/dist/plugins/check-package-discovery.d.ts +73 -0
  221. package/dist/plugins/check-package-discovery.d.ts.map +1 -0
  222. package/dist/plugins/check-package-discovery.js +212 -0
  223. package/dist/plugins/check-package-discovery.js.map +1 -0
  224. package/dist/plugins/loader.d.ts +31 -0
  225. package/dist/plugins/loader.d.ts.map +1 -0
  226. package/dist/plugins/loader.js +290 -0
  227. package/dist/plugins/loader.js.map +1 -0
  228. package/dist/plugins/types.d.ts +23 -0
  229. package/dist/plugins/types.d.ts.map +1 -0
  230. package/dist/plugins/types.js +9 -0
  231. package/dist/plugins/types.js.map +1 -0
  232. package/dist/recipes/__tests__/built-in-recipes.test.d.ts +2 -0
  233. package/dist/recipes/__tests__/built-in-recipes.test.d.ts.map +1 -0
  234. package/dist/recipes/__tests__/built-in-recipes.test.js +93 -0
  235. package/dist/recipes/__tests__/built-in-recipes.test.js.map +1 -0
  236. package/dist/recipes/__tests__/check-config.test.d.ts +5 -0
  237. package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
  238. package/dist/recipes/__tests__/check-config.test.js +37 -0
  239. package/dist/recipes/__tests__/check-config.test.js.map +1 -0
  240. package/dist/recipes/__tests__/check-resolution.test.d.ts +2 -0
  241. package/dist/recipes/__tests__/check-resolution.test.d.ts.map +1 -0
  242. package/dist/recipes/__tests__/check-resolution.test.js +135 -0
  243. package/dist/recipes/__tests__/check-resolution.test.js.map +1 -0
  244. package/dist/recipes/__tests__/registry.test.d.ts +2 -0
  245. package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
  246. package/dist/recipes/__tests__/registry.test.js +97 -0
  247. package/dist/recipes/__tests__/registry.test.js.map +1 -0
  248. package/dist/recipes/__tests__/retry.test.d.ts +2 -0
  249. package/dist/recipes/__tests__/retry.test.d.ts.map +1 -0
  250. package/dist/recipes/__tests__/retry.test.js +75 -0
  251. package/dist/recipes/__tests__/retry.test.js.map +1 -0
  252. package/dist/recipes/__tests__/service.test.d.ts +11 -0
  253. package/dist/recipes/__tests__/service.test.d.ts.map +1 -0
  254. package/dist/recipes/__tests__/service.test.js +482 -0
  255. package/dist/recipes/__tests__/service.test.js.map +1 -0
  256. package/dist/recipes/built-in-recipes.d.ts +14 -0
  257. package/dist/recipes/built-in-recipes.d.ts.map +1 -0
  258. package/dist/recipes/built-in-recipes.js +247 -0
  259. package/dist/recipes/built-in-recipes.js.map +1 -0
  260. package/dist/recipes/check-config.d.ts +40 -0
  261. package/dist/recipes/check-config.d.ts.map +1 -0
  262. package/dist/recipes/check-config.js +61 -0
  263. package/dist/recipes/check-config.js.map +1 -0
  264. package/dist/recipes/check-resolution.d.ts +21 -0
  265. package/dist/recipes/check-resolution.d.ts.map +1 -0
  266. package/dist/recipes/check-resolution.js +121 -0
  267. package/dist/recipes/check-resolution.js.map +1 -0
  268. package/dist/recipes/check-result-processor.d.ts +51 -0
  269. package/dist/recipes/check-result-processor.d.ts.map +1 -0
  270. package/dist/recipes/check-result-processor.js +158 -0
  271. package/dist/recipes/check-result-processor.js.map +1 -0
  272. package/dist/recipes/parallel-execution.d.ts +33 -0
  273. package/dist/recipes/parallel-execution.d.ts.map +1 -0
  274. package/dist/recipes/parallel-execution.js +142 -0
  275. package/dist/recipes/parallel-execution.js.map +1 -0
  276. package/dist/recipes/registry.d.ts +81 -0
  277. package/dist/recipes/registry.d.ts.map +1 -0
  278. package/dist/recipes/registry.js +131 -0
  279. package/dist/recipes/registry.js.map +1 -0
  280. package/dist/recipes/retry.d.ts +25 -0
  281. package/dist/recipes/retry.d.ts.map +1 -0
  282. package/dist/recipes/retry.js +44 -0
  283. package/dist/recipes/retry.js.map +1 -0
  284. package/dist/recipes/sequential-execution.d.ts +10 -0
  285. package/dist/recipes/sequential-execution.d.ts.map +1 -0
  286. package/dist/recipes/sequential-execution.js +122 -0
  287. package/dist/recipes/sequential-execution.js.map +1 -0
  288. package/dist/recipes/service-types.d.ts +84 -0
  289. package/dist/recipes/service-types.d.ts.map +1 -0
  290. package/dist/recipes/service-types.js +8 -0
  291. package/dist/recipes/service-types.js.map +1 -0
  292. package/dist/recipes/service.d.ts +71 -0
  293. package/dist/recipes/service.d.ts.map +1 -0
  294. package/dist/recipes/service.js +331 -0
  295. package/dist/recipes/service.js.map +1 -0
  296. package/dist/recipes/types.d.ts +154 -0
  297. package/dist/recipes/types.d.ts.map +1 -0
  298. package/dist/recipes/types.js +54 -0
  299. package/dist/recipes/types.js.map +1 -0
  300. package/dist/sarif.d.ts +34 -0
  301. package/dist/sarif.d.ts.map +1 -0
  302. package/dist/sarif.js +192 -0
  303. package/dist/sarif.js.map +1 -0
  304. package/dist/signalers/__tests__/loader.test.d.ts +2 -0
  305. package/dist/signalers/__tests__/loader.test.d.ts.map +1 -0
  306. package/dist/signalers/__tests__/loader.test.js +74 -0
  307. package/dist/signalers/__tests__/loader.test.js.map +1 -0
  308. package/dist/signalers/index.d.ts +8 -0
  309. package/dist/signalers/index.d.ts.map +1 -0
  310. package/dist/signalers/index.js +9 -0
  311. package/dist/signalers/index.js.map +1 -0
  312. package/dist/signalers/loader.d.ts +24 -0
  313. package/dist/signalers/loader.d.ts.map +1 -0
  314. package/dist/signalers/loader.js +108 -0
  315. package/dist/signalers/loader.js.map +1 -0
  316. package/dist/signalers/schema.d.ts +288 -0
  317. package/dist/signalers/schema.d.ts.map +1 -0
  318. package/dist/signalers/schema.js +99 -0
  319. package/dist/signalers/schema.js.map +1 -0
  320. package/dist/signalers/types.d.ts +13 -0
  321. package/dist/signalers/types.d.ts.map +1 -0
  322. package/dist/signalers/types.js +5 -0
  323. package/dist/signalers/types.js.map +1 -0
  324. package/dist/targets/__tests__/loader.test.d.ts +2 -0
  325. package/dist/targets/__tests__/loader.test.d.ts.map +1 -0
  326. package/dist/targets/__tests__/loader.test.js +127 -0
  327. package/dist/targets/__tests__/loader.test.js.map +1 -0
  328. package/dist/targets/__tests__/resolver.test.d.ts +2 -0
  329. package/dist/targets/__tests__/resolver.test.d.ts.map +1 -0
  330. package/dist/targets/__tests__/resolver.test.js +54 -0
  331. package/dist/targets/__tests__/resolver.test.js.map +1 -0
  332. package/dist/targets/__tests__/target-registry.test.d.ts +2 -0
  333. package/dist/targets/__tests__/target-registry.test.d.ts.map +1 -0
  334. package/dist/targets/__tests__/target-registry.test.js +89 -0
  335. package/dist/targets/__tests__/target-registry.test.js.map +1 -0
  336. package/dist/targets/index.d.ts +10 -0
  337. package/dist/targets/index.d.ts.map +1 -0
  338. package/dist/targets/index.js +12 -0
  339. package/dist/targets/index.js.map +1 -0
  340. package/dist/targets/loader.d.ts +19 -0
  341. package/dist/targets/loader.d.ts.map +1 -0
  342. package/dist/targets/loader.js +159 -0
  343. package/dist/targets/loader.js.map +1 -0
  344. package/dist/targets/resolver.d.ts +19 -0
  345. package/dist/targets/resolver.d.ts.map +1 -0
  346. package/dist/targets/resolver.js +37 -0
  347. package/dist/targets/resolver.js.map +1 -0
  348. package/dist/targets/target-registry.d.ts +61 -0
  349. package/dist/targets/target-registry.d.ts.map +1 -0
  350. package/dist/targets/target-registry.js +93 -0
  351. package/dist/targets/target-registry.js.map +1 -0
  352. package/dist/targets/types.d.ts +85 -0
  353. package/dist/targets/types.d.ts.map +1 -0
  354. package/dist/targets/types.js +5 -0
  355. package/dist/targets/types.js.map +1 -0
  356. package/dist/tool.d.ts +17 -0
  357. package/dist/tool.d.ts.map +1 -0
  358. package/dist/tool.js +282 -0
  359. package/dist/tool.js.map +1 -0
  360. package/dist/types/findings.d.ts +117 -0
  361. package/dist/types/findings.d.ts.map +1 -0
  362. package/dist/types/findings.js +93 -0
  363. package/dist/types/findings.js.map +1 -0
  364. package/dist/types/severity.d.ts +15 -0
  365. package/dist/types/severity.d.ts.map +1 -0
  366. package/dist/types/severity.js +36 -0
  367. package/dist/types/severity.js.map +1 -0
  368. package/package.json +45 -0
  369. package/src/__tests__/gate.test.ts +537 -0
  370. package/src/__tests__/sarif.test.ts +201 -0
  371. package/src/cli/dashboard.ts +93 -0
  372. package/src/cli/fit.ts +612 -0
  373. package/src/cli/list-checks.ts +32 -0
  374. package/src/cli/list-recipes.ts +38 -0
  375. package/src/framework/__tests__/ast-utilities.test.ts +157 -0
  376. package/src/framework/__tests__/check-config.test.ts +65 -0
  377. package/src/framework/__tests__/command-executor.test.ts +79 -0
  378. package/src/framework/__tests__/content-filter-dispatch.test.ts +132 -0
  379. package/src/framework/__tests__/content-filter.test.ts +136 -0
  380. package/src/framework/__tests__/define-check.test.ts +180 -0
  381. package/src/framework/__tests__/directive-inventory.test.ts +53 -0
  382. package/src/framework/__tests__/execution-context.test.ts +80 -0
  383. package/src/framework/__tests__/file-accessor.test.ts +121 -0
  384. package/src/framework/__tests__/file-cache.test.ts +142 -0
  385. package/src/framework/__tests__/import-graph.test.ts +282 -0
  386. package/src/framework/__tests__/path-matcher.test.ts +130 -0
  387. package/src/framework/__tests__/register-helpers.test.ts +51 -0
  388. package/src/framework/__tests__/registry.test.ts +243 -0
  389. package/src/framework/__tests__/result-builder.test.ts +178 -0
  390. package/src/framework/__tests__/scope-resolver.test.ts +208 -0
  391. package/src/framework/__tests__/severity-mapping.test.ts +50 -0
  392. package/src/framework/__tests__/strip-literals.test.ts +109 -0
  393. package/src/framework/abortable-exec.ts +177 -0
  394. package/src/framework/ast-utilities.ts +112 -0
  395. package/src/framework/check-config.ts +339 -0
  396. package/src/framework/check-types.ts +77 -0
  397. package/src/framework/command-executor.ts +100 -0
  398. package/src/framework/constants.ts +16 -0
  399. package/src/framework/content-filter.ts +288 -0
  400. package/src/framework/define-check.ts +336 -0
  401. package/src/framework/directive-inventory.ts +110 -0
  402. package/src/framework/directive-parsing.ts +152 -0
  403. package/src/framework/execution-context.ts +247 -0
  404. package/src/framework/file-accessor.ts +171 -0
  405. package/src/framework/file-cache.ts +220 -0
  406. package/src/framework/file-type-filter.ts +25 -0
  407. package/src/framework/ignore-processing.ts +350 -0
  408. package/src/framework/import-graph.ts +280 -0
  409. package/src/framework/memory-profiler.ts +145 -0
  410. package/src/framework/parse-cache.ts +38 -0
  411. package/src/framework/path-matcher.ts +191 -0
  412. package/src/framework/register-helpers.ts +20 -0
  413. package/src/framework/registry.ts +125 -0
  414. package/src/framework/result-builder.ts +225 -0
  415. package/src/framework/scope-resolver.ts +262 -0
  416. package/src/framework/severity-mapping.ts +56 -0
  417. package/src/framework/strip-literals.ts +200 -0
  418. package/src/gate.ts +337 -0
  419. package/src/index.ts +110 -0
  420. package/src/plugins/__tests__/check-package-discovery.test.ts +204 -0
  421. package/src/plugins/__tests__/lang-domain.test.ts +198 -0
  422. package/src/plugins/__tests__/loader.test.ts +226 -0
  423. package/src/plugins/check-package-discovery.ts +242 -0
  424. package/src/plugins/loader.ts +327 -0
  425. package/src/plugins/types.ts +25 -0
  426. package/src/recipes/__tests__/built-in-recipes.test.ts +107 -0
  427. package/src/recipes/__tests__/check-config.test.ts +51 -0
  428. package/src/recipes/__tests__/check-resolution.test.ts +185 -0
  429. package/src/recipes/__tests__/registry.test.ts +115 -0
  430. package/src/recipes/__tests__/retry.test.ts +83 -0
  431. package/src/recipes/__tests__/service.test.ts +572 -0
  432. package/src/recipes/built-in-recipes.ts +273 -0
  433. package/src/recipes/check-config.ts +64 -0
  434. package/src/recipes/check-resolution.ts +169 -0
  435. package/src/recipes/check-result-processor.ts +258 -0
  436. package/src/recipes/parallel-execution.ts +220 -0
  437. package/src/recipes/registry.ts +192 -0
  438. package/src/recipes/retry.ts +69 -0
  439. package/src/recipes/sequential-execution.ts +139 -0
  440. package/src/recipes/service-types.ts +105 -0
  441. package/src/recipes/service.ts +400 -0
  442. package/src/recipes/types.ts +247 -0
  443. package/src/sarif.ts +232 -0
  444. package/src/signalers/__tests__/loader.test.ts +99 -0
  445. package/src/signalers/index.ts +9 -0
  446. package/src/signalers/loader.ts +141 -0
  447. package/src/signalers/schema.ts +117 -0
  448. package/src/signalers/types.ts +15 -0
  449. package/src/targets/__tests__/loader.test.ts +170 -0
  450. package/src/targets/__tests__/resolver.test.ts +74 -0
  451. package/src/targets/__tests__/target-registry.test.ts +103 -0
  452. package/src/targets/index.ts +13 -0
  453. package/src/targets/loader.ts +214 -0
  454. package/src/targets/resolver.ts +44 -0
  455. package/src/targets/target-registry.ts +111 -0
  456. package/src/targets/types.ts +89 -0
  457. package/src/tool.ts +302 -0
  458. package/src/types/findings.ts +239 -0
  459. package/src/types/severity.ts +39 -0
  460. package/tsconfig.json +8 -0
  461. package/vitest.config.ts +33 -0
@@ -0,0 +1,539 @@
1
+ /**
2
+ * fit command — run fitness checks
3
+ */
4
+ import { dirname } from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+ import { EXIT_CODES, saveSession, generateSessionId, } from '@opensip-tools/contracts';
7
+ import { logger } from '@opensip-tools/core';
8
+ import { isCheck } from '../framework/check-types.js';
9
+ import { defaultRegistry } from '../framework/registry.js';
10
+ import { buildScopeBasedFileMap } from '../framework/scope-resolver.js';
11
+ import { discoverCheckPackages, readCheckPackageMetadata, readCheckPackagePreferences, } from '../plugins/check-package-discovery.js';
12
+ import { loadAllPlugins } from '../plugins/loader.js';
13
+ import { defaultRecipeRegistry } from '../recipes/registry.js';
14
+ import { FitnessRecipeService } from '../recipes/service.js';
15
+ import { loadSignalersConfig } from '../signalers/index.js';
16
+ import { loadTargetsConfig } from '../targets/index.js';
17
+ // ---------------------------------------------------------------------------
18
+ // Lazy-load fitness checks
19
+ // ---------------------------------------------------------------------------
20
+ let checksLoaded = false;
21
+ let pluginLoadErrors = [];
22
+ /**
23
+ * Merged display map contributed by every loaded check package via the
24
+ * FitPluginExports.checkDisplay field. Each package owns the slugs it
25
+ * registers; on collision the last package loaded wins (no package is
26
+ * privileged). Slugs without an entry fall back to kebab-to-title-case.
27
+ */
28
+ const mergedCheckDisplay = new Map();
29
+ let getCheckDisplayName = defaultDisplayName;
30
+ let getCheckIcon = (_slug) => '\uD83D\uDD0D';
31
+ function defaultDisplayName(slug) {
32
+ return slug
33
+ .split('-')
34
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
35
+ .join(' ');
36
+ }
37
+ function rowStatus(cr) {
38
+ if (cr.timedOut)
39
+ return 'TIMEOUT';
40
+ return cr.passed ? 'PASS' : 'FAIL';
41
+ }
42
+ function rebuildDisplayLookups() {
43
+ getCheckDisplayName = (slug) => {
44
+ const entry = mergedCheckDisplay.get(slug);
45
+ return entry ? entry[1] : defaultDisplayName(slug);
46
+ };
47
+ getCheckIcon = (slug) => {
48
+ const entry = mergedCheckDisplay.get(slug);
49
+ return entry ? entry[0] : '\uD83D\uDD0D';
50
+ };
51
+ }
52
+ /**
53
+ * Plugin load errors recorded during the most recent ensureChecksLoaded() call.
54
+ * Read by runFit to fail the run if any plugin failed to import \u2014 otherwise a
55
+ * malicious or broken plugin could silently suppress its own checks while the
56
+ * CLI exits 0, masking a compliance failure or a supply-chain compromise.
57
+ */
58
+ export function getPluginLoadErrors() {
59
+ return pluginLoadErrors;
60
+ }
61
+ let preLoadHook;
62
+ /** Register a hook the CLI runs before fitness loads checks. */
63
+ export function setPreLoadHook(hook) {
64
+ preLoadHook = hook;
65
+ }
66
+ export async function ensureChecksLoaded(projectDir) {
67
+ if (checksLoaded)
68
+ return;
69
+ // 0. CLI-injected pre-load hook (auto-sync project plugins, etc).
70
+ // Skipped when no hook is registered (e.g. running fitness via the
71
+ // Tool API outside the CLI).
72
+ if (projectDir && preLoadHook) {
73
+ await preLoadHook(projectDir);
74
+ }
75
+ // 1. Load fit plugins — discovers .mjs files in
76
+ // <projectDir>/opensip-tools/fit/{checks,recipes}/ and any
77
+ // npm packages declared in plugins.fit in the project config.
78
+ //
79
+ // Bundled language adapters (TypeScript, Rust, Python, etc.)
80
+ // are registered separately by the CLI bootstrap; fitness
81
+ // doesn't take direct deps on @opensip-tools/lang-* packages,
82
+ // and there's no project-local 'lang' plugin discovery path
83
+ // (the lang adapter set is fixed and shipped with the CLI).
84
+ const pluginResult = await loadAllPlugins('fit', projectDir);
85
+ pluginLoadErrors = pluginResult.errors;
86
+ if (pluginResult.errors.length > 0) {
87
+ // Surface plugin load errors to the user. The logger is silenced in
88
+ // normal CLI runs, so a structured-log-only failure was invisible
89
+ // before. Print one line per failure to stderr — short, actionable,
90
+ // and doesn't clobber stdout (which carries results + --json).
91
+ for (const err of pluginResult.errors) {
92
+ process.stderr.write(`opensip-tools: plugin failed to load — ${err}\n`);
93
+ logger.warn({ evt: 'cli.plugin.warning', module: 'cli:fit', message: err });
94
+ }
95
+ }
96
+ // 3. Discover and load every @opensip-tools/checks-* package installed
97
+ // in node_modules. No package is privileged — what used to be a
98
+ // hardcoded `import('@opensip-tools/checks-builtin')` is now an
99
+ // ordinary npm dependency declared by @opensip-tools/cli and
100
+ // discovered via discoverCheckPackages() like every other pack.
101
+ // Project config can override (plugins.checkPackages: [...]) or
102
+ // opt out (plugins.autoDiscoverChecks: false).
103
+ //
104
+ // `projectDir` is the discovery anchor — discoverCheckPackages
105
+ // walks up to ancestor node_modules from there. When called
106
+ // without one (e.g. ad-hoc `opensip-tools fit` in an unconfigured
107
+ // dir) we fall back to the CLI's own install dir so the bundled
108
+ // deps still resolve.
109
+ const discoveryAnchor = projectDir ?? cliInstallDir();
110
+ const checksRegistered = await loadDiscoveredCheckPackages(discoveryAnchor);
111
+ // 4. No-checks-loaded guard. Silent zero-checks would let a misconfig
112
+ // or missing dep produce a green run that scanned nothing — the
113
+ // exact failure mode the CLI exists to prevent. Warn loudly.
114
+ if (checksRegistered === 0) {
115
+ const msg = 'opensip-tools: no check packages were loaded. ' +
116
+ 'Install at least one @opensip-tools/checks-* package, ' +
117
+ 'or declare plugins.checkPackages in opensip-tools.config.yml.\n';
118
+ process.stderr.write(msg);
119
+ logger.warn({
120
+ evt: 'cli.check_packages.empty',
121
+ module: 'cli:fit',
122
+ msg: 'no check packages loaded',
123
+ });
124
+ }
125
+ rebuildDisplayLookups();
126
+ checksLoaded = true;
127
+ }
128
+ /**
129
+ * Resolve the directory the CLI was installed into, used as a discovery
130
+ * fallback when no projectDir is supplied. Walks up from this module's
131
+ * URL to the @opensip-tools/cli package root so node_modules lookup
132
+ * sees the CLI's own dependency tree (which now contains checks-builtin
133
+ * and any other check packages declared in cli/package.json).
134
+ */
135
+ function cliInstallDir() {
136
+ // import.meta.url points at this file inside the CLI's dist/. The CLI
137
+ // package root is two levels up from dist/commands/. Resolve via the
138
+ // Node URL → path bridge to keep this OS-agnostic.
139
+ const thisFile = fileURLToPath(import.meta.url);
140
+ return dirname(dirname(dirname(thisFile)));
141
+ }
142
+ /**
143
+ * Load every check package returned by discoverCheckPackages(). Each
144
+ * package's main entry should follow the FitPluginExports contract:
145
+ *
146
+ * - `checks`: readonly Check[] (required)
147
+ * - `checkDisplay`: { [slug]: [icon, name] } (optional)
148
+ *
149
+ * Errors loading any one package don't fail the others — they surface
150
+ * to stderr the same way fit-domain plugin failures do.
151
+ *
152
+ * Returns the total number of checks registered across all loaded
153
+ * packages, so the caller can warn when zero packages contributed
154
+ * anything (a silent green run scanning nothing is the failure mode
155
+ * we want to make impossible).
156
+ */
157
+ async function loadDiscoveredCheckPackages(projectDir) {
158
+ const prefs = readCheckPackagePreferences(projectDir);
159
+ const discovered = discoverCheckPackages({
160
+ projectDir,
161
+ explicitPackages: prefs.checkPackages,
162
+ autoDiscover: prefs.autoDiscoverChecks,
163
+ });
164
+ let totalRegistered = 0;
165
+ for (const pkg of discovered) {
166
+ const meta = readCheckPackageMetadata(pkg.packageDir);
167
+ if (!meta) {
168
+ process.stderr.write(`opensip-tools: check package ${pkg.name} has no readable package.json — skipping\n`);
169
+ continue;
170
+ }
171
+ try {
172
+ const moduleUrl = pathToFileURL(meta.mainEntry).href;
173
+ const mod = (await import(moduleUrl));
174
+ const checks = mod.checks;
175
+ if (!Array.isArray(checks)) {
176
+ process.stderr.write(`opensip-tools: check package ${pkg.name} does not export a "checks" array — skipping\n`);
177
+ continue;
178
+ }
179
+ let registered = 0;
180
+ for (const check of checks) {
181
+ if (isCheck(check)) {
182
+ defaultRegistry.register(check, pkg.name);
183
+ registered++;
184
+ }
185
+ }
186
+ totalRegistered += registered;
187
+ mergeCheckDisplay(pkg.name, mod.checkDisplay);
188
+ logger.info({
189
+ evt: 'cli.check_package.loaded',
190
+ module: 'cli:fit',
191
+ name: pkg.name,
192
+ checksRegistered: registered,
193
+ });
194
+ }
195
+ catch (error) {
196
+ const msg = error instanceof Error ? error.message : String(error);
197
+ process.stderr.write(`opensip-tools: failed to load check package ${pkg.name}: ${msg}\n`);
198
+ logger.warn({
199
+ evt: 'cli.check_package.load_failed',
200
+ module: 'cli:fit',
201
+ name: pkg.name,
202
+ error: msg,
203
+ });
204
+ }
205
+ }
206
+ return totalRegistered;
207
+ }
208
+ /**
209
+ * Merge a check package's display map into the CLI-wide registry.
210
+ *
211
+ * Validates each entry is a `[icon, name]` tuple before accepting it —
212
+ * a malformed `checkDisplay` export from a third-party package shouldn't
213
+ * crash the run. Bad entries are dropped silently with a debug log so
214
+ * the user still gets a (worse-formatted) result rather than a hang.
215
+ *
216
+ * On collision, last package loaded wins. That's intentional: it lets
217
+ * a downstream package override a base package's display name without
218
+ * having to touch the original.
219
+ */
220
+ function mergeCheckDisplay(packageName, raw) {
221
+ if (!raw || typeof raw !== 'object')
222
+ return;
223
+ for (const [slug, entry] of Object.entries(raw)) {
224
+ if (Array.isArray(entry) &&
225
+ entry.length === 2 &&
226
+ typeof entry[0] === 'string' &&
227
+ typeof entry[1] === 'string') {
228
+ mergedCheckDisplay.set(slug, [entry[0], entry[1]]);
229
+ }
230
+ else {
231
+ logger.debug({
232
+ evt: 'cli.check_package.bad_display_entry',
233
+ module: 'cli:fit',
234
+ packageName,
235
+ slug,
236
+ });
237
+ }
238
+ }
239
+ }
240
+ /** Get display name for a check slug (available after ensureChecksLoaded) */
241
+ export function getDisplayName(slug) {
242
+ return getCheckDisplayName(slug);
243
+ }
244
+ /** Get the number of enabled checks (available after ensureChecksLoaded) */
245
+ export function getEnabledCheckCount() {
246
+ return defaultRegistry.listEnabled().length;
247
+ }
248
+ /** Get icon for a check slug (available after ensureChecksLoaded) */
249
+ export function getIcon(slug) {
250
+ return getCheckIcon(slug);
251
+ }
252
+ // ---------------------------------------------------------------------------
253
+ // Formatting helpers (used to build TableRow data)
254
+ // ---------------------------------------------------------------------------
255
+ export function formatDuration(ms) {
256
+ if (ms < 1000)
257
+ return `${ms}ms`;
258
+ return `${(ms / 1000).toFixed(1)}s`;
259
+ }
260
+ export function formatValidatedColumn(totalItems, itemType = 'items') {
261
+ // No meaningful count: external tool checks, errored checks, or checks with no file scanning
262
+ if (!totalItems)
263
+ return '—';
264
+ // Use singular for count of 1, plural otherwise (e.g., "1 file", "450 files", "13 packages")
265
+ const singular = itemType.endsWith('s') ? itemType.slice(0, -1) : itemType;
266
+ return totalItems === 1 ? `${totalItems} ${singular}` : `${totalItems} ${itemType}`;
267
+ }
268
+ // ---------------------------------------------------------------------------
269
+ // executeFit — main fit command (returns data, no console output)
270
+ // ---------------------------------------------------------------------------
271
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- top-level CLI command flow: validates args, resolves config, runs recipes, persists results — distinct phases that read better inline
272
+ export async function executeFit(args, onProgress) {
273
+ logger.info({ evt: 'cli.checks.loading', module: 'cli:fit' });
274
+ await ensureChecksLoaded(args.cwd);
275
+ logger.info({ evt: 'cli.checks.loaded', module: 'cli:fit', checkCount: defaultRegistry.listEnabled().length });
276
+ // Determine recipe: --check and --tags each create an ad-hoc recipe;
277
+ // otherwise use a named recipe. --check takes precedence over --recipe
278
+ // so "opensip-tools fit --check <slug>" runs just that slug.
279
+ const useAdHoc = args.check != null || args.tags != null;
280
+ const recipeName = useAdHoc ? undefined : (args.recipe ?? 'default');
281
+ if (recipeName && !defaultRecipeRegistry.has(recipeName)) {
282
+ return {
283
+ result: {
284
+ type: 'error',
285
+ message: `Unknown recipe '${recipeName}'.`,
286
+ suggestion: 'Run opensip-tools fit --recipes to see available recipes.',
287
+ exitCode: EXIT_CODES.CONFIGURATION_ERROR,
288
+ },
289
+ };
290
+ }
291
+ // -- Config resolution --
292
+ // Both loaders share the same project config file. A missing file is a
293
+ // HARD error: file-based checks would silently produce zero findings,
294
+ // making the scan look green when it actually never ran. The resolver
295
+ // throws with a message that enumerates every path it attempted.
296
+ let signalersConfig;
297
+ let targetsResult;
298
+ try {
299
+ signalersConfig = loadSignalersConfig(args.cwd, args.config);
300
+ targetsResult = loadTargetsConfig(args.cwd, args.config);
301
+ }
302
+ catch (error) {
303
+ const message = error instanceof Error ? error.message : String(error);
304
+ logger.warn({ evt: 'cli.config.load_failed', module: 'cli:fit', message });
305
+ return {
306
+ result: {
307
+ type: 'error',
308
+ message,
309
+ suggestion: "Run 'opensip-tools init' to scaffold a config, or pass --config <path> to point at an existing one.",
310
+ exitCode: EXIT_CODES.CONFIGURATION_ERROR,
311
+ },
312
+ };
313
+ }
314
+ const disabledChecks = signalersConfig.fitness.disabledChecks;
315
+ const { registry: targetRegistry, config: targetsConfig } = targetsResult;
316
+ const configFound = true;
317
+ // Phase 9: validate that every language declared in the targets config
318
+ // has a registered LanguageAdapter. Warn loudly when a target asks for
319
+ // a language we don't know how to handle — silent acceptance would let
320
+ // users ship configs that scan files but produce wrong results.
321
+ {
322
+ const { defaultLanguageRegistry: langRegistry } = await import('@opensip-tools/core');
323
+ const knownLanguages = new Set(langRegistry.list().flatMap((a) => [a.id, ...(a.aliases ?? [])]));
324
+ const unknownLanguages = new Set();
325
+ for (const target of targetRegistry.getAll()) {
326
+ const langs = target.config.languages ?? [];
327
+ for (const lang of langs) {
328
+ if (!knownLanguages.has(lang))
329
+ unknownLanguages.add(lang);
330
+ }
331
+ }
332
+ if (unknownLanguages.size > 0) {
333
+ const list = [...unknownLanguages].sort().join(', ');
334
+ const known = [...knownLanguages].filter((l) => !l.startsWith('rs') && !l.startsWith('py')).slice(0, 8).join(', ');
335
+ process.stderr.write(`opensip-tools: target config declares unknown language(s): ${list}. ` +
336
+ `Known languages: ${[...knownLanguages].sort().join(', ')}. ` +
337
+ `Files in unknown languages will scan with no string/comment filtering.\n`);
338
+ logger.warn({
339
+ evt: 'cli.config.unknown_languages',
340
+ module: 'cli:fit',
341
+ unknown: [...unknownLanguages],
342
+ known: [...knownLanguages],
343
+ });
344
+ // Reference `known` to avoid unused-var lint without changing the user-facing message.
345
+ void known;
346
+ }
347
+ }
348
+ const allChecks = defaultRegistry.listSlugs().map((key) => {
349
+ const check = defaultRegistry.getBySlug(key);
350
+ return { slug: check?.config.slug ?? key, scope: check?.config.checkScope };
351
+ });
352
+ const scopeMap = buildScopeBasedFileMap(allChecks, targetRegistry, targetsConfig, args.cwd);
353
+ const checkTargetFiles = scopeMap.size > 0 ? scopeMap : undefined;
354
+ const label = args.tags ? `tags: ${args.tags}` : `recipe ${recipeName ?? 'default'}`;
355
+ // -- Progress callbacks --
356
+ //
357
+ // Monotonic completed-count:
358
+ //
359
+ // The service fires onCheckStart(slug, displayIndex, total) when a check
360
+ // STARTS and onCheckComplete(slug, summary, displayIndex, total) when it
361
+ // FINISHES. Under parallel execution `displayIndex` is the check's
362
+ // position in the queue (1..total), not "how many have completed" — so
363
+ // the last started check's index hops above the current completion
364
+ // tally and then "resets" down when an earlier check finishes. The UI
365
+ // showed `147/148 → 121/148 → 78/148` because each event fired with a
366
+ // different in-flight check's queue position.
367
+ //
368
+ // The progress bar wants a monotonic counter. Track completed locally,
369
+ // increment only on onCheckComplete, ignore onCheckStart's index. The
370
+ // counter is strictly non-decreasing and always reflects "N of M
371
+ // checks done."
372
+ let completedCount = 0;
373
+ const callbacks = {
374
+ onCheckStart(checkSlug, index, total) {
375
+ logger.debug({ evt: 'cli.check.start', module: 'cli:fit', checkSlug, index, total });
376
+ // Emit current completed count so the UI shows activity without
377
+ // moving the bar backward on start events.
378
+ onProgress?.(completedCount, total);
379
+ },
380
+ onCheckComplete(checkSlug, summary, index, total) {
381
+ logger.debug({ evt: 'cli.check.complete', module: 'cli:fit', checkSlug, passed: summary.passed, errors: summary.errors, warnings: summary.warnings, durationMs: summary.durationMs });
382
+ completedCount++;
383
+ onProgress?.(completedCount, total);
384
+ },
385
+ };
386
+ // -- Execute via FitnessRecipeService --
387
+ // Forward globalExcludes from the project config so the matchFiles()
388
+ // fileCache fallback honors them. Without this, scope-empty checks
389
+ // (e.g. file-length-limit) scan every prewarmed file regardless of
390
+ // whether the project config told us to exclude it.
391
+ const service = new FitnessRecipeService({
392
+ cwd: args.cwd,
393
+ checkTargetFiles,
394
+ callbacks,
395
+ disabledChecks,
396
+ includeViolations: true,
397
+ globalExcludes: targetsConfig.globalExcludes,
398
+ });
399
+ let fitnessResult;
400
+ try {
401
+ if (args.check) {
402
+ fitnessResult = await service.start(FitnessRecipeService.createAdHocRecipe({ check: args.check }));
403
+ }
404
+ else if (args.tags) {
405
+ const tagFilters = args.tags.split(',').map(t => t.trim()).filter(Boolean);
406
+ fitnessResult = await service.start(FitnessRecipeService.createAdHocRecipe({ tagFilters }));
407
+ }
408
+ else {
409
+ fitnessResult = await service.start(recipeName);
410
+ }
411
+ }
412
+ catch (error) {
413
+ const msg = error instanceof Error ? error.message : String(error);
414
+ return {
415
+ result: {
416
+ type: 'error',
417
+ message: `Fitness run failed: ${msg}`,
418
+ exitCode: EXIT_CODES.RUNTIME_ERROR,
419
+ },
420
+ };
421
+ }
422
+ // -- Format output from recipe result --
423
+ const { summary, checkResults, durationMs } = fitnessResult;
424
+ const score = summary.totalChecks > 0
425
+ ? Math.round((summary.passedChecks / summary.totalChecks) * 100)
426
+ : 0;
427
+ // Build structured output
428
+ const output = {
429
+ version: '1.0',
430
+ tool: 'fit',
431
+ timestamp: new Date().toISOString(),
432
+ recipe: recipeName,
433
+ score,
434
+ passed: summary.failedChecks === 0 && pluginLoadErrors.length === 0,
435
+ summary: {
436
+ total: summary.totalChecks,
437
+ passed: summary.passedChecks,
438
+ failed: summary.failedChecks,
439
+ errors: summary.totalErrors,
440
+ warnings: summary.totalWarnings,
441
+ },
442
+ checks: checkResults.map(cr => ({
443
+ checkSlug: cr.checkSlug,
444
+ passed: cr.passed,
445
+ violationCount: cr.violationCount,
446
+ findings: (cr.violations ?? []).map(v => ({
447
+ ruleId: cr.checkSlug,
448
+ message: v.message,
449
+ severity: v.severity,
450
+ filePath: v.file,
451
+ line: v.line,
452
+ column: v.column,
453
+ suggestion: v.suggestion,
454
+ })),
455
+ durationMs: cr.durationMs,
456
+ })),
457
+ durationMs,
458
+ };
459
+ // Persist session for history and dashboard
460
+ try {
461
+ saveSession({
462
+ id: generateSessionId(),
463
+ tool: 'fit',
464
+ timestamp: output.timestamp,
465
+ cwd: args.cwd,
466
+ recipe: recipeName,
467
+ score,
468
+ passed: output.passed,
469
+ summary: output.summary,
470
+ checks: output.checks,
471
+ durationMs,
472
+ });
473
+ }
474
+ catch {
475
+ // Best effort — don't fail the run if persistence fails
476
+ }
477
+ // Build table rows
478
+ const tableRows = checkResults.map(cr => ({
479
+ check: getCheckDisplayName(cr.checkSlug),
480
+ status: rowStatus(cr),
481
+ errors: cr.errorCount,
482
+ warnings: cr.warningCount,
483
+ validated: formatValidatedColumn(cr.totalItems, cr.itemType),
484
+ ignored: cr.ignoredCount,
485
+ duration: formatDuration(cr.durationMs),
486
+ durationMs: cr.durationMs,
487
+ }));
488
+ // Build summary
489
+ const summaryOpts = {
490
+ passed: summary.passedChecks,
491
+ failed: summary.failedChecks,
492
+ totalErrors: summary.totalErrors,
493
+ totalWarnings: summary.totalWarnings,
494
+ totalIgnored: summary.totalIgnored,
495
+ durationMs,
496
+ };
497
+ // Determine exit code from config thresholds
498
+ // failOnErrors: fail if total errors >= this value (default: 1, 0 = never fail on errors)
499
+ // failOnWarnings: fail if total warnings >= this value (default: 0 = never fail on warnings)
500
+ const failOnErrors = signalersConfig?.fitness.failOnErrors ?? 1;
501
+ const failOnWarnings = signalersConfig?.fitness.failOnWarnings ?? 0;
502
+ const shouldFail = pluginLoadErrors.length > 0 ||
503
+ (failOnErrors > 0 && summary.totalErrors >= failOnErrors) ||
504
+ (failOnWarnings > 0 && summary.totalWarnings >= failOnWarnings);
505
+ // Build findings if requested
506
+ let findings;
507
+ if ((args.findings || args.verbose) && (summary.totalErrors + summary.totalWarnings) > 0) {
508
+ findings = {
509
+ checks: checkResults
510
+ .filter(cr => cr.errorCount > 0 || cr.warningCount > 0 || cr.error)
511
+ .map(cr => ({
512
+ checkSlug: cr.checkSlug,
513
+ errorCount: cr.errorCount,
514
+ warningCount: cr.warningCount,
515
+ error: cr.error,
516
+ violations: cr.violations?.map(v => ({
517
+ severity: v.severity,
518
+ message: v.message,
519
+ file: v.file,
520
+ line: v.line,
521
+ suggestion: v.suggestion,
522
+ })),
523
+ })),
524
+ };
525
+ }
526
+ const result = {
527
+ type: 'fit-done',
528
+ rows: tableRows,
529
+ summary: summaryOpts,
530
+ label,
531
+ cwd: args.cwd,
532
+ findings,
533
+ shouldFail,
534
+ configFound,
535
+ };
536
+ logger.info({ evt: 'cli.fit.complete', module: 'cli:fit', score, passed: fitnessResult.success, totalChecks: summary.totalChecks, durationMs });
537
+ return { result, output };
538
+ }
539
+ //# sourceMappingURL=fit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fit.js","sourceRoot":"","sources":["../../src/cli/fit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * list-checks command — list all available fitness checks
3
+ */
4
+ import type { ListChecksResult } from '@opensip-tools/contracts';
5
+ export declare function listChecks(projectDir?: string): Promise<ListChecksResult>;
6
+ //# sourceMappingURL=list-checks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-checks.d.ts","sourceRoot":"","sources":["../../src/cli/list-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe/E"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * list-checks command — list all available fitness checks
3
+ */
4
+ import { defaultRegistry } from '../framework/registry.js';
5
+ import { ensureChecksLoaded } from './fit.js';
6
+ // ---------------------------------------------------------------------------
7
+ // listChecks
8
+ // ---------------------------------------------------------------------------
9
+ export async function listChecks(projectDir) {
10
+ await ensureChecksLoaded(projectDir);
11
+ const checks = defaultRegistry.listEnabled();
12
+ const entries = checks.map((check) => ({
13
+ slug: check.config.slug,
14
+ description: check.config.description,
15
+ tags: [...(check.config.tags ?? ['untagged'])],
16
+ }));
17
+ return {
18
+ type: 'list-checks',
19
+ checks: entries,
20
+ totalCount: checks.length,
21
+ };
22
+ }
23
+ //# sourceMappingURL=list-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-checks.js","sourceRoot":"","sources":["../../src/cli/list-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QACvB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QACrC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;KAC/C,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * list-recipes command — list all available fitness recipes
3
+ */
4
+ import type { ListRecipesResult } from '@opensip-tools/contracts';
5
+ export declare function listRecipes(projectDir?: string): Promise<ListRecipesResult>;
6
+ //# sourceMappingURL=list-recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-recipes.d.ts","sourceRoot":"","sources":["../../src/cli/list-recipes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqBjF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * list-recipes command — list all available fitness recipes
3
+ */
4
+ import { defaultRecipeRegistry } from '../recipes/registry.js';
5
+ import { ensureChecksLoaded } from './fit.js';
6
+ // ---------------------------------------------------------------------------
7
+ // listRecipes
8
+ // ---------------------------------------------------------------------------
9
+ export async function listRecipes(projectDir) {
10
+ // Load plugins so user-defined recipes (e.g. ~/.opensip-tools/fit/*.mjs) appear.
11
+ await ensureChecksLoaded(projectDir);
12
+ const recipes = defaultRecipeRegistry.getAllRecipes().map((recipe) => {
13
+ const selector = recipe.checks;
14
+ let checkCount;
15
+ if (selector.type === 'all') {
16
+ checkCount = 'all checks';
17
+ }
18
+ else if (selector.type === 'explicit') {
19
+ checkCount = `${selector.checkIds.length} checks`;
20
+ }
21
+ else {
22
+ checkCount = 'pattern-based';
23
+ }
24
+ return { name: recipe.name, description: recipe.description, checkCount };
25
+ });
26
+ return {
27
+ type: 'list-recipes',
28
+ recipes,
29
+ };
30
+ }
31
+ //# sourceMappingURL=list-recipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-recipes.js","sourceRoot":"","sources":["../../src/cli/list-recipes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAmB;IACnD,iFAAiF;IACjF,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,IAAI,UAAkB,CAAC;QACvB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC5B,UAAU,GAAG,YAAY,CAAC;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,UAAU,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,eAAe,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast-utilities.test.d.ts.map