opkg 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/.claude/agents/code-reviewer.md +171 -0
  2. package/.claude/commands/commit-push-pr.md +20 -0
  3. package/.claude/commands/{specs/read.md → read-specs.md} +1 -1
  4. package/.claude/commands/{specs/update.md → update-specs.md} +4 -0
  5. package/.claude/skills/code-review-excellence/SKILL.md +538 -0
  6. package/README.md +2 -2
  7. package/package.json +3 -1
  8. package/packages/cli/dist/add-IJAPFHIX.js +624 -0
  9. package/packages/cli/dist/add-IJAPFHIX.js.map +7 -0
  10. package/packages/cli/dist/add-LLUNFLJI.js +624 -0
  11. package/packages/cli/dist/add-LLUNFLJI.js.map +7 -0
  12. package/packages/cli/dist/add-U44SL3OR.js +624 -0
  13. package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
  14. package/packages/cli/dist/chunk-23VBP5L6.js +371 -0
  15. package/packages/cli/dist/chunk-23VBP5L6.js.map +7 -0
  16. package/packages/cli/dist/chunk-2SVHLF5C.js +1419 -0
  17. package/packages/cli/dist/chunk-2SVHLF5C.js.map +7 -0
  18. package/packages/cli/dist/chunk-37256POU.js +99 -0
  19. package/packages/cli/dist/chunk-37256POU.js.map +7 -0
  20. package/packages/cli/dist/chunk-3PZRVA6O.js +196 -0
  21. package/packages/cli/dist/chunk-3PZRVA6O.js.map +7 -0
  22. package/packages/cli/dist/chunk-427DCURL.js +155 -0
  23. package/packages/cli/dist/chunk-427DCURL.js.map +7 -0
  24. package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
  25. package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
  26. package/packages/cli/dist/chunk-4OWT3YEG.js +413 -0
  27. package/packages/cli/dist/chunk-4OWT3YEG.js.map +7 -0
  28. package/packages/cli/dist/chunk-4RIBTBXI.js +568 -0
  29. package/packages/cli/dist/chunk-4RIBTBXI.js.map +7 -0
  30. package/packages/cli/dist/chunk-4X2EJHJN.js +63 -0
  31. package/packages/cli/dist/chunk-4X2EJHJN.js.map +7 -0
  32. package/packages/cli/dist/chunk-6CYW66HD.js +1136 -0
  33. package/packages/cli/dist/chunk-6CYW66HD.js.map +7 -0
  34. package/packages/cli/dist/chunk-6DITYAFA.js +172 -0
  35. package/packages/cli/dist/chunk-6DITYAFA.js.map +7 -0
  36. package/packages/cli/dist/chunk-7KEAKEVZ.js +568 -0
  37. package/packages/cli/dist/chunk-7KEAKEVZ.js.map +7 -0
  38. package/packages/cli/dist/chunk-ABFUD25D.js +61 -0
  39. package/packages/cli/dist/chunk-ABFUD25D.js.map +7 -0
  40. package/packages/cli/dist/chunk-AR7GJCG6.js +274 -0
  41. package/packages/cli/dist/chunk-AR7GJCG6.js.map +7 -0
  42. package/packages/cli/dist/chunk-AYTGQCXH.js +86 -0
  43. package/packages/cli/dist/chunk-AYTGQCXH.js.map +7 -0
  44. package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
  45. package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
  46. package/packages/cli/dist/chunk-BVVSU7QD.js +23 -0
  47. package/packages/cli/dist/chunk-BVVSU7QD.js.map +7 -0
  48. package/packages/cli/dist/chunk-C6FY55UP.js +108 -0
  49. package/packages/cli/dist/chunk-C6FY55UP.js.map +7 -0
  50. package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
  51. package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
  52. package/packages/cli/dist/chunk-D3O7LY2Q.js +1151 -0
  53. package/packages/cli/dist/chunk-D3O7LY2Q.js.map +7 -0
  54. package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
  55. package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
  56. package/packages/cli/dist/chunk-DEC24S7E.js +186 -0
  57. package/packages/cli/dist/chunk-DEC24S7E.js.map +7 -0
  58. package/packages/cli/dist/chunk-FMVVJH5M.js +371 -0
  59. package/packages/cli/dist/chunk-FMVVJH5M.js.map +7 -0
  60. package/packages/cli/dist/chunk-GDVFS3YP.js +130 -0
  61. package/packages/cli/dist/chunk-GDVFS3YP.js.map +7 -0
  62. package/packages/cli/dist/chunk-GEP2G5HF.js +31 -0
  63. package/packages/cli/dist/chunk-GEP2G5HF.js.map +7 -0
  64. package/packages/cli/dist/chunk-GSWHZBT2.js +62 -0
  65. package/packages/cli/dist/chunk-GSWHZBT2.js.map +7 -0
  66. package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
  67. package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
  68. package/packages/cli/dist/chunk-HYKYECAE.js +222 -0
  69. package/packages/cli/dist/chunk-HYKYECAE.js.map +7 -0
  70. package/packages/cli/dist/chunk-I7FEAHB4.js +100 -0
  71. package/packages/cli/dist/chunk-I7FEAHB4.js.map +7 -0
  72. package/packages/cli/dist/chunk-IHVZ5AUJ.js +107 -0
  73. package/packages/cli/dist/chunk-IHVZ5AUJ.js.map +7 -0
  74. package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
  75. package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
  76. package/packages/cli/dist/chunk-L5GRJQBS.js +32 -0
  77. package/packages/cli/dist/chunk-L5GRJQBS.js.map +7 -0
  78. package/packages/cli/dist/chunk-LHEAUDJL.js +302 -0
  79. package/packages/cli/dist/chunk-LHEAUDJL.js.map +7 -0
  80. package/packages/cli/dist/chunk-MIURCESJ.js +48 -0
  81. package/packages/cli/dist/chunk-MIURCESJ.js.map +7 -0
  82. package/packages/cli/dist/chunk-N43IXOND.js +732 -0
  83. package/packages/cli/dist/chunk-N43IXOND.js.map +7 -0
  84. package/packages/cli/dist/chunk-OUZRMGPV.js +274 -0
  85. package/packages/cli/dist/chunk-OUZRMGPV.js.map +7 -0
  86. package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
  87. package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
  88. package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
  89. package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
  90. package/packages/cli/dist/chunk-RAKMX654.js +631 -0
  91. package/packages/cli/dist/chunk-RAKMX654.js.map +7 -0
  92. package/packages/cli/dist/chunk-RSFLK2TP.js +195 -0
  93. package/packages/cli/dist/chunk-RSFLK2TP.js.map +7 -0
  94. package/packages/cli/dist/chunk-S26PR2BS.js +99 -0
  95. package/packages/cli/dist/chunk-S26PR2BS.js.map +7 -0
  96. package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
  97. package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
  98. package/packages/cli/dist/chunk-VKM6K5TN.js +413 -0
  99. package/packages/cli/dist/chunk-VKM6K5TN.js.map +7 -0
  100. package/packages/cli/dist/chunk-VKNJG4JN.js +253 -0
  101. package/packages/cli/dist/chunk-VKNJG4JN.js.map +7 -0
  102. package/packages/cli/dist/chunk-VQ2KY6CK.js +113 -0
  103. package/packages/cli/dist/chunk-VQ2KY6CK.js.map +7 -0
  104. package/packages/cli/dist/chunk-VQDTXLOX.js +1312 -0
  105. package/packages/cli/dist/chunk-VQDTXLOX.js.map +7 -0
  106. package/packages/cli/dist/chunk-VXNS3X5O.js +60 -0
  107. package/packages/cli/dist/chunk-VXNS3X5O.js.map +7 -0
  108. package/packages/cli/dist/chunk-WF7H2YDU.js +376 -0
  109. package/packages/cli/dist/chunk-WF7H2YDU.js.map +7 -0
  110. package/packages/cli/dist/chunk-WNRXZLWW.js +266 -0
  111. package/packages/cli/dist/chunk-WNRXZLWW.js.map +7 -0
  112. package/packages/cli/dist/chunk-WT4VVCXM.js +1121 -0
  113. package/packages/cli/dist/chunk-WT4VVCXM.js.map +7 -0
  114. package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
  115. package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
  116. package/packages/cli/dist/configure-D722JQOD.js +107 -0
  117. package/packages/cli/dist/configure-D722JQOD.js.map +7 -0
  118. package/packages/cli/dist/configure-IU5H7XD6.js +107 -0
  119. package/packages/cli/dist/configure-IU5H7XD6.js.map +7 -0
  120. package/packages/cli/dist/file-format-detector-PXCIAKTK.js +22 -0
  121. package/packages/cli/dist/file-format-detector-PXCIAKTK.js.map +7 -0
  122. package/packages/cli/dist/index.js +17 -17
  123. package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
  124. package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
  125. package/packages/cli/dist/install-F5ANFUBX.js +7577 -0
  126. package/packages/cli/dist/install-F5ANFUBX.js.map +7 -0
  127. package/packages/cli/dist/install-JSXEPPC2.js +7104 -0
  128. package/packages/cli/dist/install-JSXEPPC2.js.map +7 -0
  129. package/packages/cli/dist/install-QHEBX7JH.js +7101 -0
  130. package/packages/cli/dist/install-QHEBX7JH.js.map +7 -0
  131. package/packages/cli/dist/list-DMOUATYI.js +327 -0
  132. package/packages/cli/dist/list-DMOUATYI.js.map +7 -0
  133. package/packages/cli/dist/list-UESSCB7Y.js +327 -0
  134. package/packages/cli/dist/list-UESSCB7Y.js.map +7 -0
  135. package/packages/cli/dist/list-XR7RSJFS.js +327 -0
  136. package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
  137. package/packages/cli/dist/login-EYZ2SOYZ.js +150 -0
  138. package/packages/cli/dist/login-EYZ2SOYZ.js.map +7 -0
  139. package/packages/cli/dist/login-JWCSTAEU.js +150 -0
  140. package/packages/cli/dist/login-JWCSTAEU.js.map +7 -0
  141. package/packages/cli/dist/login-NRKHXZKM.js +150 -0
  142. package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
  143. package/packages/cli/dist/logout-HDMYRXIE.js +40 -0
  144. package/packages/cli/dist/logout-HDMYRXIE.js.map +7 -0
  145. package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
  146. package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
  147. package/packages/cli/dist/logout-X3XUUOH5.js +40 -0
  148. package/packages/cli/dist/logout-X3XUUOH5.js.map +7 -0
  149. package/packages/cli/dist/new-3LTFKDTQ.js +277 -0
  150. package/packages/cli/dist/new-3LTFKDTQ.js.map +7 -0
  151. package/packages/cli/dist/new-F46OSD72.js +277 -0
  152. package/packages/cli/dist/new-F46OSD72.js.map +7 -0
  153. package/packages/cli/dist/new-OPCCLNL2.js +277 -0
  154. package/packages/cli/dist/new-OPCCLNL2.js.map +7 -0
  155. package/packages/cli/dist/package-marker-detector-T5O5YD2E.js +80 -0
  156. package/packages/cli/dist/package-marker-detector-T5O5YD2E.js.map +7 -0
  157. package/packages/cli/dist/package-yml-QWZIJDYU.js +16 -0
  158. package/packages/cli/dist/package-yml-QWZIJDYU.js.map +7 -0
  159. package/packages/cli/dist/plugin-naming-YP2I4NPA.js +29 -0
  160. package/packages/cli/dist/plugin-naming-YP2I4NPA.js.map +7 -0
  161. package/packages/cli/dist/publish-4H43PCSG.js +619 -0
  162. package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
  163. package/packages/cli/dist/publish-RULKLNUX.js +619 -0
  164. package/packages/cli/dist/publish-RULKLNUX.js.map +7 -0
  165. package/packages/cli/dist/publish-URWY2P3E.js +619 -0
  166. package/packages/cli/dist/publish-URWY2P3E.js.map +7 -0
  167. package/packages/cli/dist/remove-BD52BHR2.js +542 -0
  168. package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
  169. package/packages/cli/dist/remove-G5NRC7LD.js +542 -0
  170. package/packages/cli/dist/remove-G5NRC7LD.js.map +7 -0
  171. package/packages/cli/dist/remove-TC3FQUYQ.js +542 -0
  172. package/packages/cli/dist/remove-TC3FQUYQ.js.map +7 -0
  173. package/packages/cli/dist/resource-discoverer-4X4RY43E.js +17 -0
  174. package/packages/cli/dist/resource-discoverer-4X4RY43E.js.map +7 -0
  175. package/packages/cli/dist/save-24TESYKI.js +1728 -0
  176. package/packages/cli/dist/save-24TESYKI.js.map +7 -0
  177. package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
  178. package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
  179. package/packages/cli/dist/save-P2U67DTV.js +1728 -0
  180. package/packages/cli/dist/save-P2U67DTV.js.map +7 -0
  181. package/packages/cli/dist/search-ABROK3UO.js +157 -0
  182. package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
  183. package/packages/cli/dist/search-WVFXFNAV.js +157 -0
  184. package/packages/cli/dist/search-WVFXFNAV.js.map +7 -0
  185. package/packages/cli/dist/search-YQN2Q2SO.js +157 -0
  186. package/packages/cli/dist/search-YQN2Q2SO.js.map +7 -0
  187. package/packages/cli/dist/set-DCWF73F6.js +251 -0
  188. package/packages/cli/dist/set-DCWF73F6.js.map +7 -0
  189. package/packages/cli/dist/set-GJEG2F6Y.js +251 -0
  190. package/packages/cli/dist/set-GJEG2F6Y.js.map +7 -0
  191. package/packages/cli/dist/set-NGM2FIKF.js +251 -0
  192. package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
  193. package/packages/cli/dist/uninstall-3CJQMTYH.js +539 -0
  194. package/packages/cli/dist/uninstall-3CJQMTYH.js.map +7 -0
  195. package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
  196. package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
  197. package/packages/cli/dist/uninstall-QU5OMEEC.js +539 -0
  198. package/packages/cli/dist/uninstall-QU5OMEEC.js.map +7 -0
  199. package/packages/cli/dist/unpublish-GHJQYC4S.js +245 -0
  200. package/packages/cli/dist/unpublish-GHJQYC4S.js.map +7 -0
  201. package/packages/cli/dist/unpublish-L2CYMK4B.js +245 -0
  202. package/packages/cli/dist/unpublish-L2CYMK4B.js.map +7 -0
  203. package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
  204. package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
  205. package/packages/cli/dist/view-MXRBMXOG.js +488 -0
  206. package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
  207. package/packages/cli/dist/view-NMND7SAW.js +488 -0
  208. package/packages/cli/dist/view-NMND7SAW.js.map +7 -0
  209. package/packages/cli/dist/view-RPQRDSYB.js +488 -0
  210. package/packages/cli/dist/view-RPQRDSYB.js.map +7 -0
  211. package/packages/cli/package.json +2 -0
  212. package/packages/core/dist/constants/index.d.ts +9 -0
  213. package/packages/core/dist/constants/index.d.ts.map +1 -1
  214. package/packages/core/dist/constants/index.js +12 -0
  215. package/packages/core/dist/constants/index.js.map +1 -1
  216. package/packages/core/dist/core/dependency-resolver/index.d.ts +2 -10
  217. package/packages/core/dist/core/dependency-resolver/index.d.ts.map +1 -1
  218. package/packages/core/dist/core/dependency-resolver/index.js +3 -14
  219. package/packages/core/dist/core/dependency-resolver/index.js.map +1 -1
  220. package/packages/core/dist/core/install/base-detector.d.ts +2 -1
  221. package/packages/core/dist/core/install/base-detector.d.ts.map +1 -1
  222. package/packages/core/dist/core/install/base-detector.js +54 -1
  223. package/packages/core/dist/core/install/base-detector.js.map +1 -1
  224. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +7 -5
  225. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
  226. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +25 -9
  227. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
  228. package/packages/core/dist/core/install/flow-index-installer.d.ts +2 -1
  229. package/packages/core/dist/core/install/flow-index-installer.d.ts.map +1 -1
  230. package/packages/core/dist/core/install/flow-index-installer.js +19 -4
  231. package/packages/core/dist/core/install/flow-index-installer.js.map +1 -1
  232. package/packages/core/dist/core/install/input-classifier-base.js +3 -3
  233. package/packages/core/dist/core/install/input-classifier-base.js.map +1 -1
  234. package/packages/core/dist/core/install/install-reporting.d.ts.map +1 -1
  235. package/packages/core/dist/core/install/install-reporting.js +7 -9
  236. package/packages/core/dist/core/install/install-reporting.js.map +1 -1
  237. package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
  238. package/packages/core/dist/core/install/list-handler.js +3 -0
  239. package/packages/core/dist/core/install/list-handler.js.map +1 -1
  240. package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
  241. package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
  242. package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
  243. package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
  244. package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
  245. package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
  246. package/packages/core/dist/core/install/operations/installation-executor.d.ts +3 -0
  247. package/packages/core/dist/core/install/operations/installation-executor.d.ts.map +1 -1
  248. package/packages/core/dist/core/install/operations/installation-executor.js +39 -22
  249. package/packages/core/dist/core/install/operations/installation-executor.js.map +1 -1
  250. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts +7 -3
  251. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
  252. package/packages/core/dist/core/install/orchestrator/orchestrator.js +193 -93
  253. package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
  254. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
  255. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
  256. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
  257. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
  258. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
  259. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
  260. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
  261. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
  262. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
  263. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
  264. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
  265. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
  266. package/packages/core/dist/core/install/orchestrator/types.d.ts +2 -0
  267. package/packages/core/dist/core/install/orchestrator/types.d.ts.map +1 -1
  268. package/packages/core/dist/core/install/path-package-loader.d.ts.map +1 -1
  269. package/packages/core/dist/core/install/path-package-loader.js +20 -1
  270. package/packages/core/dist/core/install/path-package-loader.js.map +1 -1
  271. package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
  272. package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
  273. package/packages/core/dist/core/install/platform-resolution.js +5 -2
  274. package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
  275. package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
  276. package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
  277. package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
  278. package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
  279. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
  280. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
  281. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
  282. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
  283. package/packages/core/dist/core/install/sources/git-source.d.ts.map +1 -1
  284. package/packages/core/dist/core/install/sources/git-source.js +67 -4
  285. package/packages/core/dist/core/install/sources/git-source.js.map +1 -1
  286. package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
  287. package/packages/core/dist/core/install/sources/path-source.js +8 -0
  288. package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
  289. package/packages/core/dist/core/install/strategies/flow-based-strategy.d.ts.map +1 -1
  290. package/packages/core/dist/core/install/strategies/flow-based-strategy.js +12 -5
  291. package/packages/core/dist/core/install/strategies/flow-based-strategy.js.map +1 -1
  292. package/packages/core/dist/core/install/strategies/types.d.ts +11 -1
  293. package/packages/core/dist/core/install/strategies/types.d.ts.map +1 -1
  294. package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
  295. package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
  296. package/packages/core/dist/core/install/unified/context-builders.js +12 -0
  297. package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
  298. package/packages/core/dist/core/install/unified/context-helpers.d.ts +0 -4
  299. package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
  300. package/packages/core/dist/core/install/unified/context-helpers.js +0 -24
  301. package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
  302. package/packages/core/dist/core/install/unified/index.d.ts +1 -1
  303. package/packages/core/dist/core/install/unified/index.d.ts.map +1 -1
  304. package/packages/core/dist/core/install/unified/index.js +1 -1
  305. package/packages/core/dist/core/install/unified/index.js.map +1 -1
  306. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts +6 -0
  307. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
  308. package/packages/core/dist/core/install/unified/multi-context-pipeline.js +11 -4
  309. package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
  310. package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
  311. package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
  312. package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
  313. package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
  314. package/packages/core/dist/core/install/unified/phases/execute.js +5 -5
  315. package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
  316. package/packages/core/dist/core/install/unified/phases/load-package.js +3 -3
  317. package/packages/core/dist/core/install/unified/phases/load-package.js.map +1 -1
  318. package/packages/core/dist/core/install/unified/phases/report.js +1 -1
  319. package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
  320. package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
  321. package/packages/core/dist/core/install/unified/pipeline.js +7 -10
  322. package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
  323. package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts +24 -0
  324. package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts.map +1 -0
  325. package/packages/core/dist/core/install/wave-resolver/content-root-cache.js +71 -0
  326. package/packages/core/dist/core/install/wave-resolver/content-root-cache.js.map +1 -0
  327. package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts +39 -0
  328. package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts.map +1 -0
  329. package/packages/core/dist/core/install/wave-resolver/context-builder.js +148 -0
  330. package/packages/core/dist/core/install/wave-resolver/context-builder.js.map +1 -0
  331. package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts +49 -0
  332. package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts.map +1 -0
  333. package/packages/core/dist/core/install/wave-resolver/fetcher.js +221 -0
  334. package/packages/core/dist/core/install/wave-resolver/fetcher.js.map +1 -0
  335. package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts +23 -0
  336. package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts.map +1 -0
  337. package/packages/core/dist/core/install/wave-resolver/index-updater.js +87 -0
  338. package/packages/core/dist/core/install/wave-resolver/index-updater.js.map +1 -0
  339. package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts +101 -0
  340. package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts.map +1 -0
  341. package/packages/core/dist/core/install/wave-resolver/index-write-collector.js +194 -0
  342. package/packages/core/dist/core/install/wave-resolver/index-write-collector.js.map +1 -0
  343. package/packages/core/dist/core/install/wave-resolver/index.d.ts +17 -0
  344. package/packages/core/dist/core/install/wave-resolver/index.d.ts.map +1 -0
  345. package/packages/core/dist/core/install/wave-resolver/index.js +16 -0
  346. package/packages/core/dist/core/install/wave-resolver/index.js.map +1 -0
  347. package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts +34 -0
  348. package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts.map +1 -0
  349. package/packages/core/dist/core/install/wave-resolver/manifest-reader.js +112 -0
  350. package/packages/core/dist/core/install/wave-resolver/manifest-reader.js.map +1 -0
  351. package/packages/core/dist/core/install/wave-resolver/types.d.ts +210 -0
  352. package/packages/core/dist/core/install/wave-resolver/types.d.ts.map +1 -0
  353. package/packages/core/dist/core/install/wave-resolver/types.js +6 -0
  354. package/packages/core/dist/core/install/wave-resolver/types.js.map +1 -0
  355. package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts +65 -0
  356. package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts.map +1 -0
  357. package/packages/core/dist/core/install/wave-resolver/version-solver.js +166 -0
  358. package/packages/core/dist/core/install/wave-resolver/version-solver.js.map +1 -0
  359. package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts +16 -0
  360. package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts.map +1 -0
  361. package/packages/core/dist/core/install/wave-resolver/wave-engine.js +337 -0
  362. package/packages/core/dist/core/install/wave-resolver/wave-engine.js.map +1 -0
  363. package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts +50 -0
  364. package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts.map +1 -0
  365. package/packages/core/dist/core/install/wave-resolver/wave-installer.js +246 -0
  366. package/packages/core/dist/core/install/wave-resolver/wave-installer.js.map +1 -0
  367. package/packages/core/dist/core/ports/buffered-output.d.ts +36 -0
  368. package/packages/core/dist/core/ports/buffered-output.d.ts.map +1 -0
  369. package/packages/core/dist/core/ports/buffered-output.js +89 -0
  370. package/packages/core/dist/core/ports/buffered-output.js.map +1 -0
  371. package/packages/core/dist/core/ports/resolve.d.ts +0 -13
  372. package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
  373. package/packages/core/dist/core/ports/resolve.js +0 -28
  374. package/packages/core/dist/core/ports/resolve.js.map +1 -1
  375. package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
  376. package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
  377. package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
  378. package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
  379. package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
  380. package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
  381. package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
  382. package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
  383. package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
  384. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
  385. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
  386. package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
  387. package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
  388. package/packages/core/dist/index.d.ts +1 -1
  389. package/packages/core/dist/index.d.ts.map +1 -1
  390. package/packages/core/dist/types/execution-context.d.ts +40 -10
  391. package/packages/core/dist/types/execution-context.d.ts.map +1 -1
  392. package/packages/core/dist/utils/concurrency-pool.d.ts +34 -0
  393. package/packages/core/dist/utils/concurrency-pool.d.ts.map +1 -0
  394. package/packages/core/dist/utils/concurrency-pool.js +58 -0
  395. package/packages/core/dist/utils/concurrency-pool.js.map +1 -0
  396. package/packages/core/dist/utils/plugin-naming.d.ts +11 -3
  397. package/packages/core/dist/utils/plugin-naming.d.ts.map +1 -1
  398. package/packages/core/dist/utils/plugin-naming.js +27 -7
  399. package/packages/core/dist/utils/plugin-naming.js.map +1 -1
  400. package/plans/wave-resolver.md +254 -0
  401. package/.claude/agents/essentials/code-simplifier.md +0 -52
  402. package/.claude/commands/essentials/cleanup.md +0 -1
  403. package/.claude/commands/essentials/review.md +0 -8
  404. package/.claude/commands/git/commit.md +0 -5
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getChildPrefix,
4
+ getTreeConnector
5
+ } from "./chunk-HTYHJA3B.js";
6
+ import {
7
+ getLocalPackagesDir
8
+ } from "./chunk-BCYZDID6.js";
9
+ import {
10
+ createCliExecutionContext
11
+ } from "./chunk-BROJ6OUT.js";
12
+ import {
13
+ listAllPackages,
14
+ listPackageVersions
15
+ } from "./chunk-XEPVYZO3.js";
16
+ import {
17
+ parsePackageYml
18
+ } from "./chunk-QTQYI4L5.js";
19
+ import "./chunk-VN22A7NW.js";
20
+ import {
21
+ FILE_PATTERNS
22
+ } from "./chunk-J4IFFBLP.js";
23
+ import {
24
+ exists,
25
+ listDirectories
26
+ } from "./chunk-S47F4OG4.js";
27
+ import "./chunk-ID4SVDQZ.js";
28
+ import "./chunk-5EFWGD33.js";
29
+
30
+ // ../core/src/core/search/search-pipeline.ts
31
+ import { join } from "path";
32
+ function matchesQuery(query, name, description, keywords) {
33
+ let q = query.toLowerCase();
34
+ return !!(name.toLowerCase().includes(q) || keywords?.some((kw) => kw.toLowerCase().includes(q)) || description?.toLowerCase().includes(q));
35
+ }
36
+ async function loadPackageMetadata(packageDir) {
37
+ let ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);
38
+ if (!await exists(ymlPath)) return null;
39
+ try {
40
+ let yml = await parsePackageYml(ymlPath);
41
+ return { description: yml.description, keywords: yml.keywords };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ async function scanPackagesDirectory(packagesDir, source, query) {
47
+ if (!await exists(packagesDir)) return [];
48
+ let names = (await listDirectories(packagesDir)).filter((name) => !name.startsWith(".")).sort((a, b) => a.localeCompare(b)), matches = [];
49
+ for (let name of names) {
50
+ if (!query) {
51
+ matches.push({ name, source });
52
+ continue;
53
+ }
54
+ let metadata = await loadPackageMetadata(join(packagesDir, name));
55
+ matchesQuery(query, name, metadata?.description, metadata?.keywords) && matches.push({
56
+ name,
57
+ source,
58
+ description: metadata?.description,
59
+ keywords: metadata?.keywords
60
+ });
61
+ }
62
+ return matches;
63
+ }
64
+ async function scanRegistryDirectory(query) {
65
+ let packages = await listAllPackages(), matches = [];
66
+ for (let packageName of packages) {
67
+ let versions = await listPackageVersions(packageName);
68
+ versions.length !== 0 && (!query || matchesQuery(query, packageName)) && matches.push({
69
+ name: packageName,
70
+ source: "registry",
71
+ versions
72
+ });
73
+ }
74
+ return matches.sort((a, b) => a.name.localeCompare(b.name));
75
+ }
76
+ async function runSearchPipeline(options) {
77
+ let result = { matches: [] };
78
+ if (options.showProject) {
79
+ let ctx = await options.createContext({ global: !1, cwd: options.cwd }), projectPackagesDir = getLocalPackagesDir(ctx.targetDir), projectMatches = await scanPackagesDirectory(projectPackagesDir, "project", options.query);
80
+ result.matches.push(...projectMatches);
81
+ }
82
+ if (options.showGlobal) {
83
+ let ctx = await options.createContext({ global: !0, cwd: options.cwd }), globalPackagesDir = getLocalPackagesDir(ctx.targetDir), globalMatches = await scanPackagesDirectory(globalPackagesDir, "global", options.query);
84
+ result.matches.push(...globalMatches);
85
+ }
86
+ if (options.showRegistry) {
87
+ let registryMatches = await scanRegistryDirectory(options.query);
88
+ result.matches.push(...registryMatches);
89
+ }
90
+ return result;
91
+ }
92
+
93
+ // src/commands/search-display.ts
94
+ var DIM = "\x1B[2m", CYAN = "\x1B[36m", RESET = "\x1B[0m";
95
+ function dim(text) {
96
+ return `${DIM}${text}${RESET}`;
97
+ }
98
+ function cyan(text) {
99
+ return `${CYAN}${text}${RESET}`;
100
+ }
101
+ function displaySection(title, subtitle, matches, showAll) {
102
+ if (matches.length !== 0) {
103
+ console.log(`${cyan(title)} ${dim(subtitle)}`);
104
+ for (let i = 0; i < matches.length; i++) {
105
+ let pkg = matches[i], isLast = i === matches.length - 1;
106
+ if (pkg.source === "registry" && pkg.versions)
107
+ if (showAll && pkg.versions.length > 1) {
108
+ let connector = getTreeConnector(isLast, !0);
109
+ console.log(`${connector}${pkg.name}`);
110
+ let childPfx = getChildPrefix("", isLast);
111
+ for (let vi = 0; vi < pkg.versions.length; vi++) {
112
+ let isLastVersion = vi === pkg.versions.length - 1, versionConnector = getTreeConnector(isLastVersion, !1);
113
+ console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);
114
+ }
115
+ } else {
116
+ let connector = getTreeConnector(isLast, !1);
117
+ console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);
118
+ }
119
+ else {
120
+ let connector = getTreeConnector(isLast, !1);
121
+ console.log(`${connector}${pkg.name}`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function displayResults(result, showAll) {
127
+ let project = result.matches.filter((m) => m.source === "project"), global = result.matches.filter((m) => m.source === "global"), registry = result.matches.filter((m) => m.source === "registry"), hasAny = !1;
128
+ project.length > 0 && (displaySection("[Project Packages]", "(./.openpackage/packages)", project, showAll), hasAny = !0), global.length > 0 && (displaySection("[Global Packages]", "(~/.openpackage/packages)", global, showAll), hasAny = !0), registry.length > 0 && (displaySection("[Local Registry]", "(~/.openpackage/registry)", registry, showAll), hasAny = !0), hasAny || console.log(dim("No packages found."));
129
+ }
130
+ function displayJson(result) {
131
+ let output = result.matches.map((m) => {
132
+ let entry = { name: m.name, source: m.source };
133
+ return m.versions && (entry.versions = m.versions), m.description && (entry.description = m.description), m.keywords && (entry.keywords = m.keywords), entry;
134
+ });
135
+ console.log(JSON.stringify(output, null, 2));
136
+ }
137
+
138
+ // src/commands/search.ts
139
+ async function searchCommand(query, options, command) {
140
+ let programOpts = command.parent?.opts() || {}, explicitSources = options.project || options.global || options.registry, result = await runSearchPipeline({
141
+ query,
142
+ showProject: options.project || !explicitSources,
143
+ showGlobal: options.global || !explicitSources,
144
+ showRegistry: options.registry || !explicitSources,
145
+ createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),
146
+ cwd: programOpts.cwd
147
+ });
148
+ return options.json ? displayJson(result) : displayResults(result, options.all || !1), { success: !0 };
149
+ }
150
+ async function setupSearchCommand(args) {
151
+ let [query, options, command] = args;
152
+ await searchCommand(query, options, command);
153
+ }
154
+ export {
155
+ setupSearchCommand
156
+ };
157
+ //# sourceMappingURL=search-ABROK3UO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/search/search-pipeline.ts", "../src/commands/search-display.ts", "../src/commands/search.ts"],
4
+ "sourcesContent": ["/**\n * Search Pipeline\n *\n * Core logic for searching packages across project, global, and registry sources.\n * No terminal-UI dependencies \u2014 display is handled by the CLI command layer.\n */\n\nimport { join } from 'path';\nimport { listAllPackages, listPackageVersions } from '../directory.js';\nimport { getLocalPackagesDir } from '../../utils/paths.js';\nimport { exists, listDirectories } from '../../utils/fs.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageMatch {\n name: string;\n source: 'project' | 'global' | 'registry';\n versions?: string[]; // registry packages only (sorted latest first)\n description?: string;\n keywords?: string[];\n}\n\nexport interface SearchResult {\n matches: PackageMatch[];\n}\n\nexport interface SearchOptions {\n project?: boolean;\n global?: boolean;\n registry?: boolean;\n all?: boolean;\n json?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\n/**\n * Weighted matching against package metadata.\n * Returns true if query matches name, keywords, or description (checked in that order).\n */\nexport function matchesQuery(query: string, name: string, description?: string, keywords?: string[]): boolean {\n const q = query.toLowerCase();\n\n if (name.toLowerCase().includes(q)) return true;\n if (keywords?.some(kw => kw.toLowerCase().includes(q))) return true;\n if (description?.toLowerCase().includes(q)) return true;\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Scanning\n// ---------------------------------------------------------------------------\n\n/**\n * Try to load metadata from an openpackage.yml in a package directory.\n */\nasync function loadPackageMetadata(packageDir: string): Promise<{ description?: string; keywords?: string[] } | null> {\n const ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(ymlPath))) return null;\n\n try {\n const yml = await parsePackageYml(ymlPath);\n return { description: yml.description, keywords: yml.keywords };\n } catch {\n return null;\n }\n}\n\n/**\n * Scan a /packages directory and return PackageMatch entries.\n */\nexport async function scanPackagesDirectory(\n packagesDir: string,\n source: 'project' | 'global',\n query?: string\n): Promise<PackageMatch[]> {\n if (!(await exists(packagesDir))) return [];\n\n const dirs = await listDirectories(packagesDir);\n const names = dirs\n .filter(name => !name.startsWith('.'))\n .sort((a, b) => a.localeCompare(b));\n\n const matches: PackageMatch[] = [];\n\n for (const name of names) {\n if (!query) {\n matches.push({ name, source });\n continue;\n }\n\n const metadata = await loadPackageMetadata(join(packagesDir, name));\n if (matchesQuery(query, name, metadata?.description, metadata?.keywords)) {\n matches.push({\n name,\n source,\n description: metadata?.description,\n keywords: metadata?.keywords,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Scan the local registry directory and return PackageMatch entries.\n */\nexport async function scanRegistryDirectory(query?: string): Promise<PackageMatch[]> {\n const packages = await listAllPackages();\n const matches: PackageMatch[] = [];\n\n for (const packageName of packages) {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) continue;\n\n if (!query || matchesQuery(query, packageName)) {\n matches.push({\n name: packageName,\n source: 'registry',\n versions,\n });\n }\n }\n\n return matches.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport interface RunSearchOptions {\n query?: string;\n showProject: boolean;\n showGlobal: boolean;\n showRegistry: boolean;\n /** Factory to create execution contexts (injected by CLI layer) */\n createContext: (opts: { global: boolean; cwd?: string }) => Promise<ExecutionContext>;\n cwd?: string;\n}\n\n/**\n * Run the search pipeline across configured sources.\n * Returns a SearchResult with matches \u2014 display is the caller's concern.\n */\nexport async function runSearchPipeline(options: RunSearchOptions): Promise<SearchResult> {\n const result: SearchResult = { matches: [] };\n\n if (options.showProject) {\n const ctx = await options.createContext({ global: false, cwd: options.cwd });\n const projectPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const projectMatches = await scanPackagesDirectory(projectPackagesDir, 'project', options.query);\n result.matches.push(...projectMatches);\n }\n\n if (options.showGlobal) {\n const ctx = await options.createContext({ global: true, cwd: options.cwd });\n const globalPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const globalMatches = await scanPackagesDirectory(globalPackagesDir, 'global', options.query);\n result.matches.push(...globalMatches);\n }\n\n if (options.showRegistry) {\n const registryMatches = await scanRegistryDirectory(options.query);\n result.matches.push(...registryMatches);\n }\n\n return result;\n}\n", "/**\n * Search Display Helpers\n *\n * Terminal-specific display formatting for search results.\n * Separated from search.ts to keep the command handler thin.\n */\n\nimport type { SearchResult, PackageMatch } from '@opkg/core/core/search/search-pipeline.js';\nimport { getTreeConnector, getChildPrefix } from '@opkg/core/core/list/list-tree-renderer.js';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst DIM = '\\x1b[2m';\nconst CYAN = '\\x1b[36m';\nconst RESET = '\\x1b[0m';\n\nfunction dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nfunction cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Display functions\n// ---------------------------------------------------------------------------\n\nfunction displaySection(title: string, subtitle: string, matches: PackageMatch[], showAll: boolean): void {\n if (matches.length === 0) return;\n\n console.log(`${cyan(title)} ${dim(subtitle)}`);\n\n for (let i = 0; i < matches.length; i++) {\n const pkg = matches[i];\n const isLast = i === matches.length - 1;\n\n if (pkg.source === 'registry' && pkg.versions) {\n if (showAll && pkg.versions.length > 1) {\n const connector = getTreeConnector(isLast, true);\n console.log(`${connector}${pkg.name}`);\n const childPfx = getChildPrefix('', isLast);\n for (let vi = 0; vi < pkg.versions.length; vi++) {\n const isLastVersion = vi === pkg.versions.length - 1;\n const versionConnector = getTreeConnector(isLastVersion, false);\n console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}`);\n }\n }\n}\n\nexport function displayResults(result: SearchResult, showAll: boolean): void {\n const project = result.matches.filter(m => m.source === 'project');\n const global = result.matches.filter(m => m.source === 'global');\n const registry = result.matches.filter(m => m.source === 'registry');\n\n let hasAny = false;\n\n if (project.length > 0) {\n displaySection('[Project Packages]', '(./.openpackage/packages)', project, showAll);\n hasAny = true;\n }\n if (global.length > 0) {\n displaySection('[Global Packages]', '(~/.openpackage/packages)', global, showAll);\n hasAny = true;\n }\n if (registry.length > 0) {\n displaySection('[Local Registry]', '(~/.openpackage/registry)', registry, showAll);\n hasAny = true;\n }\n if (!hasAny) {\n console.log(dim('No packages found.'));\n }\n}\n\nexport function displayJson(result: SearchResult): void {\n const output = result.matches.map(m => {\n const entry: Record<string, unknown> = { name: m.name, source: m.source };\n if (m.versions) entry.versions = m.versions;\n if (m.description) entry.description = m.description;\n if (m.keywords) entry.keywords = m.keywords;\n return entry;\n });\n console.log(JSON.stringify(output, null, 2));\n}\n", "/**\n * Search Command (CLI layer)\n *\n * Thin shell over core/search/search-pipeline.ts.\n * Handles CLI arg parsing and delegates display to search-display.ts.\n */\n\nimport { Command } from 'commander';\n\nimport { CommandResult } from '@opkg/core/types/index.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { runSearchPipeline, type SearchOptions } from '@opkg/core/core/search/search-pipeline.js';\nimport { displayResults, displayJson } from './search-display.js';\n\nasync function searchCommand(\n query: string | undefined,\n options: SearchOptions,\n command: Command\n): Promise<CommandResult> {\n const programOpts = command.parent?.opts() || {};\n const explicitSources = options.project || options.global || options.registry;\n\n const result = await runSearchPipeline({\n query,\n showProject: options.project || !explicitSources,\n showGlobal: options.global || !explicitSources,\n showRegistry: options.registry || !explicitSources,\n createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),\n cwd: programOpts.cwd,\n });\n\n if (options.json) {\n displayJson(result);\n } else {\n displayResults(result, options.all || false);\n }\n\n return { success: true };\n}\n\nexport async function setupSearchCommand(args: any[]): Promise<void> {\n const [query, options, command] = args as [string | undefined, SearchOptions, Command];\n await searchCommand(query, options, command);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getChildPrefix,
4
+ getTreeConnector
5
+ } from "./chunk-ABFUD25D.js";
6
+ import {
7
+ getLocalPackagesDir
8
+ } from "./chunk-BCYZDID6.js";
9
+ import {
10
+ createCliExecutionContext
11
+ } from "./chunk-RAKMX654.js";
12
+ import {
13
+ listAllPackages,
14
+ listPackageVersions
15
+ } from "./chunk-XEPVYZO3.js";
16
+ import {
17
+ parsePackageYml
18
+ } from "./chunk-QTQYI4L5.js";
19
+ import "./chunk-VN22A7NW.js";
20
+ import {
21
+ FILE_PATTERNS
22
+ } from "./chunk-J4IFFBLP.js";
23
+ import {
24
+ exists,
25
+ listDirectories
26
+ } from "./chunk-S47F4OG4.js";
27
+ import "./chunk-ID4SVDQZ.js";
28
+ import "./chunk-5EFWGD33.js";
29
+
30
+ // ../core/src/core/search/search-pipeline.ts
31
+ import { join } from "path";
32
+ function matchesQuery(query, name, description, keywords) {
33
+ let q = query.toLowerCase();
34
+ return !!(name.toLowerCase().includes(q) || keywords?.some((kw) => kw.toLowerCase().includes(q)) || description?.toLowerCase().includes(q));
35
+ }
36
+ async function loadPackageMetadata(packageDir) {
37
+ let ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);
38
+ if (!await exists(ymlPath)) return null;
39
+ try {
40
+ let yml = await parsePackageYml(ymlPath);
41
+ return { description: yml.description, keywords: yml.keywords };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ async function scanPackagesDirectory(packagesDir, source, query) {
47
+ if (!await exists(packagesDir)) return [];
48
+ let names = (await listDirectories(packagesDir)).filter((name) => !name.startsWith(".")).sort((a, b) => a.localeCompare(b)), matches = [];
49
+ for (let name of names) {
50
+ if (!query) {
51
+ matches.push({ name, source });
52
+ continue;
53
+ }
54
+ let metadata = await loadPackageMetadata(join(packagesDir, name));
55
+ matchesQuery(query, name, metadata?.description, metadata?.keywords) && matches.push({
56
+ name,
57
+ source,
58
+ description: metadata?.description,
59
+ keywords: metadata?.keywords
60
+ });
61
+ }
62
+ return matches;
63
+ }
64
+ async function scanRegistryDirectory(query) {
65
+ let packages = await listAllPackages(), matches = [];
66
+ for (let packageName of packages) {
67
+ let versions = await listPackageVersions(packageName);
68
+ versions.length !== 0 && (!query || matchesQuery(query, packageName)) && matches.push({
69
+ name: packageName,
70
+ source: "registry",
71
+ versions
72
+ });
73
+ }
74
+ return matches.sort((a, b) => a.name.localeCompare(b.name));
75
+ }
76
+ async function runSearchPipeline(options) {
77
+ let result = { matches: [] };
78
+ if (options.showProject) {
79
+ let ctx = await options.createContext({ global: !1, cwd: options.cwd }), projectPackagesDir = getLocalPackagesDir(ctx.targetDir), projectMatches = await scanPackagesDirectory(projectPackagesDir, "project", options.query);
80
+ result.matches.push(...projectMatches);
81
+ }
82
+ if (options.showGlobal) {
83
+ let ctx = await options.createContext({ global: !0, cwd: options.cwd }), globalPackagesDir = getLocalPackagesDir(ctx.targetDir), globalMatches = await scanPackagesDirectory(globalPackagesDir, "global", options.query);
84
+ result.matches.push(...globalMatches);
85
+ }
86
+ if (options.showRegistry) {
87
+ let registryMatches = await scanRegistryDirectory(options.query);
88
+ result.matches.push(...registryMatches);
89
+ }
90
+ return result;
91
+ }
92
+
93
+ // src/commands/search-display.ts
94
+ var DIM = "\x1B[2m", CYAN = "\x1B[36m", RESET = "\x1B[0m";
95
+ function dim(text) {
96
+ return `${DIM}${text}${RESET}`;
97
+ }
98
+ function cyan(text) {
99
+ return `${CYAN}${text}${RESET}`;
100
+ }
101
+ function displaySection(title, subtitle, matches, showAll) {
102
+ if (matches.length !== 0) {
103
+ console.log(`${cyan(title)} ${dim(subtitle)}`);
104
+ for (let i = 0; i < matches.length; i++) {
105
+ let pkg = matches[i], isLast = i === matches.length - 1;
106
+ if (pkg.source === "registry" && pkg.versions)
107
+ if (showAll && pkg.versions.length > 1) {
108
+ let connector = getTreeConnector(isLast, !0);
109
+ console.log(`${connector}${pkg.name}`);
110
+ let childPfx = getChildPrefix("", isLast);
111
+ for (let vi = 0; vi < pkg.versions.length; vi++) {
112
+ let isLastVersion = vi === pkg.versions.length - 1, versionConnector = getTreeConnector(isLastVersion, !1);
113
+ console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);
114
+ }
115
+ } else {
116
+ let connector = getTreeConnector(isLast, !1);
117
+ console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);
118
+ }
119
+ else {
120
+ let connector = getTreeConnector(isLast, !1);
121
+ console.log(`${connector}${pkg.name}`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function displayResults(result, showAll) {
127
+ let project = result.matches.filter((m) => m.source === "project"), global = result.matches.filter((m) => m.source === "global"), registry = result.matches.filter((m) => m.source === "registry"), hasAny = !1;
128
+ project.length > 0 && (displaySection("[Project Packages]", "(./.openpackage/packages)", project, showAll), hasAny = !0), global.length > 0 && (displaySection("[Global Packages]", "(~/.openpackage/packages)", global, showAll), hasAny = !0), registry.length > 0 && (displaySection("[Local Registry]", "(~/.openpackage/registry)", registry, showAll), hasAny = !0), hasAny || console.log(dim("No packages found."));
129
+ }
130
+ function displayJson(result) {
131
+ let output = result.matches.map((m) => {
132
+ let entry = { name: m.name, source: m.source };
133
+ return m.versions && (entry.versions = m.versions), m.description && (entry.description = m.description), m.keywords && (entry.keywords = m.keywords), entry;
134
+ });
135
+ console.log(JSON.stringify(output, null, 2));
136
+ }
137
+
138
+ // src/commands/search.ts
139
+ async function searchCommand(query, options, command) {
140
+ let programOpts = command.parent?.opts() || {}, explicitSources = options.project || options.global || options.registry, result = await runSearchPipeline({
141
+ query,
142
+ showProject: options.project || !explicitSources,
143
+ showGlobal: options.global || !explicitSources,
144
+ showRegistry: options.registry || !explicitSources,
145
+ createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),
146
+ cwd: programOpts.cwd
147
+ });
148
+ return options.json ? displayJson(result) : displayResults(result, options.all || !1), { success: !0 };
149
+ }
150
+ async function setupSearchCommand(args) {
151
+ let [query, options, command] = args;
152
+ await searchCommand(query, options, command);
153
+ }
154
+ export {
155
+ setupSearchCommand
156
+ };
157
+ //# sourceMappingURL=search-WVFXFNAV.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/search/search-pipeline.ts", "../src/commands/search-display.ts", "../src/commands/search.ts"],
4
+ "sourcesContent": ["/**\n * Search Pipeline\n *\n * Core logic for searching packages across project, global, and registry sources.\n * No terminal-UI dependencies \u2014 display is handled by the CLI command layer.\n */\n\nimport { join } from 'path';\nimport { listAllPackages, listPackageVersions } from '../directory.js';\nimport { getLocalPackagesDir } from '../../utils/paths.js';\nimport { exists, listDirectories } from '../../utils/fs.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageMatch {\n name: string;\n source: 'project' | 'global' | 'registry';\n versions?: string[]; // registry packages only (sorted latest first)\n description?: string;\n keywords?: string[];\n}\n\nexport interface SearchResult {\n matches: PackageMatch[];\n}\n\nexport interface SearchOptions {\n project?: boolean;\n global?: boolean;\n registry?: boolean;\n all?: boolean;\n json?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\n/**\n * Weighted matching against package metadata.\n * Returns true if query matches name, keywords, or description (checked in that order).\n */\nexport function matchesQuery(query: string, name: string, description?: string, keywords?: string[]): boolean {\n const q = query.toLowerCase();\n\n if (name.toLowerCase().includes(q)) return true;\n if (keywords?.some(kw => kw.toLowerCase().includes(q))) return true;\n if (description?.toLowerCase().includes(q)) return true;\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Scanning\n// ---------------------------------------------------------------------------\n\n/**\n * Try to load metadata from an openpackage.yml in a package directory.\n */\nasync function loadPackageMetadata(packageDir: string): Promise<{ description?: string; keywords?: string[] } | null> {\n const ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(ymlPath))) return null;\n\n try {\n const yml = await parsePackageYml(ymlPath);\n return { description: yml.description, keywords: yml.keywords };\n } catch {\n return null;\n }\n}\n\n/**\n * Scan a /packages directory and return PackageMatch entries.\n */\nexport async function scanPackagesDirectory(\n packagesDir: string,\n source: 'project' | 'global',\n query?: string\n): Promise<PackageMatch[]> {\n if (!(await exists(packagesDir))) return [];\n\n const dirs = await listDirectories(packagesDir);\n const names = dirs\n .filter(name => !name.startsWith('.'))\n .sort((a, b) => a.localeCompare(b));\n\n const matches: PackageMatch[] = [];\n\n for (const name of names) {\n if (!query) {\n matches.push({ name, source });\n continue;\n }\n\n const metadata = await loadPackageMetadata(join(packagesDir, name));\n if (matchesQuery(query, name, metadata?.description, metadata?.keywords)) {\n matches.push({\n name,\n source,\n description: metadata?.description,\n keywords: metadata?.keywords,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Scan the local registry directory and return PackageMatch entries.\n */\nexport async function scanRegistryDirectory(query?: string): Promise<PackageMatch[]> {\n const packages = await listAllPackages();\n const matches: PackageMatch[] = [];\n\n for (const packageName of packages) {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) continue;\n\n if (!query || matchesQuery(query, packageName)) {\n matches.push({\n name: packageName,\n source: 'registry',\n versions,\n });\n }\n }\n\n return matches.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport interface RunSearchOptions {\n query?: string;\n showProject: boolean;\n showGlobal: boolean;\n showRegistry: boolean;\n /** Factory to create execution contexts (injected by CLI layer) */\n createContext: (opts: { global: boolean; cwd?: string }) => Promise<ExecutionContext>;\n cwd?: string;\n}\n\n/**\n * Run the search pipeline across configured sources.\n * Returns a SearchResult with matches \u2014 display is the caller's concern.\n */\nexport async function runSearchPipeline(options: RunSearchOptions): Promise<SearchResult> {\n const result: SearchResult = { matches: [] };\n\n if (options.showProject) {\n const ctx = await options.createContext({ global: false, cwd: options.cwd });\n const projectPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const projectMatches = await scanPackagesDirectory(projectPackagesDir, 'project', options.query);\n result.matches.push(...projectMatches);\n }\n\n if (options.showGlobal) {\n const ctx = await options.createContext({ global: true, cwd: options.cwd });\n const globalPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const globalMatches = await scanPackagesDirectory(globalPackagesDir, 'global', options.query);\n result.matches.push(...globalMatches);\n }\n\n if (options.showRegistry) {\n const registryMatches = await scanRegistryDirectory(options.query);\n result.matches.push(...registryMatches);\n }\n\n return result;\n}\n", "/**\n * Search Display Helpers\n *\n * Terminal-specific display formatting for search results.\n * Separated from search.ts to keep the command handler thin.\n */\n\nimport type { SearchResult, PackageMatch } from '@opkg/core/core/search/search-pipeline.js';\nimport { getTreeConnector, getChildPrefix } from '@opkg/core/core/list/list-tree-renderer.js';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst DIM = '\\x1b[2m';\nconst CYAN = '\\x1b[36m';\nconst RESET = '\\x1b[0m';\n\nfunction dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nfunction cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Display functions\n// ---------------------------------------------------------------------------\n\nfunction displaySection(title: string, subtitle: string, matches: PackageMatch[], showAll: boolean): void {\n if (matches.length === 0) return;\n\n console.log(`${cyan(title)} ${dim(subtitle)}`);\n\n for (let i = 0; i < matches.length; i++) {\n const pkg = matches[i];\n const isLast = i === matches.length - 1;\n\n if (pkg.source === 'registry' && pkg.versions) {\n if (showAll && pkg.versions.length > 1) {\n const connector = getTreeConnector(isLast, true);\n console.log(`${connector}${pkg.name}`);\n const childPfx = getChildPrefix('', isLast);\n for (let vi = 0; vi < pkg.versions.length; vi++) {\n const isLastVersion = vi === pkg.versions.length - 1;\n const versionConnector = getTreeConnector(isLastVersion, false);\n console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}`);\n }\n }\n}\n\nexport function displayResults(result: SearchResult, showAll: boolean): void {\n const project = result.matches.filter(m => m.source === 'project');\n const global = result.matches.filter(m => m.source === 'global');\n const registry = result.matches.filter(m => m.source === 'registry');\n\n let hasAny = false;\n\n if (project.length > 0) {\n displaySection('[Project Packages]', '(./.openpackage/packages)', project, showAll);\n hasAny = true;\n }\n if (global.length > 0) {\n displaySection('[Global Packages]', '(~/.openpackage/packages)', global, showAll);\n hasAny = true;\n }\n if (registry.length > 0) {\n displaySection('[Local Registry]', '(~/.openpackage/registry)', registry, showAll);\n hasAny = true;\n }\n if (!hasAny) {\n console.log(dim('No packages found.'));\n }\n}\n\nexport function displayJson(result: SearchResult): void {\n const output = result.matches.map(m => {\n const entry: Record<string, unknown> = { name: m.name, source: m.source };\n if (m.versions) entry.versions = m.versions;\n if (m.description) entry.description = m.description;\n if (m.keywords) entry.keywords = m.keywords;\n return entry;\n });\n console.log(JSON.stringify(output, null, 2));\n}\n", "/**\n * Search Command (CLI layer)\n *\n * Thin shell over core/search/search-pipeline.ts.\n * Handles CLI arg parsing and delegates display to search-display.ts.\n */\n\nimport { Command } from 'commander';\n\nimport { CommandResult } from '@opkg/core/types/index.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { runSearchPipeline, type SearchOptions } from '@opkg/core/core/search/search-pipeline.js';\nimport { displayResults, displayJson } from './search-display.js';\n\nasync function searchCommand(\n query: string | undefined,\n options: SearchOptions,\n command: Command\n): Promise<CommandResult> {\n const programOpts = command.parent?.opts() || {};\n const explicitSources = options.project || options.global || options.registry;\n\n const result = await runSearchPipeline({\n query,\n showProject: options.project || !explicitSources,\n showGlobal: options.global || !explicitSources,\n showRegistry: options.registry || !explicitSources,\n createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),\n cwd: programOpts.cwd,\n });\n\n if (options.json) {\n displayJson(result);\n } else {\n displayResults(result, options.all || false);\n }\n\n return { success: true };\n}\n\nexport async function setupSearchCommand(args: any[]): Promise<void> {\n const [query, options, command] = args as [string | undefined, SearchOptions, Command];\n await searchCommand(query, options, command);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getChildPrefix,
4
+ getTreeConnector
5
+ } from "./chunk-ABFUD25D.js";
6
+ import {
7
+ getLocalPackagesDir
8
+ } from "./chunk-VXNS3X5O.js";
9
+ import {
10
+ createCliExecutionContext
11
+ } from "./chunk-RAKMX654.js";
12
+ import {
13
+ listAllPackages,
14
+ listPackageVersions
15
+ } from "./chunk-GDVFS3YP.js";
16
+ import {
17
+ parsePackageYml
18
+ } from "./chunk-427DCURL.js";
19
+ import "./chunk-VN22A7NW.js";
20
+ import {
21
+ FILE_PATTERNS
22
+ } from "./chunk-IHVZ5AUJ.js";
23
+ import {
24
+ exists,
25
+ listDirectories
26
+ } from "./chunk-S47F4OG4.js";
27
+ import "./chunk-ID4SVDQZ.js";
28
+ import "./chunk-5EFWGD33.js";
29
+
30
+ // ../core/src/core/search/search-pipeline.ts
31
+ import { join } from "path";
32
+ function matchesQuery(query, name, description, keywords) {
33
+ let q = query.toLowerCase();
34
+ return !!(name.toLowerCase().includes(q) || keywords?.some((kw) => kw.toLowerCase().includes(q)) || description?.toLowerCase().includes(q));
35
+ }
36
+ async function loadPackageMetadata(packageDir) {
37
+ let ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);
38
+ if (!await exists(ymlPath)) return null;
39
+ try {
40
+ let yml = await parsePackageYml(ymlPath);
41
+ return { description: yml.description, keywords: yml.keywords };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+ async function scanPackagesDirectory(packagesDir, source, query) {
47
+ if (!await exists(packagesDir)) return [];
48
+ let names = (await listDirectories(packagesDir)).filter((name) => !name.startsWith(".")).sort((a, b) => a.localeCompare(b)), matches = [];
49
+ for (let name of names) {
50
+ if (!query) {
51
+ matches.push({ name, source });
52
+ continue;
53
+ }
54
+ let metadata = await loadPackageMetadata(join(packagesDir, name));
55
+ matchesQuery(query, name, metadata?.description, metadata?.keywords) && matches.push({
56
+ name,
57
+ source,
58
+ description: metadata?.description,
59
+ keywords: metadata?.keywords
60
+ });
61
+ }
62
+ return matches;
63
+ }
64
+ async function scanRegistryDirectory(query) {
65
+ let packages = await listAllPackages(), matches = [];
66
+ for (let packageName of packages) {
67
+ let versions = await listPackageVersions(packageName);
68
+ versions.length !== 0 && (!query || matchesQuery(query, packageName)) && matches.push({
69
+ name: packageName,
70
+ source: "registry",
71
+ versions
72
+ });
73
+ }
74
+ return matches.sort((a, b) => a.name.localeCompare(b.name));
75
+ }
76
+ async function runSearchPipeline(options) {
77
+ let result = { matches: [] };
78
+ if (options.showProject) {
79
+ let ctx = await options.createContext({ global: !1, cwd: options.cwd }), projectPackagesDir = getLocalPackagesDir(ctx.targetDir), projectMatches = await scanPackagesDirectory(projectPackagesDir, "project", options.query);
80
+ result.matches.push(...projectMatches);
81
+ }
82
+ if (options.showGlobal) {
83
+ let ctx = await options.createContext({ global: !0, cwd: options.cwd }), globalPackagesDir = getLocalPackagesDir(ctx.targetDir), globalMatches = await scanPackagesDirectory(globalPackagesDir, "global", options.query);
84
+ result.matches.push(...globalMatches);
85
+ }
86
+ if (options.showRegistry) {
87
+ let registryMatches = await scanRegistryDirectory(options.query);
88
+ result.matches.push(...registryMatches);
89
+ }
90
+ return result;
91
+ }
92
+
93
+ // src/commands/search-display.ts
94
+ var DIM = "\x1B[2m", CYAN = "\x1B[36m", RESET = "\x1B[0m";
95
+ function dim(text) {
96
+ return `${DIM}${text}${RESET}`;
97
+ }
98
+ function cyan(text) {
99
+ return `${CYAN}${text}${RESET}`;
100
+ }
101
+ function displaySection(title, subtitle, matches, showAll) {
102
+ if (matches.length !== 0) {
103
+ console.log(`${cyan(title)} ${dim(subtitle)}`);
104
+ for (let i = 0; i < matches.length; i++) {
105
+ let pkg = matches[i], isLast = i === matches.length - 1;
106
+ if (pkg.source === "registry" && pkg.versions)
107
+ if (showAll && pkg.versions.length > 1) {
108
+ let connector = getTreeConnector(isLast, !0);
109
+ console.log(`${connector}${pkg.name}`);
110
+ let childPfx = getChildPrefix("", isLast);
111
+ for (let vi = 0; vi < pkg.versions.length; vi++) {
112
+ let isLastVersion = vi === pkg.versions.length - 1, versionConnector = getTreeConnector(isLastVersion, !1);
113
+ console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);
114
+ }
115
+ } else {
116
+ let connector = getTreeConnector(isLast, !1);
117
+ console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);
118
+ }
119
+ else {
120
+ let connector = getTreeConnector(isLast, !1);
121
+ console.log(`${connector}${pkg.name}`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function displayResults(result, showAll) {
127
+ let project = result.matches.filter((m) => m.source === "project"), global = result.matches.filter((m) => m.source === "global"), registry = result.matches.filter((m) => m.source === "registry"), hasAny = !1;
128
+ project.length > 0 && (displaySection("[Project Packages]", "(./.openpackage/packages)", project, showAll), hasAny = !0), global.length > 0 && (displaySection("[Global Packages]", "(~/.openpackage/packages)", global, showAll), hasAny = !0), registry.length > 0 && (displaySection("[Local Registry]", "(~/.openpackage/registry)", registry, showAll), hasAny = !0), hasAny || console.log(dim("No packages found."));
129
+ }
130
+ function displayJson(result) {
131
+ let output = result.matches.map((m) => {
132
+ let entry = { name: m.name, source: m.source };
133
+ return m.versions && (entry.versions = m.versions), m.description && (entry.description = m.description), m.keywords && (entry.keywords = m.keywords), entry;
134
+ });
135
+ console.log(JSON.stringify(output, null, 2));
136
+ }
137
+
138
+ // src/commands/search.ts
139
+ async function searchCommand(query, options, command) {
140
+ let programOpts = command.parent?.opts() || {}, explicitSources = options.project || options.global || options.registry, result = await runSearchPipeline({
141
+ query,
142
+ showProject: options.project || !explicitSources,
143
+ showGlobal: options.global || !explicitSources,
144
+ showRegistry: options.registry || !explicitSources,
145
+ createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),
146
+ cwd: programOpts.cwd
147
+ });
148
+ return options.json ? displayJson(result) : displayResults(result, options.all || !1), { success: !0 };
149
+ }
150
+ async function setupSearchCommand(args) {
151
+ let [query, options, command] = args;
152
+ await searchCommand(query, options, command);
153
+ }
154
+ export {
155
+ setupSearchCommand
156
+ };
157
+ //# sourceMappingURL=search-YQN2Q2SO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/search/search-pipeline.ts", "../src/commands/search-display.ts", "../src/commands/search.ts"],
4
+ "sourcesContent": ["/**\n * Search Pipeline\n *\n * Core logic for searching packages across project, global, and registry sources.\n * No terminal-UI dependencies \u2014 display is handled by the CLI command layer.\n */\n\nimport { join } from 'path';\nimport { listAllPackages, listPackageVersions } from '../directory.js';\nimport { getLocalPackagesDir } from '../../utils/paths.js';\nimport { exists, listDirectories } from '../../utils/fs.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PackageMatch {\n name: string;\n source: 'project' | 'global' | 'registry';\n versions?: string[]; // registry packages only (sorted latest first)\n description?: string;\n keywords?: string[];\n}\n\nexport interface SearchResult {\n matches: PackageMatch[];\n}\n\nexport interface SearchOptions {\n project?: boolean;\n global?: boolean;\n registry?: boolean;\n all?: boolean;\n json?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\n/**\n * Weighted matching against package metadata.\n * Returns true if query matches name, keywords, or description (checked in that order).\n */\nexport function matchesQuery(query: string, name: string, description?: string, keywords?: string[]): boolean {\n const q = query.toLowerCase();\n\n if (name.toLowerCase().includes(q)) return true;\n if (keywords?.some(kw => kw.toLowerCase().includes(q))) return true;\n if (description?.toLowerCase().includes(q)) return true;\n\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Scanning\n// ---------------------------------------------------------------------------\n\n/**\n * Try to load metadata from an openpackage.yml in a package directory.\n */\nasync function loadPackageMetadata(packageDir: string): Promise<{ description?: string; keywords?: string[] } | null> {\n const ymlPath = join(packageDir, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(ymlPath))) return null;\n\n try {\n const yml = await parsePackageYml(ymlPath);\n return { description: yml.description, keywords: yml.keywords };\n } catch {\n return null;\n }\n}\n\n/**\n * Scan a /packages directory and return PackageMatch entries.\n */\nexport async function scanPackagesDirectory(\n packagesDir: string,\n source: 'project' | 'global',\n query?: string\n): Promise<PackageMatch[]> {\n if (!(await exists(packagesDir))) return [];\n\n const dirs = await listDirectories(packagesDir);\n const names = dirs\n .filter(name => !name.startsWith('.'))\n .sort((a, b) => a.localeCompare(b));\n\n const matches: PackageMatch[] = [];\n\n for (const name of names) {\n if (!query) {\n matches.push({ name, source });\n continue;\n }\n\n const metadata = await loadPackageMetadata(join(packagesDir, name));\n if (matchesQuery(query, name, metadata?.description, metadata?.keywords)) {\n matches.push({\n name,\n source,\n description: metadata?.description,\n keywords: metadata?.keywords,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Scan the local registry directory and return PackageMatch entries.\n */\nexport async function scanRegistryDirectory(query?: string): Promise<PackageMatch[]> {\n const packages = await listAllPackages();\n const matches: PackageMatch[] = [];\n\n for (const packageName of packages) {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) continue;\n\n if (!query || matchesQuery(query, packageName)) {\n matches.push({\n name: packageName,\n source: 'registry',\n versions,\n });\n }\n }\n\n return matches.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport interface RunSearchOptions {\n query?: string;\n showProject: boolean;\n showGlobal: boolean;\n showRegistry: boolean;\n /** Factory to create execution contexts (injected by CLI layer) */\n createContext: (opts: { global: boolean; cwd?: string }) => Promise<ExecutionContext>;\n cwd?: string;\n}\n\n/**\n * Run the search pipeline across configured sources.\n * Returns a SearchResult with matches \u2014 display is the caller's concern.\n */\nexport async function runSearchPipeline(options: RunSearchOptions): Promise<SearchResult> {\n const result: SearchResult = { matches: [] };\n\n if (options.showProject) {\n const ctx = await options.createContext({ global: false, cwd: options.cwd });\n const projectPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const projectMatches = await scanPackagesDirectory(projectPackagesDir, 'project', options.query);\n result.matches.push(...projectMatches);\n }\n\n if (options.showGlobal) {\n const ctx = await options.createContext({ global: true, cwd: options.cwd });\n const globalPackagesDir = getLocalPackagesDir(ctx.targetDir);\n const globalMatches = await scanPackagesDirectory(globalPackagesDir, 'global', options.query);\n result.matches.push(...globalMatches);\n }\n\n if (options.showRegistry) {\n const registryMatches = await scanRegistryDirectory(options.query);\n result.matches.push(...registryMatches);\n }\n\n return result;\n}\n", "/**\n * Search Display Helpers\n *\n * Terminal-specific display formatting for search results.\n * Separated from search.ts to keep the command handler thin.\n */\n\nimport type { SearchResult, PackageMatch } from '@opkg/core/core/search/search-pipeline.js';\nimport { getTreeConnector, getChildPrefix } from '@opkg/core/core/list/list-tree-renderer.js';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst DIM = '\\x1b[2m';\nconst CYAN = '\\x1b[36m';\nconst RESET = '\\x1b[0m';\n\nfunction dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nfunction cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Display functions\n// ---------------------------------------------------------------------------\n\nfunction displaySection(title: string, subtitle: string, matches: PackageMatch[], showAll: boolean): void {\n if (matches.length === 0) return;\n\n console.log(`${cyan(title)} ${dim(subtitle)}`);\n\n for (let i = 0; i < matches.length; i++) {\n const pkg = matches[i];\n const isLast = i === matches.length - 1;\n\n if (pkg.source === 'registry' && pkg.versions) {\n if (showAll && pkg.versions.length > 1) {\n const connector = getTreeConnector(isLast, true);\n console.log(`${connector}${pkg.name}`);\n const childPfx = getChildPrefix('', isLast);\n for (let vi = 0; vi < pkg.versions.length; vi++) {\n const isLastVersion = vi === pkg.versions.length - 1;\n const versionConnector = getTreeConnector(isLastVersion, false);\n console.log(`${childPfx}${versionConnector}${pkg.versions[vi]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}@${pkg.versions[0]}`);\n }\n } else {\n const connector = getTreeConnector(isLast, false);\n console.log(`${connector}${pkg.name}`);\n }\n }\n}\n\nexport function displayResults(result: SearchResult, showAll: boolean): void {\n const project = result.matches.filter(m => m.source === 'project');\n const global = result.matches.filter(m => m.source === 'global');\n const registry = result.matches.filter(m => m.source === 'registry');\n\n let hasAny = false;\n\n if (project.length > 0) {\n displaySection('[Project Packages]', '(./.openpackage/packages)', project, showAll);\n hasAny = true;\n }\n if (global.length > 0) {\n displaySection('[Global Packages]', '(~/.openpackage/packages)', global, showAll);\n hasAny = true;\n }\n if (registry.length > 0) {\n displaySection('[Local Registry]', '(~/.openpackage/registry)', registry, showAll);\n hasAny = true;\n }\n if (!hasAny) {\n console.log(dim('No packages found.'));\n }\n}\n\nexport function displayJson(result: SearchResult): void {\n const output = result.matches.map(m => {\n const entry: Record<string, unknown> = { name: m.name, source: m.source };\n if (m.versions) entry.versions = m.versions;\n if (m.description) entry.description = m.description;\n if (m.keywords) entry.keywords = m.keywords;\n return entry;\n });\n console.log(JSON.stringify(output, null, 2));\n}\n", "/**\n * Search Command (CLI layer)\n *\n * Thin shell over core/search/search-pipeline.ts.\n * Handles CLI arg parsing and delegates display to search-display.ts.\n */\n\nimport { Command } from 'commander';\n\nimport { CommandResult } from '@opkg/core/types/index.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { runSearchPipeline, type SearchOptions } from '@opkg/core/core/search/search-pipeline.js';\nimport { displayResults, displayJson } from './search-display.js';\n\nasync function searchCommand(\n query: string | undefined,\n options: SearchOptions,\n command: Command\n): Promise<CommandResult> {\n const programOpts = command.parent?.opts() || {};\n const explicitSources = options.project || options.global || options.registry;\n\n const result = await runSearchPipeline({\n query,\n showProject: options.project || !explicitSources,\n showGlobal: options.global || !explicitSources,\n showRegistry: options.registry || !explicitSources,\n createContext: (opts) => createCliExecutionContext({ global: opts.global, cwd: opts.cwd }),\n cwd: programOpts.cwd,\n });\n\n if (options.json) {\n displayJson(result);\n } else {\n displayResults(result, options.all || false);\n }\n\n return { success: true };\n}\n\nexport async function setupSearchCommand(args: any[]): Promise<void> {\n const [query, options, command] = args as [string | undefined, SearchOptions, Command];\n await searchCommand(query, options, command);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }