@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,73 @@
1
+ /**
2
+ * @fileoverview Auto-discovery of @opensip-tools/checks-* packages
3
+ * installed in node_modules.
4
+ *
5
+ * Resolution rules (apply in order):
6
+ *
7
+ * 1. If `plugins.checkPackages` is declared in the project config,
8
+ * that explicit list wins. Auto-discovery is skipped entirely.
9
+ * Lets users pin their check set deterministically.
10
+ *
11
+ * 2. Else if `plugins.autoDiscoverChecks: false` is declared,
12
+ * no additional check packages are loaded. Lets users opt out
13
+ * of dependency-based discovery (e.g. when running in an
14
+ * environment with unrelated @opensip-tools packages installed).
15
+ *
16
+ * 3. Otherwise (default), scan node_modules for any package whose
17
+ * name matches `@opensip-tools/checks-*` and return the list.
18
+ *
19
+ * No package is privileged — what used to be `checks-builtin` is now
20
+ * just one of many `@opensip-tools/checks-*` packages declared as
21
+ * ordinary CLI dependencies and discovered uniformly. The CLI no
22
+ * longer hardcodes any check package import.
23
+ *
24
+ * The walker handles pnpm's nested node_modules layout: it looks at
25
+ * the project's direct node_modules, then walks up to ancestor
26
+ * node_modules (matching Node's resolution algorithm). We don't need
27
+ * to recurse into transitive deps because check packages are expected
28
+ * to be direct dependencies.
29
+ */
30
+ export interface CheckPackageDiscoveryOptions {
31
+ /** Absolute path to the project root (where opensip-tools.config.yml lives). */
32
+ readonly projectDir: string;
33
+ /** Explicit list from `plugins.checkPackages` in the config. */
34
+ readonly explicitPackages?: readonly string[];
35
+ /** When false, auto-discovery is disabled. Default: true. */
36
+ readonly autoDiscover?: boolean;
37
+ }
38
+ export interface DiscoveredCheckPackage {
39
+ /** npm package name, e.g. '@opensip-tools/checks-python'. */
40
+ readonly name: string;
41
+ /** Absolute path to the package's directory inside node_modules. */
42
+ readonly packageDir: string;
43
+ }
44
+ /**
45
+ * Resolve the list of check packages to load, applying the ordered
46
+ * resolution rules in the file header. Returns every discovered
47
+ * @opensip-tools/checks-* package; the CLI loads them all uniformly,
48
+ * with no package privileged over another.
49
+ */
50
+ export declare function discoverCheckPackages(options: CheckPackageDiscoveryOptions): DiscoveredCheckPackage[];
51
+ /**
52
+ * Read `name` and `main`/`exports` from a package.json. Used by the CLI
53
+ * to resolve the entry point of a discovered check package.
54
+ */
55
+ export interface CheckPackageMetadata {
56
+ readonly name: string;
57
+ readonly mainEntry: string;
58
+ }
59
+ /**
60
+ * Read the `plugins.checkPackages` and `plugins.autoDiscoverChecks`
61
+ * fields from the project's opensip-tools.config.yml without doing a
62
+ * full schema parse. Returns the raw values so callers can apply the
63
+ * resolution rules in `discoverCheckPackages()`.
64
+ *
65
+ * Mirrors the inline-yaml-read pattern used by readProjectPluginsList()
66
+ * — avoids a circular dep between plugins/ and targets/.
67
+ */
68
+ export declare function readCheckPackagePreferences(projectDir: string): {
69
+ readonly checkPackages?: readonly string[];
70
+ readonly autoDiscoverChecks?: boolean;
71
+ };
72
+ export declare function readCheckPackageMetadata(packageDir: string): CheckPackageMetadata | undefined;
73
+ //# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAoBH,MAAM,WAAW,4BAA4B;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,sBAAsB,EAAE,CAgC1B;AA2DD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC,CAsBA;AAGD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAgC7F"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * @fileoverview Auto-discovery of @opensip-tools/checks-* packages
3
+ * installed in node_modules.
4
+ *
5
+ * Resolution rules (apply in order):
6
+ *
7
+ * 1. If `plugins.checkPackages` is declared in the project config,
8
+ * that explicit list wins. Auto-discovery is skipped entirely.
9
+ * Lets users pin their check set deterministically.
10
+ *
11
+ * 2. Else if `plugins.autoDiscoverChecks: false` is declared,
12
+ * no additional check packages are loaded. Lets users opt out
13
+ * of dependency-based discovery (e.g. when running in an
14
+ * environment with unrelated @opensip-tools packages installed).
15
+ *
16
+ * 3. Otherwise (default), scan node_modules for any package whose
17
+ * name matches `@opensip-tools/checks-*` and return the list.
18
+ *
19
+ * No package is privileged — what used to be `checks-builtin` is now
20
+ * just one of many `@opensip-tools/checks-*` packages declared as
21
+ * ordinary CLI dependencies and discovered uniformly. The CLI no
22
+ * longer hardcodes any check package import.
23
+ *
24
+ * The walker handles pnpm's nested node_modules layout: it looks at
25
+ * the project's direct node_modules, then walks up to ancestor
26
+ * node_modules (matching Node's resolution algorithm). We don't need
27
+ * to recurse into transitive deps because check packages are expected
28
+ * to be direct dependencies.
29
+ */
30
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
31
+ import { createRequire } from 'node:module';
32
+ import { dirname, join } from 'node:path';
33
+ import { logger } from '@opensip-tools/core';
34
+ const CONFIG_FILENAME = 'opensip-tools.config.yml';
35
+ // Bridge ESM ↔ CJS: createRequire bound to this module's URL gives us a
36
+ // `require` that resolves js-yaml from this package's own deps. The bare
37
+ // `require('js-yaml')` form fails in ESM because no global require is
38
+ // present; using createRequire(import.meta.url) is the supported escape
39
+ // hatch.
40
+ const requireFromHere = createRequire(import.meta.url);
41
+ const SCOPE = '@opensip-tools';
42
+ const CHECKS_PREFIX = 'checks-';
43
+ /**
44
+ * Resolve the list of check packages to load, applying the ordered
45
+ * resolution rules in the file header. Returns every discovered
46
+ * @opensip-tools/checks-* package; the CLI loads them all uniformly,
47
+ * with no package privileged over another.
48
+ */
49
+ export function discoverCheckPackages(options) {
50
+ const { projectDir, explicitPackages, autoDiscover = true } = options;
51
+ // Rule 1: explicit list wins
52
+ if (explicitPackages !== undefined) {
53
+ if (explicitPackages.length === 0) {
54
+ return [];
55
+ }
56
+ const out = [];
57
+ for (const name of explicitPackages) {
58
+ const dir = resolvePackageDir(projectDir, name);
59
+ if (dir) {
60
+ out.push({ name, packageDir: dir });
61
+ }
62
+ else {
63
+ logger.warn({
64
+ evt: 'plugin.check_package.not_resolved',
65
+ module: 'core:plugins',
66
+ name,
67
+ msg: `Configured check package "${name}" is not installed in node_modules — skipping`,
68
+ });
69
+ }
70
+ }
71
+ return out;
72
+ }
73
+ // Rule 2: opt-out
74
+ if (!autoDiscover) {
75
+ return [];
76
+ }
77
+ // Rule 3: auto-discover
78
+ return autoDiscoverChecks(projectDir);
79
+ }
80
+ /**
81
+ * Walk up the directory tree from `projectDir` looking for the first
82
+ * `node_modules/@opensip-tools/` directory and return all `checks-*`
83
+ * package directories found there. Mirrors Node's module resolution
84
+ * (any ancestor node_modules counts), which handles pnpm hoisting and
85
+ * monorepo layouts where the scope may live in the workspace root.
86
+ */
87
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- ancestor-walk discovery: walks node_modules trees up the directory tree until the filesystem root
88
+ function autoDiscoverChecks(projectDir) {
89
+ const seen = new Set();
90
+ const out = [];
91
+ let dir = projectDir;
92
+ let prev = '';
93
+ while (dir !== prev) {
94
+ const scopeDir = join(dir, 'node_modules', SCOPE);
95
+ if (existsSync(scopeDir)) {
96
+ for (const entry of safeReaddir(scopeDir)) {
97
+ if (!entry.startsWith(CHECKS_PREFIX))
98
+ continue;
99
+ const name = `${SCOPE}/${entry}`;
100
+ if (seen.has(name))
101
+ continue;
102
+ const packageDir = join(scopeDir, entry);
103
+ if (!hasPackageJson(packageDir))
104
+ continue;
105
+ seen.add(name);
106
+ out.push({ name, packageDir });
107
+ }
108
+ }
109
+ prev = dir;
110
+ dir = dirname(dir);
111
+ }
112
+ return out;
113
+ }
114
+ function resolvePackageDir(projectDir, name) {
115
+ let dir = projectDir;
116
+ let prev = '';
117
+ while (dir !== prev) {
118
+ const candidate = join(dir, 'node_modules', name);
119
+ if (hasPackageJson(candidate))
120
+ return candidate;
121
+ prev = dir;
122
+ dir = dirname(dir);
123
+ }
124
+ return undefined;
125
+ }
126
+ function hasPackageJson(packageDir) {
127
+ if (!existsSync(packageDir))
128
+ return false;
129
+ return existsSync(join(packageDir, 'package.json'));
130
+ }
131
+ function safeReaddir(dir) {
132
+ try {
133
+ return readdirSync(dir);
134
+ }
135
+ catch {
136
+ return [];
137
+ }
138
+ }
139
+ /**
140
+ * Read the `plugins.checkPackages` and `plugins.autoDiscoverChecks`
141
+ * fields from the project's opensip-tools.config.yml without doing a
142
+ * full schema parse. Returns the raw values so callers can apply the
143
+ * resolution rules in `discoverCheckPackages()`.
144
+ *
145
+ * Mirrors the inline-yaml-read pattern used by readProjectPluginsList()
146
+ * — avoids a circular dep between plugins/ and targets/.
147
+ */
148
+ export function readCheckPackagePreferences(projectDir) {
149
+ const configPath = join(projectDir, CONFIG_FILENAME);
150
+ if (!existsSync(configPath))
151
+ return {};
152
+ try {
153
+ const raw = readFileSync(configPath, 'utf8');
154
+ const yaml = requireFromHere('js-yaml');
155
+ const doc = yaml.load(raw);
156
+ if (!doc || typeof doc !== 'object')
157
+ return {};
158
+ const plugins = doc.plugins;
159
+ if (!plugins || typeof plugins !== 'object')
160
+ return {};
161
+ const p = plugins;
162
+ const result = {};
163
+ if (Array.isArray(p.checkPackages)) {
164
+ result.checkPackages = p.checkPackages.filter((v) => typeof v === 'string');
165
+ }
166
+ if (typeof p.autoDiscoverChecks === 'boolean') {
167
+ result.autoDiscoverChecks = p.autoDiscoverChecks;
168
+ }
169
+ return result;
170
+ }
171
+ catch {
172
+ return {};
173
+ }
174
+ }
175
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- exports-map resolution: each branch corresponds to a documented npm exports shape (string, object with import/default/require)
176
+ export function readCheckPackageMetadata(packageDir) {
177
+ const pkgPath = join(packageDir, 'package.json');
178
+ if (!existsSync(pkgPath))
179
+ return undefined;
180
+ try {
181
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
182
+ if (!pkg.name)
183
+ return undefined;
184
+ let mainEntry;
185
+ const exports = pkg.exports;
186
+ if (typeof exports === 'string') {
187
+ mainEntry = exports;
188
+ }
189
+ else if (exports && typeof exports === 'object' && '.' in exports) {
190
+ const dot = exports['.'];
191
+ if (typeof dot === 'string') {
192
+ mainEntry = dot;
193
+ }
194
+ else if (dot && typeof dot === 'object') {
195
+ const obj = dot;
196
+ if (typeof obj.import === 'string')
197
+ mainEntry = obj.import;
198
+ else if (typeof obj.default === 'string')
199
+ mainEntry = obj.default;
200
+ }
201
+ }
202
+ if (!mainEntry && typeof pkg.main === 'string') {
203
+ mainEntry = pkg.main;
204
+ }
205
+ mainEntry ??= './index.js';
206
+ return { name: pkg.name, mainEntry: join(packageDir, mainEntry) };
207
+ }
208
+ catch {
209
+ return undefined;
210
+ }
211
+ }
212
+ //# 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":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Plugin loader — dynamic import and registration
3
+ *
4
+ * Takes discovered plugins, imports them, validates their exports,
5
+ * and registers checks/recipes with namespaces.
6
+ */
7
+ import type { DiscoveredPlugin, LoadedPlugin, PluginDomain, PluginLoadResult } from '@opensip-tools/core';
8
+ /**
9
+ * Load a single discovered plugin.
10
+ *
11
+ * For `domain === 'lang'`, the module is expected to export an `adapters`
12
+ * array of LanguageAdapter; each is registered with defaultLanguageRegistry.
13
+ * For other domains, registers checks and recipes with defaultRegistry and
14
+ * defaultRecipeRegistry respectively.
15
+ */
16
+ export declare function loadPlugin(plugin: DiscoveredPlugin, domain?: PluginDomain): Promise<LoadedPlugin>;
17
+ /**
18
+ * Discover and load all plugins for a domain. Loads sequentially to
19
+ * ensure deterministic registration order.
20
+ *
21
+ * Discovers loose `.mjs` files under
22
+ * `<projectDir>/opensip-tools/<tool>/{checks,recipes,scenarios}/` plus
23
+ * any npm-installed packages in
24
+ * `<projectDir>/opensip-tools/.runtime/plugins/<domain>/node_modules/`
25
+ * that are listed in `plugins.<domain>` in the project config.
26
+ *
27
+ * Without a `projectDir`, no plugins are loaded — there's no
28
+ * user-global fallback.
29
+ */
30
+ export declare function loadAllPlugins(domain: PluginDomain, projectDir?: string): Promise<PluginLoadResult>;
31
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,KAAK,EACV,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAK5B;;;;;;;GAOG;AAEH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,YAAoB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAmOvB;AAqBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
@@ -0,0 +1,290 @@
1
+ /**
2
+ * @fileoverview Plugin loader — dynamic import and registration
3
+ *
4
+ * Takes discovered plugins, imports them, validates their exports,
5
+ * and registers checks/recipes with namespaces.
6
+ */
7
+ import { pathToFileURL } from 'node:url';
8
+ import { logger, defaultLanguageRegistry, discoverPlugins } from '@opensip-tools/core';
9
+ import { isCheck } from '../framework/check-types.js';
10
+ import { defaultRegistry } from '../framework/registry.js';
11
+ import { defaultRecipeRegistry } from '../recipes/registry.js';
12
+ /** Logger module tag used by every event emitted from this loader. */
13
+ const MODULE_TAG = 'core:plugins';
14
+ /**
15
+ * Load a single discovered plugin.
16
+ *
17
+ * For `domain === 'lang'`, the module is expected to export an `adapters`
18
+ * array of LanguageAdapter; each is registered with defaultLanguageRegistry.
19
+ * For other domains, registers checks and recipes with defaultRegistry and
20
+ * defaultRecipeRegistry respectively.
21
+ */
22
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- plugin loader dispatcher: handles three domains and lifecycle (validate, register, error-wrap) inline; splitting fragments error context
23
+ export async function loadPlugin(plugin, domain = 'fit') {
24
+ try {
25
+ const moduleUrl = pathToFileURL(plugin.entryPoint).href;
26
+ const mod = await import(moduleUrl);
27
+ let checksRegistered = 0;
28
+ let recipesRegistered = 0;
29
+ let adaptersRegistered = 0;
30
+ // Lang domain: register language adapters from `adapters` array,
31
+ // named exports, and default export. Adapters are deduplicated by id.
32
+ if (domain === 'lang') {
33
+ const registeredAdapterIds = new Set();
34
+ const tryRegisterAdapter = (value, sourceLabel) => {
35
+ if (!looksLikeLanguageAdapter(value))
36
+ return;
37
+ const id = value.id;
38
+ if (registeredAdapterIds.has(id))
39
+ return;
40
+ defaultLanguageRegistry.register(value);
41
+ registeredAdapterIds.add(id);
42
+ adaptersRegistered++;
43
+ logger.debug({
44
+ evt: 'plugin.loader.adapter.registered',
45
+ module: MODULE_TAG,
46
+ namespace: plugin.namespace,
47
+ source: sourceLabel,
48
+ id,
49
+ });
50
+ };
51
+ if (mod.adapters !== undefined) {
52
+ if (Array.isArray(mod.adapters)) {
53
+ for (const [index, adapter] of mod.adapters.entries()) {
54
+ if (looksLikeLanguageAdapter(adapter)) {
55
+ tryRegisterAdapter(adapter, `adapters[${index}]`);
56
+ }
57
+ else {
58
+ logger.warn({
59
+ evt: 'plugin.loader.invalid_adapter_item',
60
+ module: MODULE_TAG,
61
+ namespace: plugin.namespace,
62
+ source: plugin.source,
63
+ index,
64
+ msg: `Plugin "${plugin.namespace}" adapters[${index}] is not a valid LanguageAdapter — skipping.`,
65
+ });
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ logger.warn({
71
+ evt: 'plugin.loader.invalid_adapters_export',
72
+ module: MODULE_TAG,
73
+ namespace: plugin.namespace,
74
+ source: plugin.source,
75
+ msg: `Plugin "${plugin.namespace}" exports "adapters" but it is not an array — skipping adapter registration.`,
76
+ });
77
+ }
78
+ }
79
+ // Named exports that look like LanguageAdapter
80
+ for (const [exportName, value] of Object.entries(mod)) {
81
+ if (exportName === 'default' ||
82
+ exportName === 'adapters' ||
83
+ exportName === 'checks' ||
84
+ exportName === 'recipes' ||
85
+ exportName === 'metadata')
86
+ continue;
87
+ tryRegisterAdapter(value, `named:${exportName}`);
88
+ }
89
+ // Default export: a single LanguageAdapter
90
+ const defaultExport = mod.default;
91
+ tryRegisterAdapter(defaultExport, 'default');
92
+ }
93
+ // Register checks with namespace (skipped for lang domain).
94
+ //
95
+ // Two authorship styles are supported:
96
+ // 1. `export const checks = [...]` — array of Check instances
97
+ // 2. `export const myCheck = defineCheck({...})` — Check as a named export
98
+ //
99
+ // Style 2 enables single-file plugins that drop into ~/.opensip-tools/fit/
100
+ // to author one check per file without a redundant array wrapper.
101
+ // Both styles can coexist in the same module; checks are deduplicated by
102
+ // their stable id so a check appearing in both an array and a named
103
+ // export is registered exactly once.
104
+ if (domain !== 'lang') {
105
+ const registeredIds = new Set();
106
+ // Style 1: explicit `checks` array
107
+ if (mod.checks !== undefined) {
108
+ if (Array.isArray(mod.checks)) {
109
+ for (const [index, check] of mod.checks.entries()) {
110
+ if (isCheck(check)) {
111
+ if (!registeredIds.has(check.config.id)) {
112
+ defaultRegistry.register(check, plugin.namespace);
113
+ registeredIds.add(check.config.id);
114
+ checksRegistered++;
115
+ }
116
+ }
117
+ else {
118
+ logger.warn({
119
+ evt: 'plugin.loader.invalid_check_item',
120
+ module: MODULE_TAG,
121
+ namespace: plugin.namespace,
122
+ source: plugin.source,
123
+ index,
124
+ msg: `Plugin "${plugin.namespace}" checks[${index}] is not a valid Check object — skipping.`,
125
+ });
126
+ }
127
+ }
128
+ }
129
+ else {
130
+ logger.warn({
131
+ evt: 'plugin.loader.invalid_checks_export',
132
+ module: MODULE_TAG,
133
+ namespace: plugin.namespace,
134
+ source: plugin.source,
135
+ msg: `Plugin "${plugin.namespace}" exports "checks" but it is not an array — skipping checks registration.`,
136
+ });
137
+ }
138
+ }
139
+ // Style 2: any named export that is a Check instance
140
+ for (const [exportName, value] of Object.entries(mod)) {
141
+ if (exportName === 'default' || exportName === 'checks' || exportName === 'recipes' || exportName === 'metadata')
142
+ continue;
143
+ if (isCheck(value) && !registeredIds.has(value.config.id)) {
144
+ defaultRegistry.register(value, plugin.namespace);
145
+ registeredIds.add(value.config.id);
146
+ checksRegistered++;
147
+ }
148
+ }
149
+ // Default export: a single Check instance
150
+ const defaultExport = mod.default;
151
+ if (isCheck(defaultExport) && !registeredIds.has(defaultExport.config.id)) {
152
+ defaultRegistry.register(defaultExport, plugin.namespace);
153
+ registeredIds.add(defaultExport.config.id);
154
+ checksRegistered++;
155
+ }
156
+ }
157
+ // Register recipes (skipped for lang domain)
158
+ if (domain !== 'lang' && mod.recipes !== undefined) {
159
+ const recipes = mod.recipes;
160
+ for (const [index, recipe] of recipes.entries()) {
161
+ if (recipe && typeof recipe === 'object' && 'id' in recipe && 'name' in recipe) {
162
+ try {
163
+ defaultRecipeRegistry.register(recipe, { allowOverwrite: false });
164
+ recipesRegistered++;
165
+ }
166
+ catch {
167
+ // Duplicate recipe — skip silently
168
+ }
169
+ }
170
+ else {
171
+ logger.warn({
172
+ evt: 'plugin.loader.invalid_recipe_item',
173
+ module: MODULE_TAG,
174
+ namespace: plugin.namespace,
175
+ source: plugin.source,
176
+ index,
177
+ msg: `Plugin "${plugin.namespace}" recipes[${index}] is not a valid Recipe object (missing id or name) — skipping.`,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ // Warn only when nothing was registered. With named-export discovery,
183
+ // counting actual registrations is more accurate than checking which
184
+ // declared exports were present.
185
+ const nothingRegistered = domain === 'lang'
186
+ ? adaptersRegistered === 0
187
+ : checksRegistered === 0 && recipesRegistered === 0;
188
+ if (nothingRegistered) {
189
+ logger.warn({
190
+ evt: 'plugin.loader.no_exports',
191
+ module: MODULE_TAG,
192
+ namespace: plugin.namespace,
193
+ source: plugin.source,
194
+ domain,
195
+ msg: domain === 'lang'
196
+ ? `Plugin "${plugin.namespace}" registered no language adapters — nothing to use.`
197
+ : `Plugin "${plugin.namespace}" registered no checks or recipes — nothing to run.`,
198
+ });
199
+ }
200
+ logger.info({
201
+ evt: 'plugin.loader.load.success',
202
+ module: MODULE_TAG,
203
+ namespace: plugin.namespace,
204
+ source: plugin.source,
205
+ domain,
206
+ checksRegistered,
207
+ recipesRegistered,
208
+ adaptersRegistered,
209
+ });
210
+ return {
211
+ namespace: plugin.namespace,
212
+ source: plugin.source,
213
+ type: plugin.type,
214
+ checksRegistered,
215
+ recipesRegistered,
216
+ adaptersRegistered,
217
+ };
218
+ }
219
+ catch (error) {
220
+ const errorMsg = error instanceof Error ? error.message : String(error);
221
+ logger.warn({
222
+ evt: 'plugin.loader.load.error',
223
+ module: MODULE_TAG,
224
+ namespace: plugin.namespace,
225
+ source: plugin.source,
226
+ error: errorMsg,
227
+ err: error instanceof Error ? error : undefined,
228
+ msg: `Plugin "${plugin.namespace}" failed to load: ${errorMsg}. Continuing without this plugin.`,
229
+ });
230
+ return {
231
+ namespace: plugin.namespace,
232
+ source: plugin.source,
233
+ type: plugin.type,
234
+ checksRegistered: 0,
235
+ recipesRegistered: 0,
236
+ adaptersRegistered: 0,
237
+ error: errorMsg,
238
+ };
239
+ }
240
+ }
241
+ /**
242
+ * Structural check for LanguageAdapter — used by the lang plugin domain
243
+ * to identify adapter values among arbitrary named exports. We don't
244
+ * have a runtime type guard equivalent to isCheck() for adapters, so
245
+ * we duck-type the required surface (`id`, `fileExtensions`, `parse`,
246
+ * `stripStrings`, `stripComments`).
247
+ */
248
+ function looksLikeLanguageAdapter(value) {
249
+ if (!value || typeof value !== 'object')
250
+ return false;
251
+ const v = value;
252
+ return (typeof v.id === 'string' &&
253
+ Array.isArray(v.fileExtensions) &&
254
+ typeof v.parse === 'function' &&
255
+ typeof v.stripStrings === 'function' &&
256
+ typeof v.stripComments === 'function');
257
+ }
258
+ /**
259
+ * Discover and load all plugins for a domain. Loads sequentially to
260
+ * ensure deterministic registration order.
261
+ *
262
+ * Discovers loose `.mjs` files under
263
+ * `<projectDir>/opensip-tools/<tool>/{checks,recipes,scenarios}/` plus
264
+ * any npm-installed packages in
265
+ * `<projectDir>/opensip-tools/.runtime/plugins/<domain>/node_modules/`
266
+ * that are listed in `plugins.<domain>` in the project config.
267
+ *
268
+ * Without a `projectDir`, no plugins are loaded — there's no
269
+ * user-global fallback.
270
+ */
271
+ export async function loadAllPlugins(domain, projectDir) {
272
+ const discovered = discoverPlugins(domain, projectDir);
273
+ const plugins = [];
274
+ const errors = [];
275
+ for (const plugin of discovered) {
276
+ const result = await loadPlugin(plugin, domain);
277
+ plugins.push(result);
278
+ if (result.error) {
279
+ errors.push(`${result.source}: ${result.error}`);
280
+ }
281
+ }
282
+ return {
283
+ plugins,
284
+ totalChecks: plugins.reduce((sum, p) => sum + p.checksRegistered, 0),
285
+ totalRecipes: plugins.reduce((sum, p) => sum + p.recipesRegistered, 0),
286
+ totalAdapters: plugins.reduce((sum, p) => sum + (p.adaptersRegistered ?? 0), 0),
287
+ errors,
288
+ };
289
+ }
290
+ //# 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,23 @@
1
+ /**
2
+ * @fileoverview Fitness plugin export contract
3
+ *
4
+ * What an @opensip-tools/checks-* (or any 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
+ import type { CheckDisplayEntry, PluginMetadata } from '@opensip-tools/core';
11
+ /** What a fitness plugin package/file exports */
12
+ export interface FitPluginExports {
13
+ readonly checks?: readonly Check[];
14
+ readonly recipes?: readonly FitnessRecipe[];
15
+ readonly metadata?: PluginMetadata;
16
+ /**
17
+ * Optional display map: check slug → [icon, displayName].
18
+ * The CLI merges these from every loaded check package and uses
19
+ * the merged map when rendering tables and dashboard catalog entries.
20
+ */
21
+ readonly checkDisplay?: Readonly<Record<string, CheckDisplayEntry>>;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map