@opensip-cli/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/config-resolution.test.d.ts +2 -0
  5. package/dist/__tests__/config-resolution.test.d.ts.map +1 -0
  6. package/dist/__tests__/config-resolution.test.js +94 -0
  7. package/dist/__tests__/config-resolution.test.js.map +1 -0
  8. package/dist/__tests__/public-api.test.d.ts +16 -0
  9. package/dist/__tests__/public-api.test.d.ts.map +1 -0
  10. package/dist/__tests__/public-api.test.js +209 -0
  11. package/dist/__tests__/public-api.test.js.map +1 -0
  12. package/dist/__tests__/signal-batch.test.d.ts +2 -0
  13. package/dist/__tests__/signal-batch.test.d.ts.map +1 -0
  14. package/dist/__tests__/signal-batch.test.js +39 -0
  15. package/dist/__tests__/signal-batch.test.js.map +1 -0
  16. package/dist/__tests__/signal-sink.test.d.ts +2 -0
  17. package/dist/__tests__/signal-sink.test.d.ts.map +1 -0
  18. package/dist/__tests__/signal-sink.test.js +25 -0
  19. package/dist/__tests__/signal-sink.test.js.map +1 -0
  20. package/dist/__tests__/strip-utils.test.d.ts +2 -0
  21. package/dist/__tests__/strip-utils.test.d.ts.map +1 -0
  22. package/dist/__tests__/strip-utils.test.js +397 -0
  23. package/dist/__tests__/strip-utils.test.js.map +1 -0
  24. package/dist/__tests__/text-tree.test.d.ts +2 -0
  25. package/dist/__tests__/text-tree.test.d.ts.map +1 -0
  26. package/dist/__tests__/text-tree.test.js +31 -0
  27. package/dist/__tests__/text-tree.test.js.map +1 -0
  28. package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts +2 -0
  29. package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts.map +1 -0
  30. package/dist/baseline/__tests__/fingerprint-strategy.test.js +69 -0
  31. package/dist/baseline/__tests__/fingerprint-strategy.test.js.map +1 -0
  32. package/dist/baseline/fingerprint-strategy.d.ts +70 -0
  33. package/dist/baseline/fingerprint-strategy.d.ts.map +1 -0
  34. package/dist/baseline/fingerprint-strategy.js +90 -0
  35. package/dist/baseline/fingerprint-strategy.js.map +1 -0
  36. package/dist/config-resolution.d.ts +27 -0
  37. package/dist/config-resolution.d.ts.map +1 -0
  38. package/dist/config-resolution.js +92 -0
  39. package/dist/config-resolution.js.map +1 -0
  40. package/dist/index.d.ts +81 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +165 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/languages/__tests__/content-filter-dispatch.test.d.ts +2 -0
  45. package/dist/languages/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
  46. package/dist/languages/__tests__/content-filter-dispatch.test.js +87 -0
  47. package/dist/languages/__tests__/content-filter-dispatch.test.js.map +1 -0
  48. package/dist/languages/__tests__/non-code-formats.test.d.ts +2 -0
  49. package/dist/languages/__tests__/non-code-formats.test.d.ts.map +1 -0
  50. package/dist/languages/__tests__/non-code-formats.test.js +31 -0
  51. package/dist/languages/__tests__/non-code-formats.test.js.map +1 -0
  52. package/dist/languages/__tests__/parse-cache.test.d.ts +2 -0
  53. package/dist/languages/__tests__/parse-cache.test.d.ts.map +1 -0
  54. package/dist/languages/__tests__/parse-cache.test.js +228 -0
  55. package/dist/languages/__tests__/parse-cache.test.js.map +1 -0
  56. package/dist/languages/__tests__/registry.test.d.ts +2 -0
  57. package/dist/languages/__tests__/registry.test.d.ts.map +1 -0
  58. package/dist/languages/__tests__/registry.test.js +193 -0
  59. package/dist/languages/__tests__/registry.test.js.map +1 -0
  60. package/dist/languages/__tests__/workspace-unit-contract.test.d.ts +2 -0
  61. package/dist/languages/__tests__/workspace-unit-contract.test.d.ts.map +1 -0
  62. package/dist/languages/__tests__/workspace-unit-contract.test.js +66 -0
  63. package/dist/languages/__tests__/workspace-unit-contract.test.js.map +1 -0
  64. package/dist/languages/adapter.d.ts +66 -0
  65. package/dist/languages/adapter.d.ts.map +1 -0
  66. package/dist/languages/adapter.js +2 -0
  67. package/dist/languages/adapter.js.map +1 -0
  68. package/dist/languages/content-filter-dispatch.d.ts +36 -0
  69. package/dist/languages/content-filter-dispatch.d.ts.map +1 -0
  70. package/dist/languages/content-filter-dispatch.js +75 -0
  71. package/dist/languages/content-filter-dispatch.js.map +1 -0
  72. package/dist/languages/generic-types.d.ts +22 -0
  73. package/dist/languages/generic-types.d.ts.map +1 -0
  74. package/dist/languages/generic-types.js +3 -0
  75. package/dist/languages/generic-types.js.map +1 -0
  76. package/dist/languages/index.d.ts +12 -0
  77. package/dist/languages/index.d.ts.map +1 -0
  78. package/dist/languages/index.js +7 -0
  79. package/dist/languages/index.js.map +1 -0
  80. package/dist/languages/non-code-formats.d.ts +37 -0
  81. package/dist/languages/non-code-formats.d.ts.map +1 -0
  82. package/dist/languages/non-code-formats.js +45 -0
  83. package/dist/languages/non-code-formats.js.map +1 -0
  84. package/dist/languages/parse-cache-class.d.ts +69 -0
  85. package/dist/languages/parse-cache-class.d.ts.map +1 -0
  86. package/dist/languages/parse-cache-class.js +135 -0
  87. package/dist/languages/parse-cache-class.js.map +1 -0
  88. package/dist/languages/parse-cache.d.ts +54 -0
  89. package/dist/languages/parse-cache.d.ts.map +1 -0
  90. package/dist/languages/parse-cache.js +88 -0
  91. package/dist/languages/parse-cache.js.map +1 -0
  92. package/dist/languages/registry.d.ts +35 -0
  93. package/dist/languages/registry.d.ts.map +1 -0
  94. package/dist/languages/registry.js +123 -0
  95. package/dist/languages/registry.js.map +1 -0
  96. package/dist/languages/strip-scanners.d.ts +170 -0
  97. package/dist/languages/strip-scanners.d.ts.map +1 -0
  98. package/dist/languages/strip-scanners.js +233 -0
  99. package/dist/languages/strip-scanners.js.map +1 -0
  100. package/dist/languages/strip-utils.d.ts +66 -0
  101. package/dist/languages/strip-utils.d.ts.map +1 -0
  102. package/dist/languages/strip-utils.js +88 -0
  103. package/dist/languages/strip-utils.js.map +1 -0
  104. package/dist/languages/text-tree.d.ts +44 -0
  105. package/dist/languages/text-tree.d.ts.map +1 -0
  106. package/dist/languages/text-tree.js +34 -0
  107. package/dist/languages/text-tree.js.map +1 -0
  108. package/dist/languages/workspace-unit.d.ts +18 -0
  109. package/dist/languages/workspace-unit.d.ts.map +1 -0
  110. package/dist/languages/workspace-unit.js +2 -0
  111. package/dist/languages/workspace-unit.js.map +1 -0
  112. package/dist/lib/__tests__/config-version.test.d.ts +12 -0
  113. package/dist/lib/__tests__/config-version.test.d.ts.map +1 -0
  114. package/dist/lib/__tests__/config-version.test.js +92 -0
  115. package/dist/lib/__tests__/config-version.test.js.map +1 -0
  116. package/dist/lib/__tests__/diagnostics-bus.test.d.ts +7 -0
  117. package/dist/lib/__tests__/diagnostics-bus.test.d.ts.map +1 -0
  118. package/dist/lib/__tests__/diagnostics-bus.test.js +44 -0
  119. package/dist/lib/__tests__/diagnostics-bus.test.js.map +1 -0
  120. package/dist/lib/__tests__/env-registry.test.d.ts +7 -0
  121. package/dist/lib/__tests__/env-registry.test.d.ts.map +1 -0
  122. package/dist/lib/__tests__/env-registry.test.js +82 -0
  123. package/dist/lib/__tests__/env-registry.test.js.map +1 -0
  124. package/dist/lib/__tests__/errors.test.d.ts +2 -0
  125. package/dist/lib/__tests__/errors.test.d.ts.map +1 -0
  126. package/dist/lib/__tests__/errors.test.js +218 -0
  127. package/dist/lib/__tests__/errors.test.js.map +1 -0
  128. package/dist/lib/__tests__/format.test.d.ts +2 -0
  129. package/dist/lib/__tests__/format.test.d.ts.map +1 -0
  130. package/dist/lib/__tests__/format.test.js +23 -0
  131. package/dist/lib/__tests__/format.test.js.map +1 -0
  132. package/dist/lib/__tests__/ids.test.d.ts +2 -0
  133. package/dist/lib/__tests__/ids.test.d.ts.map +1 -0
  134. package/dist/lib/__tests__/ids.test.js +80 -0
  135. package/dist/lib/__tests__/ids.test.js.map +1 -0
  136. package/dist/lib/__tests__/logger.test.d.ts +2 -0
  137. package/dist/lib/__tests__/logger.test.d.ts.map +1 -0
  138. package/dist/lib/__tests__/logger.test.js +284 -0
  139. package/dist/lib/__tests__/logger.test.js.map +1 -0
  140. package/dist/lib/__tests__/package-version.test.d.ts +2 -0
  141. package/dist/lib/__tests__/package-version.test.d.ts.map +1 -0
  142. package/dist/lib/__tests__/package-version.test.js +47 -0
  143. package/dist/lib/__tests__/package-version.test.js.map +1 -0
  144. package/dist/lib/__tests__/paths.test.d.ts +5 -0
  145. package/dist/lib/__tests__/paths.test.d.ts.map +1 -0
  146. package/dist/lib/__tests__/paths.test.js +59 -0
  147. package/dist/lib/__tests__/paths.test.js.map +1 -0
  148. package/dist/lib/__tests__/payload-version.test.d.ts +2 -0
  149. package/dist/lib/__tests__/payload-version.test.d.ts.map +1 -0
  150. package/dist/lib/__tests__/payload-version.test.js +35 -0
  151. package/dist/lib/__tests__/payload-version.test.js.map +1 -0
  152. package/dist/lib/__tests__/phantom-detect.test.d.ts +10 -0
  153. package/dist/lib/__tests__/phantom-detect.test.d.ts.map +1 -0
  154. package/dist/lib/__tests__/phantom-detect.test.js +84 -0
  155. package/dist/lib/__tests__/phantom-detect.test.js.map +1 -0
  156. package/dist/lib/__tests__/project-context.test.d.ts +10 -0
  157. package/dist/lib/__tests__/project-context.test.d.ts.map +1 -0
  158. package/dist/lib/__tests__/project-context.test.js +240 -0
  159. package/dist/lib/__tests__/project-context.test.js.map +1 -0
  160. package/dist/lib/__tests__/registry.test.d.ts +2 -0
  161. package/dist/lib/__tests__/registry.test.d.ts.map +1 -0
  162. package/dist/lib/__tests__/registry.test.js +333 -0
  163. package/dist/lib/__tests__/registry.test.js.map +1 -0
  164. package/dist/lib/__tests__/retry.test.d.ts +2 -0
  165. package/dist/lib/__tests__/retry.test.d.ts.map +1 -0
  166. package/dist/lib/__tests__/retry.test.js +71 -0
  167. package/dist/lib/__tests__/retry.test.js.map +1 -0
  168. package/dist/lib/__tests__/run-diagnostics.test.d.ts +9 -0
  169. package/dist/lib/__tests__/run-diagnostics.test.d.ts.map +1 -0
  170. package/dist/lib/__tests__/run-diagnostics.test.js +61 -0
  171. package/dist/lib/__tests__/run-diagnostics.test.js.map +1 -0
  172. package/dist/lib/__tests__/run-scope.test.d.ts +2 -0
  173. package/dist/lib/__tests__/run-scope.test.d.ts.map +1 -0
  174. package/dist/lib/__tests__/run-scope.test.js +202 -0
  175. package/dist/lib/__tests__/run-scope.test.js.map +1 -0
  176. package/dist/lib/__tests__/run-timer.test.d.ts +2 -0
  177. package/dist/lib/__tests__/run-timer.test.d.ts.map +1 -0
  178. package/dist/lib/__tests__/run-timer.test.js +152 -0
  179. package/dist/lib/__tests__/run-timer.test.js.map +1 -0
  180. package/dist/lib/__tests__/severity-policy.test.d.ts +6 -0
  181. package/dist/lib/__tests__/severity-policy.test.d.ts.map +1 -0
  182. package/dist/lib/__tests__/severity-policy.test.js +47 -0
  183. package/dist/lib/__tests__/severity-policy.test.js.map +1 -0
  184. package/dist/lib/__tests__/telemetry.test.d.ts +2 -0
  185. package/dist/lib/__tests__/telemetry.test.d.ts.map +1 -0
  186. package/dist/lib/__tests__/telemetry.test.js +212 -0
  187. package/dist/lib/__tests__/telemetry.test.js.map +1 -0
  188. package/dist/lib/__tests__/verdict-policy.test.d.ts +7 -0
  189. package/dist/lib/__tests__/verdict-policy.test.d.ts.map +1 -0
  190. package/dist/lib/__tests__/verdict-policy.test.js +91 -0
  191. package/dist/lib/__tests__/verdict-policy.test.js.map +1 -0
  192. package/dist/lib/__tests__/yaml.test.d.ts +6 -0
  193. package/dist/lib/__tests__/yaml.test.d.ts.map +1 -0
  194. package/dist/lib/__tests__/yaml.test.js +79 -0
  195. package/dist/lib/__tests__/yaml.test.js.map +1 -0
  196. package/dist/lib/config-version.d.ts +49 -0
  197. package/dist/lib/config-version.d.ts.map +1 -0
  198. package/dist/lib/config-version.js +56 -0
  199. package/dist/lib/config-version.js.map +1 -0
  200. package/dist/lib/diagnostics-bus.d.ts +48 -0
  201. package/dist/lib/diagnostics-bus.d.ts.map +1 -0
  202. package/dist/lib/diagnostics-bus.js +74 -0
  203. package/dist/lib/diagnostics-bus.js.map +1 -0
  204. package/dist/lib/env-registry.d.ts +108 -0
  205. package/dist/lib/env-registry.d.ts.map +1 -0
  206. package/dist/lib/env-registry.js +92 -0
  207. package/dist/lib/env-registry.js.map +1 -0
  208. package/dist/lib/errors.d.ts +132 -0
  209. package/dist/lib/errors.d.ts.map +1 -0
  210. package/dist/lib/errors.js +160 -0
  211. package/dist/lib/errors.js.map +1 -0
  212. package/dist/lib/execution/__tests__/execution.test.d.ts +7 -0
  213. package/dist/lib/execution/__tests__/execution.test.d.ts.map +1 -0
  214. package/dist/lib/execution/__tests__/execution.test.js +254 -0
  215. package/dist/lib/execution/__tests__/execution.test.js.map +1 -0
  216. package/dist/lib/execution/index.d.ts +15 -0
  217. package/dist/lib/execution/index.d.ts.map +1 -0
  218. package/dist/lib/execution/index.js +10 -0
  219. package/dist/lib/execution/index.js.map +1 -0
  220. package/dist/lib/execution/options.d.ts +32 -0
  221. package/dist/lib/execution/options.d.ts.map +1 -0
  222. package/dist/lib/execution/options.js +15 -0
  223. package/dist/lib/execution/options.js.map +1 -0
  224. package/dist/lib/execution/pipeline.d.ts +36 -0
  225. package/dist/lib/execution/pipeline.d.ts.map +1 -0
  226. package/dist/lib/execution/pipeline.js +38 -0
  227. package/dist/lib/execution/pipeline.js.map +1 -0
  228. package/dist/lib/execution/retry.d.ts +38 -0
  229. package/dist/lib/execution/retry.d.ts.map +1 -0
  230. package/dist/lib/execution/retry.js +56 -0
  231. package/dist/lib/execution/retry.js.map +1 -0
  232. package/dist/lib/execution/run-with-timeout.d.ts +46 -0
  233. package/dist/lib/execution/run-with-timeout.d.ts.map +1 -0
  234. package/dist/lib/execution/run-with-timeout.js +86 -0
  235. package/dist/lib/execution/run-with-timeout.js.map +1 -0
  236. package/dist/lib/execution/schedule.d.ts +62 -0
  237. package/dist/lib/execution/schedule.d.ts.map +1 -0
  238. package/dist/lib/execution/schedule.js +130 -0
  239. package/dist/lib/execution/schedule.js.map +1 -0
  240. package/dist/lib/format.d.ts +17 -0
  241. package/dist/lib/format.d.ts.map +1 -0
  242. package/dist/lib/format.js +26 -0
  243. package/dist/lib/format.js.map +1 -0
  244. package/dist/lib/ids.d.ts +13 -0
  245. package/dist/lib/ids.d.ts.map +1 -0
  246. package/dist/lib/ids.js +48 -0
  247. package/dist/lib/ids.js.map +1 -0
  248. package/dist/lib/logger.d.ts +166 -0
  249. package/dist/lib/logger.d.ts.map +1 -0
  250. package/dist/lib/logger.js +283 -0
  251. package/dist/lib/logger.js.map +1 -0
  252. package/dist/lib/package-version.d.ts +17 -0
  253. package/dist/lib/package-version.d.ts.map +1 -0
  254. package/dist/lib/package-version.js +52 -0
  255. package/dist/lib/package-version.js.map +1 -0
  256. package/dist/lib/paths.d.ts +139 -0
  257. package/dist/lib/paths.d.ts.map +1 -0
  258. package/dist/lib/paths.js +105 -0
  259. package/dist/lib/paths.js.map +1 -0
  260. package/dist/lib/payload-version.d.ts +15 -0
  261. package/dist/lib/payload-version.d.ts.map +1 -0
  262. package/dist/lib/payload-version.js +24 -0
  263. package/dist/lib/payload-version.js.map +1 -0
  264. package/dist/lib/phantom-detect.d.ts +21 -0
  265. package/dist/lib/phantom-detect.d.ts.map +1 -0
  266. package/dist/lib/phantom-detect.js +76 -0
  267. package/dist/lib/phantom-detect.js.map +1 -0
  268. package/dist/lib/project-context.d.ts +66 -0
  269. package/dist/lib/project-context.d.ts.map +1 -0
  270. package/dist/lib/project-context.js +112 -0
  271. package/dist/lib/project-context.js.map +1 -0
  272. package/dist/lib/recipe-id.d.ts +13 -0
  273. package/dist/lib/recipe-id.d.ts.map +1 -0
  274. package/dist/lib/recipe-id.js +15 -0
  275. package/dist/lib/recipe-id.js.map +1 -0
  276. package/dist/lib/registry.d.ts +98 -0
  277. package/dist/lib/registry.d.ts.map +1 -0
  278. package/dist/lib/registry.js +152 -0
  279. package/dist/lib/registry.js.map +1 -0
  280. package/dist/lib/retry.d.ts +26 -0
  281. package/dist/lib/retry.d.ts.map +1 -0
  282. package/dist/lib/retry.js +48 -0
  283. package/dist/lib/retry.js.map +1 -0
  284. package/dist/lib/run-diagnostics.d.ts +64 -0
  285. package/dist/lib/run-diagnostics.d.ts.map +1 -0
  286. package/dist/lib/run-diagnostics.js +25 -0
  287. package/dist/lib/run-diagnostics.js.map +1 -0
  288. package/dist/lib/run-scope.d.ts +167 -0
  289. package/dist/lib/run-scope.d.ts.map +1 -0
  290. package/dist/lib/run-scope.js +176 -0
  291. package/dist/lib/run-scope.js.map +1 -0
  292. package/dist/lib/run-timer.d.ts +82 -0
  293. package/dist/lib/run-timer.d.ts.map +1 -0
  294. package/dist/lib/run-timer.js +79 -0
  295. package/dist/lib/run-timer.js.map +1 -0
  296. package/dist/lib/scope-types.d.ts +172 -0
  297. package/dist/lib/scope-types.d.ts.map +1 -0
  298. package/dist/lib/scope-types.js +27 -0
  299. package/dist/lib/scope-types.js.map +1 -0
  300. package/dist/lib/severity-policy.d.ts +38 -0
  301. package/dist/lib/severity-policy.d.ts.map +1 -0
  302. package/dist/lib/severity-policy.js +44 -0
  303. package/dist/lib/severity-policy.js.map +1 -0
  304. package/dist/lib/telemetry.d.ts +93 -0
  305. package/dist/lib/telemetry.d.ts.map +1 -0
  306. package/dist/lib/telemetry.js +144 -0
  307. package/dist/lib/telemetry.js.map +1 -0
  308. package/dist/lib/ui-context.d.ts +34 -0
  309. package/dist/lib/ui-context.d.ts.map +1 -0
  310. package/dist/lib/ui-context.js +16 -0
  311. package/dist/lib/ui-context.js.map +1 -0
  312. package/dist/lib/verdict-policy.d.ts +71 -0
  313. package/dist/lib/verdict-policy.d.ts.map +1 -0
  314. package/dist/lib/verdict-policy.js +82 -0
  315. package/dist/lib/verdict-policy.js.map +1 -0
  316. package/dist/lib/yaml.d.ts +74 -0
  317. package/dist/lib/yaml.d.ts.map +1 -0
  318. package/dist/lib/yaml.js +118 -0
  319. package/dist/lib/yaml.js.map +1 -0
  320. package/dist/plugins/__tests__/as-if-external.test.d.ts +18 -0
  321. package/dist/plugins/__tests__/as-if-external.test.d.ts.map +1 -0
  322. package/dist/plugins/__tests__/as-if-external.test.js +159 -0
  323. package/dist/plugins/__tests__/as-if-external.test.js.map +1 -0
  324. package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts +8 -0
  325. package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts.map +1 -0
  326. package/dist/plugins/__tests__/authored-tool-discovery.test.js +97 -0
  327. package/dist/plugins/__tests__/authored-tool-discovery.test.js.map +1 -0
  328. package/dist/plugins/__tests__/capability-discovery.test.d.ts +2 -0
  329. package/dist/plugins/__tests__/capability-discovery.test.d.ts.map +1 -0
  330. package/dist/plugins/__tests__/capability-discovery.test.js +349 -0
  331. package/dist/plugins/__tests__/capability-discovery.test.js.map +1 -0
  332. package/dist/plugins/__tests__/capability-from-manifest.test.d.ts +2 -0
  333. package/dist/plugins/__tests__/capability-from-manifest.test.d.ts.map +1 -0
  334. package/dist/plugins/__tests__/capability-from-manifest.test.js +172 -0
  335. package/dist/plugins/__tests__/capability-from-manifest.test.js.map +1 -0
  336. package/dist/plugins/__tests__/capability-loader.test.d.ts +2 -0
  337. package/dist/plugins/__tests__/capability-loader.test.d.ts.map +1 -0
  338. package/dist/plugins/__tests__/capability-loader.test.js +122 -0
  339. package/dist/plugins/__tests__/capability-loader.test.js.map +1 -0
  340. package/dist/plugins/__tests__/capability-registry.test.d.ts +2 -0
  341. package/dist/plugins/__tests__/capability-registry.test.d.ts.map +1 -0
  342. package/dist/plugins/__tests__/capability-registry.test.js +185 -0
  343. package/dist/plugins/__tests__/capability-registry.test.js.map +1 -0
  344. package/dist/plugins/__tests__/discover.test.d.ts +2 -0
  345. package/dist/plugins/__tests__/discover.test.d.ts.map +1 -0
  346. package/dist/plugins/__tests__/discover.test.js +311 -0
  347. package/dist/plugins/__tests__/discover.test.js.map +1 -0
  348. package/dist/plugins/__tests__/loader.test.d.ts +2 -0
  349. package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
  350. package/dist/plugins/__tests__/loader.test.js +191 -0
  351. package/dist/plugins/__tests__/loader.test.js.map +1 -0
  352. package/dist/plugins/__tests__/manifest-discovery.test.d.ts +2 -0
  353. package/dist/plugins/__tests__/manifest-discovery.test.d.ts.map +1 -0
  354. package/dist/plugins/__tests__/manifest-discovery.test.js +132 -0
  355. package/dist/plugins/__tests__/manifest-discovery.test.js.map +1 -0
  356. package/dist/plugins/__tests__/manifest-loader.test.d.ts +2 -0
  357. package/dist/plugins/__tests__/manifest-loader.test.d.ts.map +1 -0
  358. package/dist/plugins/__tests__/manifest-loader.test.js +434 -0
  359. package/dist/plugins/__tests__/manifest-loader.test.js.map +1 -0
  360. package/dist/plugins/__tests__/marker-discovery.test.d.ts +2 -0
  361. package/dist/plugins/__tests__/marker-discovery.test.d.ts.map +1 -0
  362. package/dist/plugins/__tests__/marker-discovery.test.js +164 -0
  363. package/dist/plugins/__tests__/marker-discovery.test.js.map +1 -0
  364. package/dist/plugins/__tests__/node-modules-walk.test.d.ts +2 -0
  365. package/dist/plugins/__tests__/node-modules-walk.test.d.ts.map +1 -0
  366. package/dist/plugins/__tests__/node-modules-walk.test.js +76 -0
  367. package/dist/plugins/__tests__/node-modules-walk.test.js.map +1 -0
  368. package/dist/plugins/__tests__/package-entry.test.d.ts +9 -0
  369. package/dist/plugins/__tests__/package-entry.test.d.ts.map +1 -0
  370. package/dist/plugins/__tests__/package-entry.test.js +117 -0
  371. package/dist/plugins/__tests__/package-entry.test.js.map +1 -0
  372. package/dist/plugins/__tests__/recipe-loader.test.d.ts +2 -0
  373. package/dist/plugins/__tests__/recipe-loader.test.d.ts.map +1 -0
  374. package/dist/plugins/__tests__/recipe-loader.test.js +130 -0
  375. package/dist/plugins/__tests__/recipe-loader.test.js.map +1 -0
  376. package/dist/plugins/__tests__/scope-validation.test.d.ts +2 -0
  377. package/dist/plugins/__tests__/scope-validation.test.d.ts.map +1 -0
  378. package/dist/plugins/__tests__/scope-validation.test.js +68 -0
  379. package/dist/plugins/__tests__/scope-validation.test.js.map +1 -0
  380. package/dist/plugins/__tests__/single-core-guard.test.d.ts +10 -0
  381. package/dist/plugins/__tests__/single-core-guard.test.d.ts.map +1 -0
  382. package/dist/plugins/__tests__/single-core-guard.test.js +89 -0
  383. package/dist/plugins/__tests__/single-core-guard.test.js.map +1 -0
  384. package/dist/plugins/__tests__/tool-package-discovery.test.d.ts +2 -0
  385. package/dist/plugins/__tests__/tool-package-discovery.test.d.ts.map +1 -0
  386. package/dist/plugins/__tests__/tool-package-discovery.test.js +215 -0
  387. package/dist/plugins/__tests__/tool-package-discovery.test.js.map +1 -0
  388. package/dist/plugins/authored-tool-discovery.d.ts +45 -0
  389. package/dist/plugins/authored-tool-discovery.d.ts.map +1 -0
  390. package/dist/plugins/authored-tool-discovery.js +61 -0
  391. package/dist/plugins/authored-tool-discovery.js.map +1 -0
  392. package/dist/plugins/capability-discovery.d.ts +80 -0
  393. package/dist/plugins/capability-discovery.d.ts.map +1 -0
  394. package/dist/plugins/capability-discovery.js +278 -0
  395. package/dist/plugins/capability-discovery.js.map +1 -0
  396. package/dist/plugins/capability-loader.d.ts +50 -0
  397. package/dist/plugins/capability-loader.d.ts.map +1 -0
  398. package/dist/plugins/capability-loader.js +85 -0
  399. package/dist/plugins/capability-loader.js.map +1 -0
  400. package/dist/plugins/capability-registry.d.ts +169 -0
  401. package/dist/plugins/capability-registry.d.ts.map +1 -0
  402. package/dist/plugins/capability-registry.js +319 -0
  403. package/dist/plugins/capability-registry.js.map +1 -0
  404. package/dist/plugins/discover.d.ts +64 -0
  405. package/dist/plugins/discover.d.ts.map +1 -0
  406. package/dist/plugins/discover.js +303 -0
  407. package/dist/plugins/discover.js.map +1 -0
  408. package/dist/plugins/index.d.ts +37 -0
  409. package/dist/plugins/index.d.ts.map +1 -0
  410. package/dist/plugins/index.js +40 -0
  411. package/dist/plugins/index.js.map +1 -0
  412. package/dist/plugins/json-guards.d.ts +11 -0
  413. package/dist/plugins/json-guards.d.ts.map +1 -0
  414. package/dist/plugins/json-guards.js +15 -0
  415. package/dist/plugins/json-guards.js.map +1 -0
  416. package/dist/plugins/loader.d.ts +67 -0
  417. package/dist/plugins/loader.d.ts.map +1 -0
  418. package/dist/plugins/loader.js +137 -0
  419. package/dist/plugins/loader.js.map +1 -0
  420. package/dist/plugins/manifest-discovery.d.ts +28 -0
  421. package/dist/plugins/manifest-discovery.d.ts.map +1 -0
  422. package/dist/plugins/manifest-discovery.js +103 -0
  423. package/dist/plugins/manifest-discovery.js.map +1 -0
  424. package/dist/plugins/manifest-loader.d.ts +120 -0
  425. package/dist/plugins/manifest-loader.d.ts.map +1 -0
  426. package/dist/plugins/manifest-loader.js +410 -0
  427. package/dist/plugins/manifest-loader.js.map +1 -0
  428. package/dist/plugins/marker-discovery.d.ts +115 -0
  429. package/dist/plugins/marker-discovery.d.ts.map +1 -0
  430. package/dist/plugins/marker-discovery.js +172 -0
  431. package/dist/plugins/marker-discovery.js.map +1 -0
  432. package/dist/plugins/node-modules-walk.d.ts +61 -0
  433. package/dist/plugins/node-modules-walk.d.ts.map +1 -0
  434. package/dist/plugins/node-modules-walk.js +99 -0
  435. package/dist/plugins/node-modules-walk.js.map +1 -0
  436. package/dist/plugins/package-entry.d.ts +38 -0
  437. package/dist/plugins/package-entry.d.ts.map +1 -0
  438. package/dist/plugins/package-entry.js +86 -0
  439. package/dist/plugins/package-entry.js.map +1 -0
  440. package/dist/plugins/recipe-loader.d.ts +63 -0
  441. package/dist/plugins/recipe-loader.d.ts.map +1 -0
  442. package/dist/plugins/recipe-loader.js +67 -0
  443. package/dist/plugins/recipe-loader.js.map +1 -0
  444. package/dist/plugins/scope-validation.d.ts +35 -0
  445. package/dist/plugins/scope-validation.d.ts.map +1 -0
  446. package/dist/plugins/scope-validation.js +55 -0
  447. package/dist/plugins/scope-validation.js.map +1 -0
  448. package/dist/plugins/single-core-guard.d.ts +28 -0
  449. package/dist/plugins/single-core-guard.d.ts.map +1 -0
  450. package/dist/plugins/single-core-guard.js +69 -0
  451. package/dist/plugins/single-core-guard.js.map +1 -0
  452. package/dist/plugins/tool-package-discovery.d.ts +93 -0
  453. package/dist/plugins/tool-package-discovery.d.ts.map +1 -0
  454. package/dist/plugins/tool-package-discovery.js +118 -0
  455. package/dist/plugins/tool-package-discovery.js.map +1 -0
  456. package/dist/plugins/types.d.ts +78 -0
  457. package/dist/plugins/types.d.ts.map +1 -0
  458. package/dist/plugins/types.js +15 -0
  459. package/dist/plugins/types.js.map +1 -0
  460. package/dist/recipes/__tests__/registry.test.d.ts +2 -0
  461. package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
  462. package/dist/recipes/__tests__/registry.test.js +170 -0
  463. package/dist/recipes/__tests__/registry.test.js.map +1 -0
  464. package/dist/recipes/__tests__/selector.test.d.ts +20 -0
  465. package/dist/recipes/__tests__/selector.test.d.ts.map +1 -0
  466. package/dist/recipes/__tests__/selector.test.js +173 -0
  467. package/dist/recipes/__tests__/selector.test.js.map +1 -0
  468. package/dist/recipes/__tests__/unit-config.test.d.ts +7 -0
  469. package/dist/recipes/__tests__/unit-config.test.d.ts.map +1 -0
  470. package/dist/recipes/__tests__/unit-config.test.js +52 -0
  471. package/dist/recipes/__tests__/unit-config.test.js.map +1 -0
  472. package/dist/recipes/registry.d.ts +105 -0
  473. package/dist/recipes/registry.d.ts.map +1 -0
  474. package/dist/recipes/registry.js +141 -0
  475. package/dist/recipes/registry.js.map +1 -0
  476. package/dist/recipes/selector.d.ts +112 -0
  477. package/dist/recipes/selector.d.ts.map +1 -0
  478. package/dist/recipes/selector.js +134 -0
  479. package/dist/recipes/selector.js.map +1 -0
  480. package/dist/recipes/unit-config.d.ts +63 -0
  481. package/dist/recipes/unit-config.d.ts.map +1 -0
  482. package/dist/recipes/unit-config.js +68 -0
  483. package/dist/recipes/unit-config.js.map +1 -0
  484. package/dist/runtime/__tests__/in-process-transport.test.d.ts +6 -0
  485. package/dist/runtime/__tests__/in-process-transport.test.d.ts.map +1 -0
  486. package/dist/runtime/__tests__/in-process-transport.test.js +73 -0
  487. package/dist/runtime/__tests__/in-process-transport.test.js.map +1 -0
  488. package/dist/runtime/__tests__/subprocess-transport.test.d.ts +11 -0
  489. package/dist/runtime/__tests__/subprocess-transport.test.d.ts.map +1 -0
  490. package/dist/runtime/__tests__/subprocess-transport.test.js +118 -0
  491. package/dist/runtime/__tests__/subprocess-transport.test.js.map +1 -0
  492. package/dist/runtime/in-process-transport.d.ts +20 -0
  493. package/dist/runtime/in-process-transport.d.ts.map +1 -0
  494. package/dist/runtime/in-process-transport.js +49 -0
  495. package/dist/runtime/in-process-transport.js.map +1 -0
  496. package/dist/runtime/progress-transport.d.ts +73 -0
  497. package/dist/runtime/progress-transport.d.ts.map +1 -0
  498. package/dist/runtime/progress-transport.js +17 -0
  499. package/dist/runtime/progress-transport.js.map +1 -0
  500. package/dist/runtime/subprocess-transport.d.ts +43 -0
  501. package/dist/runtime/subprocess-transport.d.ts.map +1 -0
  502. package/dist/runtime/subprocess-transport.js +134 -0
  503. package/dist/runtime/subprocess-transport.js.map +1 -0
  504. package/dist/signals/comment-openers.d.ts +29 -0
  505. package/dist/signals/comment-openers.d.ts.map +1 -0
  506. package/dist/signals/comment-openers.js +41 -0
  507. package/dist/signals/comment-openers.js.map +1 -0
  508. package/dist/signals/comment-openers.test.d.ts +7 -0
  509. package/dist/signals/comment-openers.test.d.ts.map +1 -0
  510. package/dist/signals/comment-openers.test.js +41 -0
  511. package/dist/signals/comment-openers.test.js.map +1 -0
  512. package/dist/signals/create-signal-from-violation.d.ts +29 -0
  513. package/dist/signals/create-signal-from-violation.d.ts.map +1 -0
  514. package/dist/signals/create-signal-from-violation.js +29 -0
  515. package/dist/signals/create-signal-from-violation.js.map +1 -0
  516. package/dist/signals/signal-sink.d.ts +49 -0
  517. package/dist/signals/signal-sink.d.ts.map +1 -0
  518. package/dist/signals/signal-sink.js +6 -0
  519. package/dist/signals/signal-sink.js.map +1 -0
  520. package/dist/signals/suppress.d.ts +102 -0
  521. package/dist/signals/suppress.d.ts.map +1 -0
  522. package/dist/signals/suppress.js +325 -0
  523. package/dist/signals/suppress.js.map +1 -0
  524. package/dist/signals/suppress.test.d.ts +2 -0
  525. package/dist/signals/suppress.test.d.ts.map +1 -0
  526. package/dist/signals/suppress.test.js +213 -0
  527. package/dist/signals/suppress.test.js.map +1 -0
  528. package/dist/tools/__tests__/command-spec.test.d.ts +2 -0
  529. package/dist/tools/__tests__/command-spec.test.d.ts.map +1 -0
  530. package/dist/tools/__tests__/command-spec.test.js +191 -0
  531. package/dist/tools/__tests__/command-spec.test.js.map +1 -0
  532. package/dist/tools/__tests__/compatibility.test.d.ts +5 -0
  533. package/dist/tools/__tests__/compatibility.test.d.ts.map +1 -0
  534. package/dist/tools/__tests__/compatibility.test.js +41 -0
  535. package/dist/tools/__tests__/compatibility.test.js.map +1 -0
  536. package/dist/tools/__tests__/ids.test.d.ts +5 -0
  537. package/dist/tools/__tests__/ids.test.d.ts.map +1 -0
  538. package/dist/tools/__tests__/ids.test.js +56 -0
  539. package/dist/tools/__tests__/ids.test.js.map +1 -0
  540. package/dist/tools/__tests__/manifest-assert.test.d.ts +5 -0
  541. package/dist/tools/__tests__/manifest-assert.test.d.ts.map +1 -0
  542. package/dist/tools/__tests__/manifest-assert.test.js +66 -0
  543. package/dist/tools/__tests__/manifest-assert.test.js.map +1 -0
  544. package/dist/tools/__tests__/registry.test.d.ts +2 -0
  545. package/dist/tools/__tests__/registry.test.d.ts.map +1 -0
  546. package/dist/tools/__tests__/registry.test.js +93 -0
  547. package/dist/tools/__tests__/registry.test.js.map +1 -0
  548. package/dist/tools/__tests__/types.test.d.ts +2 -0
  549. package/dist/tools/__tests__/types.test.d.ts.map +1 -0
  550. package/dist/tools/__tests__/types.test.js +51 -0
  551. package/dist/tools/__tests__/types.test.js.map +1 -0
  552. package/dist/tools/capability.d.ts +257 -0
  553. package/dist/tools/capability.d.ts.map +1 -0
  554. package/dist/tools/capability.js +46 -0
  555. package/dist/tools/capability.js.map +1 -0
  556. package/dist/tools/command-spec.d.ts +211 -0
  557. package/dist/tools/command-spec.d.ts.map +1 -0
  558. package/dist/tools/command-spec.js +110 -0
  559. package/dist/tools/command-spec.js.map +1 -0
  560. package/dist/tools/compatibility.d.ts +45 -0
  561. package/dist/tools/compatibility.d.ts.map +1 -0
  562. package/dist/tools/compatibility.js +49 -0
  563. package/dist/tools/compatibility.js.map +1 -0
  564. package/dist/tools/ids.d.ts +61 -0
  565. package/dist/tools/ids.d.ts.map +1 -0
  566. package/dist/tools/ids.js +61 -0
  567. package/dist/tools/ids.js.map +1 -0
  568. package/dist/tools/index.d.ts +22 -0
  569. package/dist/tools/index.d.ts.map +1 -0
  570. package/dist/tools/index.js +28 -0
  571. package/dist/tools/index.js.map +1 -0
  572. package/dist/tools/manifest-assert.d.ts +35 -0
  573. package/dist/tools/manifest-assert.d.ts.map +1 -0
  574. package/dist/tools/manifest-assert.js +67 -0
  575. package/dist/tools/manifest-assert.js.map +1 -0
  576. package/dist/tools/manifest.d.ts +178 -0
  577. package/dist/tools/manifest.d.ts.map +1 -0
  578. package/dist/tools/manifest.js +35 -0
  579. package/dist/tools/manifest.js.map +1 -0
  580. package/dist/tools/registry.d.ts +37 -0
  581. package/dist/tools/registry.d.ts.map +1 -0
  582. package/dist/tools/registry.js +49 -0
  583. package/dist/tools/registry.js.map +1 -0
  584. package/dist/tools/types.d.ts +1021 -0
  585. package/dist/tools/types.d.ts.map +1 -0
  586. package/dist/tools/types.js +77 -0
  587. package/dist/tools/types.js.map +1 -0
  588. package/dist/types/__tests__/signal.test.d.ts +2 -0
  589. package/dist/types/__tests__/signal.test.d.ts.map +1 -0
  590. package/dist/types/__tests__/signal.test.js +111 -0
  591. package/dist/types/__tests__/signal.test.js.map +1 -0
  592. package/dist/types/index.d.ts +5 -0
  593. package/dist/types/index.d.ts.map +1 -0
  594. package/dist/types/index.js +3 -0
  595. package/dist/types/index.js.map +1 -0
  596. package/dist/types/signal-batch.d.ts +56 -0
  597. package/dist/types/signal-batch.d.ts.map +1 -0
  598. package/dist/types/signal-batch.js +54 -0
  599. package/dist/types/signal-batch.js.map +1 -0
  600. package/dist/types/signal.d.ts +77 -0
  601. package/dist/types/signal.d.ts.map +1 -0
  602. package/dist/types/signal.js +42 -0
  603. package/dist/types/signal.js.map +1 -0
  604. package/package.json +57 -0
@@ -0,0 +1,303 @@
1
+ // @fitness-ignore-file error-handling-quality -- safeIsDirectory/safeIsFile/isPathInside are filesystem probes where exception → false is the function's contract; missing path or unresolvable realpath legitimately means "not present" / "not inside", not a swallowed error.
2
+ /**
3
+ * @fileoverview Plugin discovery for the project-local layout.
4
+ *
5
+ * Discovery is descriptor-driven: the caller passes a `PluginLayout`
6
+ * (`{ domain, userSubdirs }`) declared by the owning tool. The kernel
7
+ * never enumerates tool domains itself (ADR-0009 corollary 1). Two
8
+ * artifact sources are walked for the layout:
9
+ *
10
+ * 1. USER SOURCE — recursive `.js` / `.mjs` files under
11
+ * `<project>/opensip-cli/<domain>/<kind>/`
12
+ * for each `kind` in `layout.userSubdirs` (e.g. `checks`/`recipes`
13
+ * for fitness, `scenarios`/`recipes` for simulation). Auto-loaded
14
+ * by directory presence; no config opt-in.
15
+ *
16
+ * 2. NPM PLUGINS — packages installed under
17
+ * `<project>/opensip-cli/.runtime/plugins/<domain>/node_modules/`
18
+ * whose names appear in the project's
19
+ * `opensip-cli.config.yml#plugins.<domain>: [...]`. The explicit
20
+ * list is required so a `plugin install` step is intentional, not
21
+ * an accidental load of every transitive devDep.
22
+ *
23
+ * A layout with an empty `userSubdirs` and no declared npm plugins
24
+ * (e.g. the language-adapter domain, whose adapters ship as direct CLI
25
+ * deps) discovers nothing — an emergent property, not a special case.
26
+ */
27
+ import { existsSync, readdirSync, statSync } from 'node:fs';
28
+ import { join, extname, relative, sep } from 'node:path';
29
+ import { resolveProjectConfigPath } from '../config-resolution.js';
30
+ import { logger } from '../lib/logger.js';
31
+ import { isPathInside, resolveProjectPaths } from '../lib/paths.js';
32
+ import { readYamlFile } from '../lib/yaml.js';
33
+ import { resolvePackageEntryPoint } from './package-entry.js';
34
+ /** Logger module tag used by every event in this file. */
35
+ const MODULE_TAG = 'core:plugins';
36
+ // =============================================================================
37
+ // PUBLIC ENTRY POINT
38
+ // =============================================================================
39
+ /**
40
+ * Discover all plugins for a layout in the project layout.
41
+ *
42
+ * Returns a list of `DiscoveredPlugin` entries (loose .mjs files +
43
+ * npm packages) for the loader to import. Discovery is silent on a
44
+ * missing project directory or absent subdirs — callers that care
45
+ * about "did we find anything?" should check the returned length.
46
+ *
47
+ * @param layout The owning tool's `PluginLayout` (`{ domain,
48
+ * userSubdirs }`).
49
+ * @param projectDir Project root. Required — there is no user-global
50
+ * fallback. Pass undefined to discover nothing
51
+ * (used by callers that don't have a project
52
+ * context yet).
53
+ */
54
+ export function discoverPlugins(layout, projectDir) {
55
+ if (!projectDir)
56
+ return [];
57
+ const { domain, userSubdirs } = layout;
58
+ const projectPaths = resolveProjectPaths(projectDir);
59
+ const plugins = [];
60
+ // 1. User-source loose files: opensip-cli/<domain>/<kind>/*.{js,mjs}
61
+ const toolDir = join(projectPaths.userSourceDir, domain);
62
+ for (const kind of userSubdirs) {
63
+ const kindDir = join(toolDir, kind);
64
+ if (!existsSync(kindDir))
65
+ continue;
66
+ plugins.push(...discoverLooseFiles(kindDir, `${domain}/${kind}`));
67
+ }
68
+ // 2. Npm-installed plugins under .runtime/plugins/<domain>/.
69
+ // Only walked when the config explicitly declares
70
+ // plugins.<domain>: [...]. The runtime dir is gitignored, so
71
+ // silently auto-loading anything in it would be a recipe for
72
+ // "where did this check come from?" surprises. Explicit listing
73
+ // is the contract for npm plugins.
74
+ const declared = readProjectPluginsList(projectDir, domain);
75
+ if (declared && declared.length > 0) {
76
+ const pluginsDir = projectPaths.pluginsDir(domain);
77
+ const nodeModulesDir = join(pluginsDir, 'node_modules');
78
+ if (existsSync(nodeModulesDir)) {
79
+ plugins.push(...discoverNpmPackages(nodeModulesDir, declared));
80
+ }
81
+ }
82
+ logger.info({
83
+ evt: 'plugin.loader.discover',
84
+ module: MODULE_TAG,
85
+ domain,
86
+ packageCount: plugins.filter((p) => p.type === 'package').length,
87
+ fileCount: plugins.filter((p) => p.type === 'file').length,
88
+ });
89
+ return plugins;
90
+ }
91
+ // =============================================================================
92
+ // CONFIG READING (plugins.<domain> from opensip-cli.config.yml)
93
+ // =============================================================================
94
+ /**
95
+ * Read the declared plugin list for a domain from the project config.
96
+ * Returns undefined when the config is absent, unreadable, or has no
97
+ * entry for the domain. Does NOT throw on YAML parse errors — returns
98
+ * undefined so discovery falls through gracefully and the config-layer
99
+ * schema validation surfaces parse errors on its own path.
100
+ *
101
+ * Config-path resolution mirrors `resolveProjectConfigPath` (the same
102
+ * helper the targets loader uses): --config flag → `package.json#
103
+ * opensip-cli.configPath` pointer → default `<projectDir>/opensip-
104
+ * tools.config.yml`. Without this, projects that locate their config
105
+ * via the package.json pointer have their `plugins.<domain>: [...]`
106
+ * declaration silently ignored — discovery falls through to the empty
107
+ * default path and the plugin pack never registers.
108
+ *
109
+ * The `--config` precedence is honored only when callers pass through
110
+ * their explicit value via `explicitConfigPath`; this entry point is
111
+ * the implicit one (no --config available at the discovery seam), so
112
+ * we resolve without an explicit path and rely on the pointer + default.
113
+ */
114
+ export function readProjectPluginsList(projectDir, domain) {
115
+ let configPath;
116
+ try {
117
+ configPath = resolveProjectConfigPath(projectDir);
118
+ }
119
+ catch {
120
+ // resolveProjectConfigPath throws on "no config found anywhere" —
121
+ // discovery is implicit (no --config), so a missing config falls
122
+ // through gracefully here (the explicit-path layer surfaces its own
123
+ // error when the caller asked for one).
124
+ return undefined;
125
+ }
126
+ // Parse YAML via the shared permissive helper to avoid a circular dep
127
+ // between plugins/ and targets/. We only need the `plugins.<domain>`
128
+ // array; anything else is validated by the targets loader.
129
+ const doc = readYamlFile(configPath);
130
+ if (!doc || typeof doc !== 'object')
131
+ return undefined;
132
+ const plugins = doc.plugins;
133
+ if (!plugins || typeof plugins !== 'object')
134
+ return undefined;
135
+ const list = plugins[domain];
136
+ if (!Array.isArray(list))
137
+ return undefined;
138
+ return list.filter((v) => typeof v === 'string');
139
+ }
140
+ // =============================================================================
141
+ // NPM PACKAGE DISCOVERY
142
+ // =============================================================================
143
+ function discoverNpmPackages(nodeModulesDir, declared) {
144
+ const plugins = [];
145
+ for (const name of declared) {
146
+ // Reject names that could traverse before they ever touch the filesystem.
147
+ // The plugin list comes from opensip-cli.config.yml — user-controlled
148
+ // content under a project that runs `opensip fit` would otherwise
149
+ // act as an attacker-influenced input flowing into a path join.
150
+ if (name.length === 0 || name.includes('..') || name.startsWith('/') || name.includes('\0')) {
151
+ logger.warn({
152
+ evt: 'plugin.loader.discover.reject',
153
+ module: MODULE_TAG,
154
+ reason: 'invalid plugin name',
155
+ name,
156
+ });
157
+ continue;
158
+ }
159
+ const packageDir = join(nodeModulesDir, name);
160
+ // Containment check: the resolved real path (after symlinks) must
161
+ // stay inside node_modules. Catches symlink-based escapes if an
162
+ // attacker plants a symlink.
163
+ if (!isPathInside(packageDir, nodeModulesDir)) {
164
+ logger.warn({
165
+ evt: 'plugin.loader.discover.reject',
166
+ module: MODULE_TAG,
167
+ reason: 'package path resolves outside node_modules',
168
+ name,
169
+ });
170
+ continue;
171
+ }
172
+ const plugin = tryDiscoverPackage(packageDir, name);
173
+ if (plugin)
174
+ plugins.push(plugin);
175
+ }
176
+ return plugins;
177
+ }
178
+ function tryDiscoverPackage(packageDir, name) {
179
+ if (!safeIsDirectory(packageDir))
180
+ return undefined;
181
+ const resolved = resolvePackageEntryPoint(packageDir, name);
182
+ if (!resolved) {
183
+ logger.debug({
184
+ evt: 'plugin.loader.discover.skip',
185
+ module: MODULE_TAG,
186
+ reason: 'invalid package.json',
187
+ name,
188
+ });
189
+ return undefined;
190
+ }
191
+ // Containment check: the resolved entry must stay inside `packageDir`
192
+ // after symlink resolution. A malicious or accidentally-malformed
193
+ // `pkg.main` / `pkg.exports` such as `../../escape.js` would otherwise
194
+ // traverse out of node_modules and be dynamically imported. The earlier
195
+ // package-dir containment check (discoverNpmPackages) does not cover
196
+ // the entry-file path, so we re-check it here.
197
+ if (!isPathInside(resolved.entry, packageDir)) {
198
+ logger.warn({
199
+ evt: 'plugin.loader.discover.reject',
200
+ module: MODULE_TAG,
201
+ reason: 'entry point resolves outside package directory',
202
+ name,
203
+ entry: resolved.entry,
204
+ });
205
+ return undefined;
206
+ }
207
+ if (!existsSync(resolved.entry)) {
208
+ logger.debug({
209
+ evt: 'plugin.loader.discover.skip',
210
+ module: MODULE_TAG,
211
+ reason: 'entry point not found',
212
+ packageName: resolved.name,
213
+ entryPoint: resolved.entry,
214
+ });
215
+ return undefined;
216
+ }
217
+ return {
218
+ type: 'package',
219
+ entryPoint: resolved.entry,
220
+ namespace: resolved.name,
221
+ source: resolved.name,
222
+ };
223
+ }
224
+ // =============================================================================
225
+ // LOOSE FILE DISCOVERY
226
+ // =============================================================================
227
+ const LOOSE_FILE_EXTENSIONS = new Set(['.js', '.mjs']);
228
+ function discoverLooseFiles(dir, namespacePrefix) {
229
+ return discoverLooseFilesInDir(dir, namespacePrefix, dir);
230
+ }
231
+ function discoverLooseFilesInDir(dir, namespacePrefix, rootDir) {
232
+ const plugins = [];
233
+ let entries;
234
+ try {
235
+ entries = readdirSync(dir);
236
+ }
237
+ catch {
238
+ return plugins;
239
+ }
240
+ for (const entry of entries) {
241
+ const fullPath = join(dir, entry);
242
+ if (safeIsDirectory(fullPath)) {
243
+ if (!isPathInside(fullPath, rootDir)) {
244
+ logger.warn({
245
+ evt: 'plugin.loader.discover.reject',
246
+ module: MODULE_TAG,
247
+ reason: 'loose file directory resolves outside plugin dir',
248
+ entry,
249
+ });
250
+ continue;
251
+ }
252
+ plugins.push(...discoverLooseFilesInDir(fullPath, namespacePrefix, rootDir));
253
+ continue;
254
+ }
255
+ const ext = extname(entry);
256
+ if (!LOOSE_FILE_EXTENSIONS.has(ext))
257
+ continue;
258
+ if (!safeIsFile(fullPath))
259
+ continue;
260
+ if (!isPathInside(fullPath, rootDir)) {
261
+ logger.warn({
262
+ evt: 'plugin.loader.discover.reject',
263
+ module: MODULE_TAG,
264
+ reason: 'loose file resolves outside plugin dir',
265
+ entry,
266
+ });
267
+ continue;
268
+ }
269
+ const relativePath = normalizePluginRelativePath(relative(rootDir, fullPath));
270
+ const namespacePath = relativePath.slice(0, -ext.length);
271
+ plugins.push({
272
+ type: 'file',
273
+ entryPoint: fullPath,
274
+ namespace: `${namespacePrefix}/${namespacePath}`,
275
+ source: relativePath,
276
+ });
277
+ }
278
+ return plugins;
279
+ }
280
+ function normalizePluginRelativePath(path) {
281
+ return path.split(sep).join('/');
282
+ }
283
+ // =============================================================================
284
+ // HELPERS
285
+ // =============================================================================
286
+ function safeIsDirectory(path) {
287
+ try {
288
+ return statSync(path).isDirectory();
289
+ }
290
+ catch {
291
+ return false;
292
+ }
293
+ }
294
+ function safeIsFile(path) {
295
+ try {
296
+ return statSync(path).isFile();
297
+ }
298
+ catch {
299
+ return false;
300
+ }
301
+ }
302
+ // isPathInside is centralized in core (lib/paths) for reuse by targeting etc.
303
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @fileoverview Plugin system barrel export
3
+ *
4
+ * Public API for plugin discovery and the kernel-level plugin types.
5
+ * The generic plugin loader lives here too — tools (fitness, sim) plug
6
+ * a domain-specific registerExports callback in. Tool-specific
7
+ * discovery helpers (check-package-discovery, scenario-package-
8
+ * discovery) still live with the tool that owns them.
9
+ */
10
+ export { discoverPlugins, readProjectPluginsList } from './discover.js';
11
+ export { loadPlugin, loadAllPlugins } from './loader.js';
12
+ export type { RegisterCtx, RegisteredCounts, RegisterExportsFn } from './loader.js';
13
+ export { resolvePackageEntryPoint } from './package-entry.js';
14
+ export { VALID_NPM_SCOPE_REGEX, resolveScopes } from './scope-validation.js';
15
+ export type { PackageEntryResolution } from './package-entry.js';
16
+ export { discoverToolPackages, discoverToolPackagesFromAnchors, readToolPackageMetadata, } from './tool-package-discovery.js';
17
+ export type { ToolPackageDiscoveryOptions, ToolDiscoverySource, DiscoveredToolPackage, ToolPackageMetadata, } from './tool-package-discovery.js';
18
+ export { isRecord, isStringArray } from './json-guards.js';
19
+ export { discoverPackagesByMarker, discoverPackagesByDeclaredKind, discoverPackagesInNodeModules, isMarkerKind, readMarkerKind, readDeclaredKind, MARKER_KINDS, } from './marker-discovery.js';
20
+ export type { DiscoveredDeclaredPackage } from './marker-discovery.js';
21
+ export { discoverCapabilityContributions } from './capability-discovery.js';
22
+ export type { CapabilityDiscoveryPreferences, RawCapabilityContribution, CapabilityDiscoveryDiagnostic, DiscoverCapabilityContributionsOptions, } from './capability-discovery.js';
23
+ export { discoverScopedPackages, hasPackageJson, resolvePackageDir } from './node-modules-walk.js';
24
+ export type { DiscoveredScopedPackage, DiscoverScopedPackagesOptions, } from './node-modules-walk.js';
25
+ export type { MarkerKind, MarkerDiscoveryOptions, DiscoveredMarkerPackage, } from './marker-discovery.js';
26
+ export { loadToolManifest, admitTool, PROJECT_LOCAL_MANIFEST_FILE } from './manifest-loader.js';
27
+ export type { AdmissionResult } from './manifest-loader.js';
28
+ export { discoverAuthoredToolSidecars } from './authored-tool-discovery.js';
29
+ export type { AuthoredToolCandidate } from './authored-tool-discovery.js';
30
+ export { CapabilityRegistry, createCapabilityRegistry, currentCapabilityRegistry, registerCapabilityDomainsFromManifest, } from './capability-registry.js';
31
+ export type { CapabilityRegistrar } from './capability-registry.js';
32
+ export { loadCapabilityDomain } from './capability-loader.js';
33
+ export type { LoadCapabilityDomainOptions } from './capability-loader.js';
34
+ export { registerRecipesFromMod } from './recipe-loader.js';
35
+ export type { RegisterRecipesOptions, RegisterRecipesResult } from './recipe-loader.js';
36
+ export type { PluginLayout, DiscoveredPlugin, LoadedPlugin, PluginLoadResult, LangPluginExports, PluginExports, } from './types.js';
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAIrC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAIvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAC5E,YAAY,EACV,8BAA8B,EAC9B,yBAAyB,EACzB,6BAA6B,EAC7B,sCAAsC,GACvC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACnG,YAAY,EACV,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,UAAU,EACV,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,qCAAqC,GACtC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACxF,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview Plugin system barrel export
3
+ *
4
+ * Public API for plugin discovery and the kernel-level plugin types.
5
+ * The generic plugin loader lives here too — tools (fitness, sim) plug
6
+ * a domain-specific registerExports callback in. Tool-specific
7
+ * discovery helpers (check-package-discovery, scenario-package-
8
+ * discovery) still live with the tool that owns them.
9
+ */
10
+ export { discoverPlugins, readProjectPluginsList } from './discover.js';
11
+ export { loadPlugin, loadAllPlugins } from './loader.js';
12
+ export { resolvePackageEntryPoint } from './package-entry.js';
13
+ export { VALID_NPM_SCOPE_REGEX, resolveScopes } from './scope-validation.js';
14
+ export { discoverToolPackages, discoverToolPackagesFromAnchors, readToolPackageMetadata, } from './tool-package-discovery.js';
15
+ // Universal JSON-value guards shared by the manifest loader, the discovery
16
+ // normalizer, and the config-layer preference resolver (one definition, no
17
+ // cross-package duplicated bodies).
18
+ export { isRecord, isStringArray } from './json-guards.js';
19
+ export { discoverPackagesByMarker, discoverPackagesByDeclaredKind, discoverPackagesInNodeModules, isMarkerKind, readMarkerKind, readDeclaredKind, MARKER_KINDS, } from './marker-discovery.js';
20
+ // The generic capability-contribution discovery substrate (§5.3): one walker
21
+ // over marker + name-pattern modes that the host registry drives, replacing the
22
+ // three bespoke per-tool loaders. Yields raw contributions for routing.
23
+ export { discoverCapabilityContributions } from './capability-discovery.js';
24
+ export { discoverScopedPackages, hasPackageJson, resolvePackageDir } from './node-modules-walk.js';
25
+ export { loadToolManifest, admitTool, PROJECT_LOCAL_MANIFEST_FILE } from './manifest-loader.js';
26
+ // Authored-Tool sidecar discovery: a source-agnostic walk over a single
27
+ // authored `tools/` root that returns sidecar-bearing candidate dirs. The
28
+ // host assigns the ToolSource per root (project vs user-global).
29
+ export { discoverAuthoredToolSidecars } from './authored-tool-discovery.js';
30
+ // Scope-owned capability registry (launch, §5.3): the host-side
31
+ // runtime that registers manifest-declared capability domains and routes
32
+ // contributions to their owning tool's registrar. Per-RunScope — mirrors
33
+ // the simulation scenario-registry template.
34
+ export { CapabilityRegistry, createCapabilityRegistry, currentCapabilityRegistry, registerCapabilityDomainsFromManifest, } from './capability-registry.js';
35
+ // The scope-owned capability loader (§5.3, Phase 2): drives the generic
36
+ // discovery substrate for one domain and routes every contribution through
37
+ // `routeContribution` — the live conduit. Memoized per scope (fixes F1).
38
+ export { loadCapabilityDomain } from './capability-loader.js';
39
+ export { registerRecipesFromMod } from './recipe-loader.js';
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7E,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAOrC,2EAA2E;AAC3E,2EAA2E;AAC3E,oCAAoC;AACpC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,YAAY,GACb,MAAM,uBAAuB,CAAC;AAE/B,6EAA6E;AAC7E,gFAAgF;AAChF,wEAAwE;AACxE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAO5E,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAUnG,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEhG,wEAAwE;AACxE,0EAA0E;AAC1E,iEAAiE;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAE5E,gEAAgE;AAChE,yEAAyE;AACzE,yEAAyE;AACzE,6CAA6C;AAC7C,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,qCAAqC,GACtC,MAAM,0BAA0B,CAAC;AAElC,wEAAwE;AACxE,2EAA2E;AAC3E,yEAAyE;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Universal JSON-value type guards shared by the manifest loader
3
+ * and the capability-discovery normalizer. Kept tiny and dependency-free — these
4
+ * are the shallow shape checks that gate untrusted manifest JSON before it is
5
+ * read as a typed structure.
6
+ */
7
+ /** Type guard: a value is a plain `Record<string, unknown>` (object, non-null, non-array). */
8
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
9
+ /** Type guard: a value is a `readonly string[]`. */
10
+ export declare function isStringArray(value: unknown): value is readonly string[];
11
+ //# sourceMappingURL=json-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-guards.d.ts","sourceRoot":"","sources":["../../src/plugins/json-guards.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,MAAM,EAAE,CAExE"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @fileoverview Universal JSON-value type guards shared by the manifest loader
3
+ * and the capability-discovery normalizer. Kept tiny and dependency-free — these
4
+ * are the shallow shape checks that gate untrusted manifest JSON before it is
5
+ * read as a typed structure.
6
+ */
7
+ /** Type guard: a value is a plain `Record<string, unknown>` (object, non-null, non-array). */
8
+ export function isRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ /** Type guard: a value is a `readonly string[]`. */
12
+ export function isStringArray(value) {
13
+ return Array.isArray(value) && value.every((a) => typeof a === 'string');
14
+ }
15
+ //# sourceMappingURL=json-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-guards.js","sourceRoot":"","sources":["../../src/plugins/json-guards.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Generic plugin loader.
3
+ *
4
+ * Owns the machinery that's identical for every plugin domain:
5
+ *
6
+ * 1. Discover plugins for a domain (via discoverPlugins).
7
+ * 2. Dynamic-import each discovered entry point.
8
+ * 3. Hand the imported module to a domain-supplied `registerExports`
9
+ * callback that performs the actual registration (into the fitness
10
+ * check registry, the sim scenario registry, the kernel language
11
+ * registry, etc.).
12
+ * 4. Roll up per-plugin counts into a PluginLoadResult, catching and
13
+ * reporting per-plugin failures without aborting the whole batch.
14
+ *
15
+ * What we deliberately do NOT own here: the *contents* of registration.
16
+ * Each domain (fit, sim, lang) knows what shape its plugins export and
17
+ * which registry to feed; that lives with the tool that owns the
18
+ * registry. The callback receives a `RegisterCtx` so it can emit
19
+ * structured warnings without re-deriving plugin metadata.
20
+ *
21
+ * This file replaces what used to be a fit-coupled loader in
22
+ * @opensip-cli/fitness. The fitness loader is now a thin adapter
23
+ * that supplies a fit-specific registerExports callback and re-exports
24
+ * loadPlugin / loadAllPlugins with the same public signatures it had
25
+ * before, so existing callers (fit.ts) don't change.
26
+ */
27
+ import type { DiscoveredPlugin, LoadedPlugin, PluginLayout, PluginLoadResult } from './types.js';
28
+ /**
29
+ * Per-plugin context handed to a domain's `registerExports` callback.
30
+ * Lets the callback emit structured warnings (with namespace/source
31
+ * already filled in) without re-deriving plugin metadata.
32
+ */
33
+ export interface RegisterCtx {
34
+ readonly plugin: DiscoveredPlugin;
35
+ /** Emit a structured warning about a malformed plugin export. */
36
+ readonly warn: (evt: string, msg: string, fields?: Record<string, unknown>) => void;
37
+ /** Emit a structured debug event. */
38
+ readonly debug: (evt: string, fields?: Record<string, unknown>) => void;
39
+ }
40
+ /**
41
+ * Per-plugin registration counts returned from the callback — a generic
42
+ * map keyed by whatever artifact kinds the domain registers (e.g.
43
+ * `{ checks: 3, recipes: 1 }`, `{ scenarios: 2 }`, `{ adapters: 1 }`).
44
+ * The kernel carries no tool-specific counter names (ADR-0009 M2).
45
+ */
46
+ export type RegisteredCounts = Readonly<Record<string, number>>;
47
+ /**
48
+ * Callback that registers a plugin's exports into the right registries
49
+ * for its domain. Returns the per-kind counts for that plugin. Kinds a
50
+ * domain doesn't produce are simply absent from the map.
51
+ */
52
+ export type RegisterExportsFn = (mod: Record<string, unknown>, ctx: RegisterCtx) => Promise<RegisteredCounts> | RegisteredCounts;
53
+ /**
54
+ * Load a single discovered plugin: dynamic-import its entry, run the
55
+ * domain's `registerExports` callback, and wrap any thrown error so a
56
+ * single bad plugin doesn't take down the rest of the batch.
57
+ */
58
+ export declare function loadPlugin(plugin: DiscoveredPlugin, registerExports: RegisterExportsFn): Promise<LoadedPlugin>;
59
+ /**
60
+ * Discover and load every plugin for a domain. Plugins are loaded
61
+ * sequentially to keep registration order deterministic.
62
+ *
63
+ * Without `projectDir`, no plugins are discovered — there is no
64
+ * user-global fallback, by design.
65
+ */
66
+ export declare function loadAllPlugins(layout: PluginLayout, projectDir: string | undefined, registerExports: RegisterExportsFn): Promise<PluginLoadResult>;
67
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKjG;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACpF,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACzE;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAElD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,YAAY,CAAC,CA6EvB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,eAAe,EAAE,iBAAiB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
@@ -0,0 +1,137 @@
1
+ // @fitness-ignore-file performance-anti-patterns -- sequential await across discovered plugin modules preserves load order for deterministic conflict detection; bounded by installed plugin count
2
+ /**
3
+ * @fileoverview Generic plugin loader.
4
+ *
5
+ * Owns the machinery that's identical for every plugin domain:
6
+ *
7
+ * 1. Discover plugins for a domain (via discoverPlugins).
8
+ * 2. Dynamic-import each discovered entry point.
9
+ * 3. Hand the imported module to a domain-supplied `registerExports`
10
+ * callback that performs the actual registration (into the fitness
11
+ * check registry, the sim scenario registry, the kernel language
12
+ * registry, etc.).
13
+ * 4. Roll up per-plugin counts into a PluginLoadResult, catching and
14
+ * reporting per-plugin failures without aborting the whole batch.
15
+ *
16
+ * What we deliberately do NOT own here: the *contents* of registration.
17
+ * Each domain (fit, sim, lang) knows what shape its plugins export and
18
+ * which registry to feed; that lives with the tool that owns the
19
+ * registry. The callback receives a `RegisterCtx` so it can emit
20
+ * structured warnings without re-deriving plugin metadata.
21
+ *
22
+ * This file replaces what used to be a fit-coupled loader in
23
+ * @opensip-cli/fitness. The fitness loader is now a thin adapter
24
+ * that supplies a fit-specific registerExports callback and re-exports
25
+ * loadPlugin / loadAllPlugins with the same public signatures it had
26
+ * before, so existing callers (fit.ts) don't change.
27
+ */
28
+ import { pathToFileURL } from 'node:url';
29
+ import { logger } from '../lib/logger.js';
30
+ import { discoverPlugins } from './discover.js';
31
+ /** Logger module tag used by every event emitted from the generic loader. */
32
+ const MODULE_TAG = 'core:plugins';
33
+ /**
34
+ * Load a single discovered plugin: dynamic-import its entry, run the
35
+ * domain's `registerExports` callback, and wrap any thrown error so a
36
+ * single bad plugin doesn't take down the rest of the batch.
37
+ */
38
+ export async function loadPlugin(plugin, registerExports) {
39
+ const ctx = {
40
+ plugin,
41
+ warn: (evt, msg, fields) => {
42
+ logger.warn({
43
+ evt,
44
+ module: MODULE_TAG,
45
+ namespace: plugin.namespace,
46
+ source: plugin.source,
47
+ msg,
48
+ ...fields,
49
+ });
50
+ },
51
+ debug: (evt, fields) => {
52
+ logger.debug({
53
+ evt,
54
+ module: MODULE_TAG,
55
+ namespace: plugin.namespace,
56
+ source: plugin.source,
57
+ ...fields,
58
+ });
59
+ },
60
+ };
61
+ try {
62
+ const moduleUrl = pathToFileURL(plugin.entryPoint).href;
63
+ const mod = (await import(moduleUrl));
64
+ const registered = await registerExports(mod, ctx);
65
+ const nothingRegistered = Object.values(registered).every((n) => n === 0);
66
+ if (nothingRegistered) {
67
+ logger.warn({
68
+ evt: 'plugin.loader.no_exports',
69
+ module: MODULE_TAG,
70
+ namespace: plugin.namespace,
71
+ source: plugin.source,
72
+ msg: `Plugin "${plugin.namespace}" registered nothing — nothing to run.`,
73
+ });
74
+ }
75
+ logger.info({
76
+ evt: 'plugin.loader.load.success',
77
+ module: MODULE_TAG,
78
+ namespace: plugin.namespace,
79
+ source: plugin.source,
80
+ registered,
81
+ });
82
+ return {
83
+ namespace: plugin.namespace,
84
+ source: plugin.source,
85
+ type: plugin.type,
86
+ registered,
87
+ };
88
+ }
89
+ catch (error) {
90
+ const errorMsg = error instanceof Error ? error.message : String(error);
91
+ logger.warn({
92
+ evt: 'plugin.loader.load.error',
93
+ module: MODULE_TAG,
94
+ namespace: plugin.namespace,
95
+ source: plugin.source,
96
+ error: errorMsg,
97
+ err: error instanceof Error ? error : undefined,
98
+ msg: `Plugin "${plugin.namespace}" failed to load: ${errorMsg}. Continuing without this plugin.`,
99
+ });
100
+ return {
101
+ namespace: plugin.namespace,
102
+ source: plugin.source,
103
+ type: plugin.type,
104
+ registered: {},
105
+ error: errorMsg,
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Discover and load every plugin for a domain. Plugins are loaded
111
+ * sequentially to keep registration order deterministic.
112
+ *
113
+ * Without `projectDir`, no plugins are discovered — there is no
114
+ * user-global fallback, by design.
115
+ */
116
+ export async function loadAllPlugins(layout, projectDir, registerExports) {
117
+ const discovered = discoverPlugins(layout, projectDir);
118
+ const plugins = [];
119
+ const errors = [];
120
+ for (const plugin of discovered) {
121
+ const result = await loadPlugin(plugin, registerExports);
122
+ plugins.push(result);
123
+ if (result.error) {
124
+ errors.push(`${result.source}: ${result.error}`);
125
+ }
126
+ }
127
+ // Sum each plugin's per-kind counts into generic totals. No tool
128
+ // vocabulary here — whatever keys the domain reported roll up.
129
+ const totals = {};
130
+ for (const plugin of plugins) {
131
+ for (const [kind, count] of Object.entries(plugin.registered)) {
132
+ totals[kind] = (totals[kind] ?? 0) + count;
133
+ }
134
+ }
135
+ return { plugins, totals, errors };
136
+ }
137
+ //# sourceMappingURL=loader.js.map