@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,24 @@
1
+ /**
2
+ * Extract the inner `__version` (if present and valid) from an opaque tool-owned payload.
3
+ *
4
+ * This is the single canonical helper for the payload schema evolution convention.
5
+ * It is intentionally pure, tiny, and has zero knowledge of any tool's payload shape
6
+ * (FitnessSessionPayload, GraphSessionPayload, etc.). Callers in session-store and
7
+ * the individual tools use it to decide legacy projection vs. current shape.
8
+ *
9
+ * Rules (defensive, per plan hardening):
10
+ * - Only plain objects are inspected.
11
+ * - `__version` must be a positive finite number.
12
+ * - Missing, non-numeric, <=0, Infinity, NaN → undefined (treated as legacy v1 by callers).
13
+ */
14
+ export function extractPayloadVersion(payload) {
15
+ if (!payload || typeof payload !== 'object') {
16
+ return undefined;
17
+ }
18
+ const v = payload.__version;
19
+ if (typeof v === 'number' && Number.isFinite(v) && v > 0) {
20
+ return v;
21
+ }
22
+ return undefined;
23
+ }
24
+ //# sourceMappingURL=payload-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-version.js","sourceRoot":"","sources":["../../src/lib/payload-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,GAAI,OAAmC,CAAC,SAAS,CAAC;IACzD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @fileoverview Detect orphaned `opensip-cli/` subtrees between cwd
3
+ * and the discovered project root. These are fossils from pre-discovery
4
+ * runs where `opensip fit` was invoked from a subdirectory and
5
+ * silently scaffolded a phantom project tree at that subdir.
6
+ *
7
+ * Conservative: only flag directories where `opensip-cli/` contains
8
+ * EXCLUSIVELY `.runtime/` (plus optional dotfiles). Any other entry
9
+ * (a `fit/`, a `sim/`, a `opensip-cli.config.yml` at that level) is
10
+ * treated as legitimate user content and ignored — never warned about.
11
+ *
12
+ * Warn-only: returns paths. Callers print warnings to stderr but never
13
+ * auto-delete. Auto-deletion of anything called `opensip-cli/` would
14
+ * be too dangerous to do without explicit user invocation.
15
+ */
16
+ /**
17
+ * Walk every ancestor between `cwd` (inclusive) and `root` (exclusive)
18
+ * and return the list of paths that host a phantom `opensip-cli/`.
19
+ */
20
+ export declare function detectPhantomRuntimes(cwd: string, root: string): readonly string[];
21
+ //# sourceMappingURL=phantom-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phantom-detect.d.ts","sourceRoot":"","sources":["../../src/lib/phantom-detect.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;GAcG;AASH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CA0BlF"}
@@ -0,0 +1,76 @@
1
+ // @fitness-ignore-file error-handling-quality -- isPhantomDir/safeIsDirectory are filesystem probes where exception → false is the function's contract; the caller treats absence/permission errors identically to "not a phantom dir".
2
+ /**
3
+ * @fileoverview Detect orphaned `opensip-cli/` subtrees between cwd
4
+ * and the discovered project root. These are fossils from pre-discovery
5
+ * runs where `opensip fit` was invoked from a subdirectory and
6
+ * silently scaffolded a phantom project tree at that subdir.
7
+ *
8
+ * Conservative: only flag directories where `opensip-cli/` contains
9
+ * EXCLUSIVELY `.runtime/` (plus optional dotfiles). Any other entry
10
+ * (a `fit/`, a `sim/`, a `opensip-cli.config.yml` at that level) is
11
+ * treated as legitimate user content and ignored — never warned about.
12
+ *
13
+ * Warn-only: returns paths. Callers print warnings to stderr but never
14
+ * auto-delete. Auto-deletion of anything called `opensip-cli/` would
15
+ * be too dangerous to do without explicit user invocation.
16
+ */
17
+ import { readdirSync, statSync } from 'node:fs';
18
+ import { dirname, join, resolve, sep } from 'node:path';
19
+ import { logger } from './logger.js';
20
+ const MODULE_TAG = 'core:phantom-detect';
21
+ /**
22
+ * Walk every ancestor between `cwd` (inclusive) and `root` (exclusive)
23
+ * and return the list of paths that host a phantom `opensip-cli/`.
24
+ */
25
+ export function detectPhantomRuntimes(cwd, root) {
26
+ const start = resolve(cwd);
27
+ const stop = resolve(root);
28
+ if (!start.startsWith(stop + sep) && start !== stop) {
29
+ return [];
30
+ }
31
+ const phantoms = [];
32
+ let dir = start;
33
+ while (dir !== stop) {
34
+ if (isPhantomDir(dir)) {
35
+ phantoms.push(join(dir, 'opensip-cli'));
36
+ }
37
+ const parent = dirname(dir);
38
+ if (parent === dir)
39
+ break; // hit filesystem root unexpectedly
40
+ dir = parent;
41
+ }
42
+ if (phantoms.length > 0) {
43
+ logger.info({
44
+ evt: 'cli.phantom.runtime.detected',
45
+ module: MODULE_TAG,
46
+ cwd: start,
47
+ root: stop,
48
+ phantoms,
49
+ });
50
+ }
51
+ return phantoms;
52
+ }
53
+ function isPhantomDir(dir) {
54
+ const innerDir = join(dir, 'opensip-cli');
55
+ if (!safeIsDirectory(innerDir))
56
+ return false;
57
+ let entries;
58
+ try {
59
+ entries = readdirSync(innerDir);
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ // Conservative: only flag if `.runtime` is the only non-dotfile entry.
65
+ const meaningful = entries.filter((name) => !name.startsWith('.') || name === '.runtime');
66
+ return meaningful.length === 1 && meaningful[0] === '.runtime';
67
+ }
68
+ function safeIsDirectory(path) {
69
+ try {
70
+ return statSync(path).isDirectory();
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ //# sourceMappingURL=phantom-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phantom-detect.js","sourceRoot":"","sources":["../../src/lib/phantom-detect.ts"],"names":[],"mappings":"AAAA,wOAAwO;AACxO;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,IAAY;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,CAAC,mCAAmC;QAC9D,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,GAAG,EAAE,8BAA8B;YACnC,MAAM,EAAE,UAAU;YAClB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,IAAI;YACV,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;IAC1F,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;AACjE,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @fileoverview Project-context resolver.
3
+ *
4
+ * Walks up from `cwd` looking for an opensip-cli project (i.e. an
5
+ * ancestor where `resolveProjectConfigPath` would succeed). Returns a
6
+ * single `ProjectContext` carrying everything downstream consumers
7
+ * need: cwd, cwdExplicit, projectRoot, configPath, walkedUp, scope.
8
+ *
9
+ * The walker leans on `resolveProjectConfigPath` at each ancestor so
10
+ * the `package.json#opensip-cli.configPath` pointer is honored
11
+ * everywhere it works at a single directory (matches existing
12
+ * `resolveProjectConfigPath` contract).
13
+ *
14
+ * Strict `--config` semantics: when the caller passes `explicitConfigPath`
15
+ * and `resolveProjectConfigPath` rejects it at the starting ancestor,
16
+ * the resolver propagates the underlying `ValidationError` rather than
17
+ * silently walking up. Silently walking up would let `--config /typo.yml`
18
+ * land on some unrelated ancestor's config — exactly the surprise this
19
+ * module exists to prevent. Implicit ancestor discovery still swallows
20
+ * "no config at this directory" errors (that's the walking signal).
21
+ */
22
+ /** Resolved per-invocation project context — read by every downstream consumer. */
23
+ export interface ProjectContext {
24
+ /** Literal cwd at invocation (or the value of an explicit `--cwd` flag). Absolute. */
25
+ readonly cwd: string;
26
+ /** True when the user passed `--cwd` on the command line (vs Commander defaulting it). */
27
+ readonly cwdExplicit: boolean;
28
+ /**
29
+ * Resolved project root. If an ancestor has a config file, that ancestor.
30
+ * Otherwise equals `cwd` (no discovery; commands like `init` fall back to here).
31
+ */
32
+ readonly projectRoot: string;
33
+ /** Resolved config file path at `projectRoot`, or undefined when no project was found. */
34
+ readonly configPath: string | undefined;
35
+ /** Ancestor steps walked from `cwd` to `projectRoot`. 0 when cwd is the root. */
36
+ readonly walkedUp: number;
37
+ /** `'project'` iff a config was discovered; `'none'` otherwise. */
38
+ readonly scope: 'project' | 'none';
39
+ }
40
+ /** Input to {@link resolveProjectContext}: cwd plus optional overrides controlling discovery. */
41
+ export interface ResolveProjectContextInput {
42
+ /** Literal cwd or `--cwd` value. */
43
+ readonly cwd: string;
44
+ /** True when `--cwd` was passed on the command line. */
45
+ readonly cwdExplicit: boolean;
46
+ /**
47
+ * Optional `--config <path>` override. Honored at the *start* ancestor only.
48
+ * Strict: if provided and the path doesn't resolve, the resolver throws.
49
+ */
50
+ readonly explicitConfigPath?: string;
51
+ /**
52
+ * Absolute path beyond which the walker stops. Used by tests to prevent the
53
+ * walker from escaping fixture directories and finding the real repo's config
54
+ * above. Defaults to the filesystem root.
55
+ */
56
+ readonly stopAt?: string;
57
+ }
58
+ /**
59
+ * Resolve the project context for an invocation. Pure function — no side
60
+ * effects beyond debug logging.
61
+ *
62
+ * @throws {ValidationError} when `explicitConfigPath` is provided and
63
+ * `resolveProjectConfigPath` rejects it at the starting ancestor.
64
+ */
65
+ export declare function resolveProjectContext(input: ResolveProjectContextInput): ProjectContext;
66
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAYH,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;CACpC;AAED,iGAAiG;AACjG,MAAM,WAAW,0BAA0B;IACzC,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,cAAc,CAgDvF"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @fileoverview Project-context resolver.
3
+ *
4
+ * Walks up from `cwd` looking for an opensip-cli project (i.e. an
5
+ * ancestor where `resolveProjectConfigPath` would succeed). Returns a
6
+ * single `ProjectContext` carrying everything downstream consumers
7
+ * need: cwd, cwdExplicit, projectRoot, configPath, walkedUp, scope.
8
+ *
9
+ * The walker leans on `resolveProjectConfigPath` at each ancestor so
10
+ * the `package.json#opensip-cli.configPath` pointer is honored
11
+ * everywhere it works at a single directory (matches existing
12
+ * `resolveProjectConfigPath` contract).
13
+ *
14
+ * Strict `--config` semantics: when the caller passes `explicitConfigPath`
15
+ * and `resolveProjectConfigPath` rejects it at the starting ancestor,
16
+ * the resolver propagates the underlying `ValidationError` rather than
17
+ * silently walking up. Silently walking up would let `--config /typo.yml`
18
+ * land on some unrelated ancestor's config — exactly the surprise this
19
+ * module exists to prevent. Implicit ancestor discovery still swallows
20
+ * "no config at this directory" errors (that's the walking signal).
21
+ */
22
+ import { existsSync } from 'node:fs';
23
+ import { dirname, resolve } from 'node:path';
24
+ import { resolveProjectConfigPath } from '../config-resolution.js';
25
+ import { ValidationError } from './errors.js';
26
+ import { logger } from './logger.js';
27
+ const MODULE_TAG = 'core:project-context';
28
+ /**
29
+ * Resolve the project context for an invocation. Pure function — no side
30
+ * effects beyond debug logging.
31
+ *
32
+ * @throws {ValidationError} when `explicitConfigPath` is provided and
33
+ * `resolveProjectConfigPath` rejects it at the starting ancestor.
34
+ */
35
+ export function resolveProjectContext(input) {
36
+ const start = resolve(input.cwd);
37
+ const stop = input.stopAt ? resolve(input.stopAt) : null;
38
+ let dir = start;
39
+ let prev = '';
40
+ let walkedUp = 0;
41
+ while (dir !== prev) {
42
+ const explicit = walkedUp === 0 ? input.explicitConfigPath : undefined;
43
+ const configPath = tryResolveConfig(dir, explicit);
44
+ if (configPath) {
45
+ logger.debug({
46
+ evt: 'project.root.resolved',
47
+ module: MODULE_TAG,
48
+ cwd: start,
49
+ projectRoot: dir,
50
+ configPath,
51
+ walkedUp,
52
+ });
53
+ return {
54
+ cwd: start,
55
+ cwdExplicit: input.cwdExplicit,
56
+ projectRoot: dir,
57
+ configPath,
58
+ walkedUp,
59
+ scope: 'project',
60
+ };
61
+ }
62
+ if (stop && dir === stop)
63
+ break;
64
+ prev = dir;
65
+ dir = dirname(dir);
66
+ walkedUp++;
67
+ }
68
+ logger.debug({
69
+ evt: 'project.root.not-found',
70
+ module: MODULE_TAG,
71
+ cwd: start,
72
+ walkedTo: dir,
73
+ });
74
+ return {
75
+ cwd: start,
76
+ cwdExplicit: input.cwdExplicit,
77
+ projectRoot: start,
78
+ configPath: undefined,
79
+ walkedUp: 0,
80
+ scope: 'none',
81
+ };
82
+ }
83
+ /**
84
+ * Wrap `resolveProjectConfigPath` so a throw at an ancestor during
85
+ * implicit walking is just "no config here." When the caller passed
86
+ * `--config <path>`, an unresolvable path is a USER ERROR and must
87
+ * propagate — silently walking up would land on the wrong config.
88
+ */
89
+ function tryResolveConfig(dir, explicit) {
90
+ try {
91
+ const resolved = resolveProjectConfigPath(dir, explicit);
92
+ return existsSync(resolved) ? resolved : undefined;
93
+ }
94
+ catch (error) {
95
+ if (explicit !== undefined)
96
+ throw error;
97
+ // Only swallow the terminal "no config discovered at this root after all
98
+ // attempts (default + package pointer + etc.)". This allows upward walking
99
+ // when a directory simply has no OpenSIP config.
100
+ //
101
+ // Propagate other ValidationErrors, notably:
102
+ // - broken package.json#opensip-cli.configPath pointers ("points to a file that does not exist")
103
+ // - other resolution problems
104
+ // So a misconfigured pointer fails loudly instead of the walk silently
105
+ // adopting an ancestor project's config.
106
+ if (error instanceof ValidationError && /No .*? found\. Checked:/.test(error.message)) {
107
+ return undefined;
108
+ }
109
+ throw error;
110
+ }
111
+ }
112
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/lib/project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAwC1C;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC;gBACX,GAAG,EAAE,uBAAuB;gBAC5B,MAAM,EAAE,UAAU;gBAClB,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,GAAG;gBAChB,UAAU;gBACV,QAAQ;aACT,CAAC,CAAC;YACH,OAAO;gBACL,GAAG,EAAE,KAAK;gBACV,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,GAAG;gBAChB,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,SAAS;aACjB,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QAChC,IAAI,GAAG,GAAG,CAAC;QACX,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,KAAK,CAAC;QACX,GAAG,EAAE,wBAAwB;QAC7B,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,GAAG;KACd,CAAC,CAAC;IACH,OAAO;QACL,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAA4B;IACjE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,KAAK,CAAC;QACxC,yEAAyE;QACzE,2EAA2E;QAC3E,iDAAiD;QACjD,EAAE;QACF,6CAA6C;QAC7C,kGAAkG;QAClG,+BAA+B;QAC/B,uEAAuE;QACvE,yCAAyC;QACzC,IAAI,KAAK,YAAY,eAAe,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACtF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * deriveRecipeId — the one recipe-id derivation every domain shares (north-star
3
+ * §5.8, launch).
4
+ *
5
+ * Previously the three domains derived ids divergently — fitness `RCP_${name}`,
6
+ * graph `GRCP_${name}`, sim hardcoded `BSCP_default`. The format is identical
7
+ * (`<prefix>_<name>`); this hoists it so the derivation is one function, not three
8
+ * inline templates. The prefix stays per-domain (so existing ids are unchanged),
9
+ * but the scheme is shared.
10
+ */
11
+ /** Derive a recipe id as `<prefix>_<name>` (e.g. `deriveRecipeId('RCP', 'example')`). */
12
+ export declare function deriveRecipeId(prefix: string, name: string): string;
13
+ //# sourceMappingURL=recipe-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-id.d.ts","sourceRoot":"","sources":["../../src/lib/recipe-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * deriveRecipeId — the one recipe-id derivation every domain shares (north-star
3
+ * §5.8, launch).
4
+ *
5
+ * Previously the three domains derived ids divergently — fitness `RCP_${name}`,
6
+ * graph `GRCP_${name}`, sim hardcoded `BSCP_default`. The format is identical
7
+ * (`<prefix>_<name>`); this hoists it so the derivation is one function, not three
8
+ * inline templates. The prefix stays per-domain (so existing ids are unchanged),
9
+ * but the scheme is shared.
10
+ */
11
+ /** Derive a recipe id as `<prefix>_<name>` (e.g. `deriveRecipeId('RCP', 'example')`). */
12
+ export function deriveRecipeId(prefix, name) {
13
+ return `${prefix}_${name}`;
14
+ }
15
+ //# sourceMappingURL=recipe-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-id.js","sourceRoot":"","sources":["../../src/lib/recipe-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAY;IACzD,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @fileoverview Generic registry — the single base class for every
3
+ * registry in the workspace.
4
+ *
5
+ * Replaces the ten registry classes catalogued in
6
+ * `docs/plans/ready/architecture-runscope-and-registry/phase-0-audit-and-design.md`.
7
+ *
8
+ * Owns: by-id Map, by-name Map, the closed `DuplicatePolicy` branch,
9
+ * the orthogonal `nameCollisionMode` guard, and the structured-event
10
+ * emitter. Domain-specific indices (extension, alias, slug, scope)
11
+ * live in thin subclasses or alongside; the base must stay
12
+ * tool-agnostic.
13
+ */
14
+ import { type Logger } from './logger.js';
15
+ /**
16
+ * Closed union of duplicate-handling policies.
17
+ *
18
+ * - `warn-first-wins` — log warning, keep incumbent (ToolRegistry,
19
+ * LanguageRegistry, graph rules).
20
+ * - `throw` — throw `ValidationError` on duplicate id/name
21
+ * (FitnessRecipeRegistry, SimulationRecipeRegistry).
22
+ * - `overwrite` — replace incumbent silently (graph lang-adapter
23
+ * registry).
24
+ * - `silent-skip` — ignore the second registration (CheckRegistry,
25
+ * TargetRegistry, scenarios).
26
+ * - `allow-internal` — first call bypasses the guard; subsequent
27
+ * duplicates throw unless `{ internal: true }` is passed. Reserved
28
+ * for "register builtins without flag" patterns; current consumers
29
+ * use per-call `{ internal: true }` against a strict default.
30
+ */
31
+ export type DuplicatePolicy = 'warn-first-wins' | 'throw' | 'overwrite' | 'silent-skip' | 'allow-internal';
32
+ /** Minimum shape any registry item must satisfy. */
33
+ export interface Registerable {
34
+ readonly id: string;
35
+ readonly name: string;
36
+ readonly tags?: readonly string[];
37
+ }
38
+ /** Constructor options for `Registry<T>`. */
39
+ export interface RegistryOptions {
40
+ /** Human-readable module label used in structured events / errors. */
41
+ readonly module: string;
42
+ readonly duplicatePolicy: DuplicatePolicy;
43
+ /** Event prefix — events emit as `<prefix>.duplicate` etc. */
44
+ readonly evtPrefix: string;
45
+ /** Validation-error code surfaced when policy === 'throw'. */
46
+ readonly validationCode?: string;
47
+ /**
48
+ * Name-collision policy (orthogonal to `duplicatePolicy`). When set
49
+ * to `'throw'`, registering an item whose `name` is already used by
50
+ * a DIFFERENT id throws a `ValidationError`. Default `'allow'`
51
+ * falls through to `duplicatePolicy`.
52
+ */
53
+ readonly nameCollisionMode?: 'allow' | 'throw';
54
+ /** Logger override — defaults to the workspace singleton. */
55
+ readonly logger?: Logger;
56
+ }
57
+ /** Per-call options. */
58
+ export interface RegisterCallOptions {
59
+ /**
60
+ * Bypass the duplicate guard for this single call. Use for
61
+ * built-in seeding. Ignored if no duplicate condition is reached.
62
+ */
63
+ readonly internal?: boolean;
64
+ /**
65
+ * Source package id — included in structured events for
66
+ * third-party warnings.
67
+ */
68
+ readonly sourcePackage?: string;
69
+ }
70
+ /**
71
+ * Generic id+name+tag registry with a closed duplicate-handling
72
+ * policy and structured-event emission. Use composition (one
73
+ * `Registry<T>` instance per registry) or inheritance (extend
74
+ * the class) — both are supported.
75
+ */
76
+ export declare class Registry<T extends Registerable> {
77
+ private readonly byId;
78
+ private readonly byName;
79
+ private readonly module;
80
+ private readonly duplicatePolicy;
81
+ private readonly evtPrefix;
82
+ private readonly validationCode;
83
+ private readonly nameCollisionMode;
84
+ private readonly logger;
85
+ constructor(opts: RegistryOptions);
86
+ register(item: T, callOpts?: RegisterCallOptions): void;
87
+ registerAll(items: readonly T[], callOpts?: RegisterCallOptions): void;
88
+ get(idOrName: string): T | undefined;
89
+ getById(id: string): T | undefined;
90
+ getByName(name: string): T | undefined;
91
+ has(idOrName: string): boolean;
92
+ getAll(): readonly T[];
93
+ getByTag(tag: string): readonly T[];
94
+ remove(id: string): boolean;
95
+ clear(): void;
96
+ get size(): number;
97
+ }
98
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,OAAO,GACP,WAAW,GACX,aAAa,GACb,gBAAgB,CAAC;AAErB,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/C,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAwB;AACxB,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,IAAI,EAAE,eAAe;IAgBjC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAE,mBAAwB,GAAG,IAAI;IAoF3D,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAE,mBAAwB,GAAG,IAAI;IAI1E,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIlC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAItC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B,MAAM,IAAI,SAAS,CAAC,EAAE;IAItB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE;IAInC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ3B,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,152 @@
1
+ // @fitness-ignore-file toctou-race-condition -- registry register() reads byName.get then byName.set on local Maps owned by the Registry instance; entirely synchronous, no async gap, safe in single-threaded Node.js
2
+ /**
3
+ * @fileoverview Generic registry — the single base class for every
4
+ * registry in the workspace.
5
+ *
6
+ * Replaces the ten registry classes catalogued in
7
+ * `docs/plans/ready/architecture-runscope-and-registry/phase-0-audit-and-design.md`.
8
+ *
9
+ * Owns: by-id Map, by-name Map, the closed `DuplicatePolicy` branch,
10
+ * the orthogonal `nameCollisionMode` guard, and the structured-event
11
+ * emitter. Domain-specific indices (extension, alias, slug, scope)
12
+ * live in thin subclasses or alongside; the base must stay
13
+ * tool-agnostic.
14
+ */
15
+ import { ValidationError } from './errors.js';
16
+ import { logger as defaultLogger } from './logger.js';
17
+ /**
18
+ * Generic id+name+tag registry with a closed duplicate-handling
19
+ * policy and structured-event emission. Use composition (one
20
+ * `Registry<T>` instance per registry) or inheritance (extend
21
+ * the class) — both are supported.
22
+ */
23
+ export class Registry {
24
+ byId = new Map();
25
+ byName = new Map();
26
+ module;
27
+ duplicatePolicy;
28
+ evtPrefix;
29
+ validationCode;
30
+ nameCollisionMode;
31
+ logger;
32
+ constructor(opts) {
33
+ this.module = opts.module;
34
+ this.duplicatePolicy = opts.duplicatePolicy;
35
+ this.evtPrefix = opts.evtPrefix;
36
+ this.validationCode = opts.validationCode;
37
+ this.nameCollisionMode = opts.nameCollisionMode ?? 'allow';
38
+ this.logger = opts.logger ?? defaultLogger;
39
+ }
40
+ // register() centralizes the five DuplicatePolicy branches + orthogonal nameCollisionMode
41
+ // guard + internal bypass. The switch + nested ifs for the "exact same item" allow-internal
42
+ // fast-path and overwrite cleanup produce inherent branching complexity (19). It is the
43
+ // single implementation of the registry contract used by *all* registries in the system;
44
+ // extracting sub-fns would fragment the policy table that must be reviewed as a unit for
45
+ // ADR-0023/ADR-0037/etc. correctness. Disable scoped to this method only.
46
+ /* eslint-disable sonarjs/cognitive-complexity -- single registry contract: DuplicatePolicy table and nameCollision guard reviewed as a unit (rationale above) */
47
+ register(item, callOpts = {}) {
48
+ const { byId, byName } = this;
49
+ const internal = callOpts.internal === true;
50
+ // Name-collision guard (orthogonal to duplicate policy). Only
51
+ // fires when the incumbent has a DIFFERENT id from `item.id`
52
+ // (same-id same-name is handled by the duplicate-policy branch).
53
+ const nameIncumbent = byName.get(item.name);
54
+ if (nameIncumbent &&
55
+ nameIncumbent.id !== item.id &&
56
+ this.nameCollisionMode === 'throw' &&
57
+ !internal) {
58
+ // @fitness-ignore-next-line result-pattern-consistency -- registration guard, throw is appropriate
59
+ throw new ValidationError(`${this.module} registry: name collision — '${item.name}' is already registered with id '${nameIncumbent.id}', cannot register id '${item.id}' with the same name`, { code: this.validationCode ?? 'VALIDATION.REGISTRY.NAME_COLLISION' });
60
+ }
61
+ // Duplicate-condition detection: same id, OR same name with a
62
+ // different id (regardless of nameCollisionMode, because we
63
+ // can't have two entries sharing the byName slot).
64
+ const idIncumbent = byId.get(item.id);
65
+ const isDup = idIncumbent !== undefined || (nameIncumbent !== undefined && nameIncumbent.id !== item.id);
66
+ if (isDup && !internal) {
67
+ switch (this.duplicatePolicy) {
68
+ case 'silent-skip': {
69
+ return;
70
+ }
71
+ case 'warn-first-wins': {
72
+ this.logger.warn({
73
+ evt: `${this.evtPrefix}.duplicate`,
74
+ module: this.module,
75
+ id: item.id,
76
+ name: item.name,
77
+ sourcePackage: callOpts.sourcePackage,
78
+ msg: `${item.id} already registered — keeping incumbent`,
79
+ });
80
+ return;
81
+ }
82
+ case 'throw': {
83
+ // @fitness-ignore-next-line result-pattern-consistency -- registration guard, throw is appropriate
84
+ throw new ValidationError(`${this.module}: '${item.name}' (${item.id}) already registered`, { code: this.validationCode ?? 'VALIDATION.REGISTRY.DUPLICATE' });
85
+ }
86
+ case 'overwrite': {
87
+ // Drop stale mappings before re-insert so {byId, byName}
88
+ // stay consistent (e.g. overwrite-by-id when the new
89
+ // entry has a different name).
90
+ if (idIncumbent && idIncumbent.name !== item.name) {
91
+ byName.delete(idIncumbent.name);
92
+ }
93
+ if (nameIncumbent && nameIncumbent.id !== item.id) {
94
+ byId.delete(nameIncumbent.id);
95
+ }
96
+ break;
97
+ }
98
+ case 'allow-internal': {
99
+ // First non-internal write was allowed. Subsequent duplicates throw unless { internal: true }.
100
+ // Harden for idempotent re-registers (tests, reloads): if the exact same item (id+name), allow silently.
101
+ const existing = idIncumbent ?? nameIncumbent;
102
+ if (existing && existing.id === item.id && existing.name === item.name) {
103
+ return;
104
+ }
105
+ // @fitness-ignore-next-line result-pattern-consistency -- registration guard, throw is appropriate
106
+ throw new ValidationError(`${this.module}: '${item.name}' (${item.id}) already registered (allow-internal: only the first write is permitted without { internal: true })`, { code: this.validationCode ?? 'VALIDATION.REGISTRY.DUPLICATE' });
107
+ }
108
+ }
109
+ }
110
+ byId.set(item.id, item);
111
+ byName.set(item.name, item);
112
+ }
113
+ /* eslint-enable sonarjs/cognitive-complexity */
114
+ registerAll(items, callOpts = {}) {
115
+ for (const item of items)
116
+ this.register(item, callOpts);
117
+ }
118
+ get(idOrName) {
119
+ return this.byId.get(idOrName) ?? this.byName.get(idOrName);
120
+ }
121
+ getById(id) {
122
+ return this.byId.get(id);
123
+ }
124
+ getByName(name) {
125
+ return this.byName.get(name);
126
+ }
127
+ has(idOrName) {
128
+ return this.byId.has(idOrName) || this.byName.has(idOrName);
129
+ }
130
+ getAll() {
131
+ return [...this.byId.values()];
132
+ }
133
+ getByTag(tag) {
134
+ return this.getAll().filter((item) => item.tags?.includes(tag));
135
+ }
136
+ remove(id) {
137
+ const item = this.byId.get(id);
138
+ if (!item)
139
+ return false;
140
+ this.byId.delete(id);
141
+ this.byName.delete(item.name);
142
+ return true;
143
+ }
144
+ clear() {
145
+ this.byId.clear();
146
+ this.byName.clear();
147
+ }
148
+ get size() {
149
+ return this.byId.size;
150
+ }
151
+ }
152
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AAAA,uNAAuN;AACvN;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,aAAa,EAAe,MAAM,aAAa,CAAC;AAkEnE;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACF,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IAC9B,MAAM,CAAS;IACf,eAAe,CAAkB;IACjC,SAAS,CAAS;IAClB,cAAc,CAAqB;IACnC,iBAAiB,CAAoB;IACrC,MAAM,CAAS;IAEhC,YAAY,IAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAC7C,CAAC;IAED,0FAA0F;IAC1F,4FAA4F;IAC5F,wFAAwF;IACxF,yFAAyF;IACzF,yFAAyF;IACzF,0EAA0E;IAC1E,iKAAiK;IACjK,QAAQ,CAAC,IAAO,EAAE,WAAgC,EAAE;QAClD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;QAE5C,8DAA8D;QAC9D,6DAA6D;QAC7D,iEAAiE;QACjE,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IACE,aAAa;YACb,aAAa,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YAC5B,IAAI,CAAC,iBAAiB,KAAK,OAAO;YAClC,CAAC,QAAQ,EACT,CAAC;YACD,mGAAmG;YACnG,MAAM,IAAI,eAAe,CACvB,GAAG,IAAI,CAAC,MAAM,gCAAgC,IAAI,CAAC,IAAI,oCAAoC,aAAa,CAAC,EAAE,0BAA0B,IAAI,CAAC,EAAE,sBAAsB,EAClK,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,oCAAoC,EAAE,CACtE,CAAC;QACJ,CAAC;QAED,8DAA8D;QAC9D,4DAA4D;QAC5D,mDAAmD;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,KAAK,GACT,WAAW,KAAK,SAAS,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QAE7F,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,QAAQ,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC7B,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,OAAO;gBACT,CAAC;gBACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACf,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,YAAY;wBAClC,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,aAAa,EAAE,QAAQ,CAAC,aAAa;wBACrC,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,yCAAyC;qBACzD,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,mGAAmG;oBACnG,MAAM,IAAI,eAAe,CACvB,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,sBAAsB,EAChE,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,+BAA+B,EAAE,CACjE,CAAC;gBACJ,CAAC;gBACD,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,yDAAyD;oBACzD,qDAAqD;oBACrD,+BAA+B;oBAC/B,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBAClD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;oBACD,IAAI,aAAa,IAAI,aAAa,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;wBAClD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;oBAChC,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,+FAA+F;oBAC/F,yGAAyG;oBACzG,MAAM,QAAQ,GAAG,WAAW,IAAI,aAAa,CAAC;oBAC9C,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;wBACvE,OAAO;oBACT,CAAC;oBACD,mGAAmG;oBACnG,MAAM,IAAI,eAAe,CACvB,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,qGAAqG,EAC/I,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,+BAA+B,EAAE,CACjE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,gDAAgD;IAEhD,WAAW,CAAC,KAAmB,EAAE,WAAgC,EAAE;QACjE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF"}