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,196 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isValidPackageDirectory,
4
+ loadPackageConfig
5
+ } from "./chunk-GSWHZBT2.js";
6
+ import {
7
+ getOpenPackageDirectories,
8
+ getPackageVersionPath,
9
+ listPackageVersions
10
+ } from "./chunk-GDVFS3YP.js";
11
+ import {
12
+ SCOPED_PACKAGE_REGEX,
13
+ normalizePackageName
14
+ } from "./chunk-VN22A7NW.js";
15
+ import {
16
+ DIR_PATTERNS,
17
+ OPENPACKAGE_DIRS,
18
+ UNVERSIONED
19
+ } from "./chunk-IHVZ5AUJ.js";
20
+ import {
21
+ logger
22
+ } from "./chunk-5EFWGD33.js";
23
+
24
+ // ../core/src/core/package-name-resolution.ts
25
+ import { join } from "path";
26
+ import * as semver from "semver";
27
+ function getScopedPackagePath(baseDir, packageName) {
28
+ let scopedMatch = packageName.match(SCOPED_PACKAGE_REGEX);
29
+ if (scopedMatch) {
30
+ let [, scope, localName] = scopedMatch;
31
+ return join(baseDir, "@" + scope, localName);
32
+ }
33
+ return join(baseDir, packageName);
34
+ }
35
+ async function checkCwdPackage(cwd, packageName) {
36
+ if (!await isValidPackageDirectory(cwd))
37
+ return null;
38
+ let manifest = await loadPackageConfig(cwd);
39
+ if (!manifest)
40
+ return null;
41
+ let normalizedCwdName = normalizePackageName(manifest.name), normalizedTargetName = normalizePackageName(packageName);
42
+ return normalizedCwdName !== normalizedTargetName ? null : (logger.debug("Found package in CWD", { packageName, path: cwd, version: manifest.version }), {
43
+ path: cwd,
44
+ version: manifest.version || UNVERSIONED,
45
+ type: "cwd",
46
+ packageName: normalizedCwdName
47
+ });
48
+ }
49
+ async function checkWorkspacePackage(cwd, packageName) {
50
+ let normalizedName = normalizePackageName(packageName), localPath = getScopedPackagePath(
51
+ join(cwd, DIR_PATTERNS.OPENPACKAGE, OPENPACKAGE_DIRS.PACKAGES),
52
+ normalizedName
53
+ );
54
+ if (!await isValidPackageDirectory(localPath))
55
+ return null;
56
+ let manifest = await loadPackageConfig(localPath);
57
+ return logger.debug("Found package in workspace", { packageName, path: localPath, version: manifest?.version }), {
58
+ path: localPath,
59
+ version: manifest?.version || UNVERSIONED,
60
+ type: "workspace",
61
+ packageName: normalizedName
62
+ };
63
+ }
64
+ async function checkGlobalPackage(packageName) {
65
+ let normalizedName = normalizePackageName(packageName), dirs = getOpenPackageDirectories(), globalPath = getScopedPackagePath(
66
+ join(dirs.data, OPENPACKAGE_DIRS.PACKAGES),
67
+ normalizedName
68
+ );
69
+ if (!await isValidPackageDirectory(globalPath))
70
+ return null;
71
+ try {
72
+ let manifest = await loadPackageConfig(globalPath);
73
+ return logger.debug("Found package in global packages", {
74
+ packageName,
75
+ path: globalPath,
76
+ version: manifest?.version
77
+ }), {
78
+ path: globalPath,
79
+ version: manifest?.version || UNVERSIONED,
80
+ type: "global",
81
+ packageName: normalizedName
82
+ };
83
+ } catch (error) {
84
+ return logger.warn("Failed to load global package manifest", { packageName, path: globalPath, error }), null;
85
+ }
86
+ }
87
+ async function checkRegistryPackage(packageName) {
88
+ let normalizedName = normalizePackageName(packageName);
89
+ try {
90
+ let registryVersions = await listPackageVersions(normalizedName);
91
+ if (registryVersions.length === 0)
92
+ return null;
93
+ let latestVersion = registryVersions[0], registryPath = getPackageVersionPath(normalizedName, latestVersion);
94
+ return logger.debug("Found package in registry", {
95
+ packageName,
96
+ path: registryPath,
97
+ version: latestVersion
98
+ }), {
99
+ path: registryPath,
100
+ version: latestVersion,
101
+ type: "registry",
102
+ packageName: normalizedName
103
+ };
104
+ } catch {
105
+ return logger.debug("No registry versions found", { packageName }), null;
106
+ }
107
+ }
108
+ function selectBestCandidate(candidates) {
109
+ if (candidates.length === 0)
110
+ throw new Error("selectBestCandidate called with empty candidates array");
111
+ if (candidates.length === 1)
112
+ return candidates[0];
113
+ let cwdCandidate = candidates.find((c) => c.type === "cwd");
114
+ if (cwdCandidate)
115
+ return cwdCandidate;
116
+ let workspaceCandidate = candidates.find((c) => c.type === "workspace");
117
+ if (workspaceCandidate)
118
+ return workspaceCandidate;
119
+ if (candidates.some((c) => c.version === UNVERSIONED)) {
120
+ let versioned = candidates.filter((c) => c.version !== UNVERSIONED);
121
+ return versioned.length > 0 ? (versioned.sort((a, b) => semver.compare(b.version, a.version)), versioned[0]) : candidates.find((c) => c.type === "global") || candidates[0];
122
+ }
123
+ return [...candidates].sort((a, b) => {
124
+ let versionCompare = semver.compare(b.version, a.version);
125
+ return versionCompare !== 0 ? versionCompare : a.type === "global" && b.type === "registry" ? -1 : a.type === "registry" && b.type === "global" ? 1 : 0;
126
+ })[0];
127
+ }
128
+ function determineSelectionReason(candidates, selected) {
129
+ if (candidates.length === 1)
130
+ return "only-source";
131
+ if (selected.type === "cwd")
132
+ return "cwd-match";
133
+ if (selected.type === "workspace")
134
+ return "workspace-override";
135
+ let other = candidates.find((c) => c !== selected && c.type !== "workspace" && c.type !== "cwd");
136
+ if (!other)
137
+ return "only-source";
138
+ if (selected.version === UNVERSIONED || other.version === UNVERSIONED)
139
+ return "newer-version";
140
+ let versionCompare = semver.compare(selected.version, other.version);
141
+ return versionCompare > 0 ? "newer-version" : versionCompare === 0 ? "same-version-prefer-mutable" : "newer-version";
142
+ }
143
+ async function resolvePackageByName(options) {
144
+ let {
145
+ cwd,
146
+ packageName,
147
+ checkCwd = !1,
148
+ searchWorkspace = !0,
149
+ searchGlobal = !0,
150
+ searchRegistry = !0
151
+ } = options, candidates = [];
152
+ if (checkCwd) {
153
+ let cwdCandidate = await checkCwdPackage(cwd, packageName);
154
+ cwdCandidate && candidates.push(cwdCandidate);
155
+ }
156
+ if (searchWorkspace) {
157
+ let workspaceCandidate = await checkWorkspacePackage(cwd, packageName);
158
+ workspaceCandidate && candidates.push(workspaceCandidate);
159
+ }
160
+ if (searchGlobal) {
161
+ let globalCandidate = await checkGlobalPackage(packageName);
162
+ globalCandidate && candidates.push(globalCandidate);
163
+ }
164
+ if (searchRegistry) {
165
+ let registryCandidate = await checkRegistryPackage(packageName);
166
+ registryCandidate && candidates.push(registryCandidate);
167
+ }
168
+ if (candidates.length === 0)
169
+ return logger.debug("No package found in any location", { packageName, options }), { found: !1 };
170
+ let selected = selectBestCandidate(candidates), reason = determineSelectionReason(candidates, selected);
171
+ return logger.info("Resolved package name", {
172
+ packageName,
173
+ selected: {
174
+ type: selected.type,
175
+ version: selected.version,
176
+ path: selected.path
177
+ },
178
+ candidateCount: candidates.length,
179
+ reason
180
+ }), {
181
+ found: !0,
182
+ path: selected.path,
183
+ version: selected.version,
184
+ sourceType: selected.type,
185
+ resolutionInfo: {
186
+ candidates,
187
+ selected,
188
+ reason
189
+ }
190
+ };
191
+ }
192
+
193
+ export {
194
+ resolvePackageByName
195
+ };
196
+ //# sourceMappingURL=chunk-3PZRVA6O.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/package-name-resolution.ts"],
4
+ "sourcesContent": ["/**\n * @fileoverview Shared package name resolution logic used by both install and pack commands.\n * \n * This module provides a unified way to resolve package names to file system paths by searching\n * across multiple locations with configurable priorities:\n * \n * Search Locations (in order):\n * 1. CWD (current working directory) - if checkCwd=true\n * 2. Workspace packages (.openpackage/packages/) - if searchWorkspace=true\n * 3. Global packages (~/.openpackage/packages/) - if searchGlobal=true\n * 4. Local registry (~/.openpackage/registry/) - if searchRegistry=true\n * \n * Priority Rules:\n * - CWD always wins if name matches and checkCwd=true (pack behavior)\n * - Workspace always wins among remaining sources (both install and pack)\n * - Between global and registry: highest version wins\n * - Tie-breaker: prefer global (mutable) over registry (immutable) on same version\n * \n * Usage Examples:\n * \n * ```typescript\n * // Pack command - prioritize CWD, skip registry (already immutable)\n * const packResult = await resolvePackageByName({\n * cwd: process.cwd(),\n * packageName: 'my-package',\n * checkCwd: true, // Check CWD first (highest priority)\n * searchWorkspace: true, // Then workspace packages\n * searchGlobal: true, // Then global packages\n * searchRegistry: false // Skip registry (already packed)\n * });\n * \n * // Install command - search all sources including registry\n * const installResult = await resolvePackageByName({\n * cwd: process.cwd(),\n * packageName: 'my-package',\n * checkCwd: false, // Don't prioritize CWD\n * searchWorkspace: true, // Check workspace packages\n * searchGlobal: true, // Check global packages\n * searchRegistry: true // Check registry (install needs this)\n * });\n * ```\n */\n\nimport { join } from 'path';\nimport * as semver from 'semver';\n\nimport { DIR_PATTERNS, OPENPACKAGE_DIRS, UNVERSIONED } from '../constants/index.js';\nimport { isValidPackageDirectory, loadPackageConfig } from './package-context.js';\nimport { getOpenPackageDirectories, listPackageVersions, getPackageVersionPath } from './directory.js';\nimport { normalizePackageName, SCOPED_PACKAGE_REGEX } from '../utils/package-name.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Types of package sources that can be resolved\n */\nexport type PackageSourceType = 'cwd' | 'workspace' | 'global' | 'registry';\n\n/**\n * A candidate package source found during resolution\n */\nexport interface PackageSourceCandidate {\n path: string;\n version: string;\n type: PackageSourceType;\n packageName: string;\n}\n\n/**\n * Information about how a package was resolved from multiple candidates\n */\nexport interface SourceResolutionInfo {\n candidates: PackageSourceCandidate[];\n selected: PackageSourceCandidate;\n reason: 'only-source' | 'newer-version' | 'same-version-prefer-mutable' | 'cwd-match' | 'workspace-override';\n}\n\n/**\n * Result of package name resolution\n */\nexport interface PackageNameResolutionResult {\n found: boolean;\n path?: string;\n version?: string;\n sourceType?: PackageSourceType;\n resolutionInfo?: SourceResolutionInfo;\n}\n\n/**\n * Options for controlling package name resolution behavior\n */\nexport interface PackageNameResolutionOptions {\n /** Current working directory */\n cwd: string;\n /** Package name to resolve */\n packageName: string;\n /** Check if CWD is the package (highest priority for pack) */\n checkCwd?: boolean;\n /** Search workspace packages (.openpackage/packages/) */\n searchWorkspace?: boolean;\n /** Search global packages (~/.openpackage/packages/) */\n searchGlobal?: boolean;\n /** Search local registry (~/.openpackage/registry/) */\n searchRegistry?: boolean;\n}\n\n/**\n * Helper to construct scoped package paths (@scope/name)\n */\nfunction getScopedPackagePath(baseDir: string, packageName: string): string {\n const scopedMatch = packageName.match(SCOPED_PACKAGE_REGEX);\n if (scopedMatch) {\n const [, scope, localName] = scopedMatch;\n return join(baseDir, '@' + scope, localName);\n }\n return join(baseDir, packageName);\n}\n\n/**\n * Check if CWD is a valid package directory with matching name\n */\nasync function checkCwdPackage(\n cwd: string,\n packageName: string\n): Promise<PackageSourceCandidate | null> {\n if (!await isValidPackageDirectory(cwd)) {\n return null;\n }\n\n const manifest = await loadPackageConfig(cwd);\n if (!manifest) {\n return null;\n }\n\n // Check if name matches (case-insensitive)\n const normalizedCwdName = normalizePackageName(manifest.name);\n const normalizedTargetName = normalizePackageName(packageName);\n \n if (normalizedCwdName !== normalizedTargetName) {\n return null;\n }\n\n logger.debug('Found package in CWD', { packageName, path: cwd, version: manifest.version });\n \n return {\n path: cwd,\n version: manifest.version || UNVERSIONED,\n type: 'cwd',\n packageName: normalizedCwdName\n };\n}\n\n/**\n * Check workspace packages directory\n */\nasync function checkWorkspacePackage(\n cwd: string,\n packageName: string\n): Promise<PackageSourceCandidate | null> {\n const normalizedName = normalizePackageName(packageName);\n const localPath = getScopedPackagePath(\n join(cwd, DIR_PATTERNS.OPENPACKAGE, OPENPACKAGE_DIRS.PACKAGES),\n normalizedName\n );\n\n if (!await isValidPackageDirectory(localPath)) {\n return null;\n }\n\n const manifest = await loadPackageConfig(localPath);\n logger.debug('Found package in workspace', { packageName, path: localPath, version: manifest?.version });\n\n return {\n path: localPath,\n version: manifest?.version || UNVERSIONED,\n type: 'workspace',\n packageName: normalizedName\n };\n}\n\n/**\n * Check global packages directory\n */\nasync function checkGlobalPackage(\n packageName: string\n): Promise<PackageSourceCandidate | null> {\n const normalizedName = normalizePackageName(packageName);\n const dirs = getOpenPackageDirectories();\n const globalPath = getScopedPackagePath(\n join(dirs.data, OPENPACKAGE_DIRS.PACKAGES),\n normalizedName\n );\n\n if (!await isValidPackageDirectory(globalPath)) {\n return null;\n }\n\n try {\n const manifest = await loadPackageConfig(globalPath);\n logger.debug('Found package in global packages', { \n packageName, \n path: globalPath,\n version: manifest?.version \n });\n\n return {\n path: globalPath,\n version: manifest?.version || UNVERSIONED,\n type: 'global',\n packageName: normalizedName\n };\n } catch (error) {\n logger.warn('Failed to load global package manifest', { packageName, path: globalPath, error });\n return null;\n }\n}\n\n/**\n * Check local registry (get latest version)\n */\nasync function checkRegistryPackage(\n packageName: string\n): Promise<PackageSourceCandidate | null> {\n const normalizedName = normalizePackageName(packageName);\n \n try {\n const registryVersions = await listPackageVersions(normalizedName);\n if (registryVersions.length === 0) {\n return null;\n }\n\n const latestVersion = registryVersions[0]; // Already sorted desc\n const registryPath = getPackageVersionPath(normalizedName, latestVersion);\n \n logger.debug('Found package in registry', { \n packageName, \n path: registryPath,\n version: latestVersion \n });\n\n return {\n path: registryPath,\n version: latestVersion,\n type: 'registry',\n packageName: normalizedName\n };\n } catch (error) {\n logger.debug('No registry versions found', { packageName });\n return null;\n }\n}\n\n/**\n * Select the best candidate from multiple package sources\n * Priority rules:\n * 1. CWD always wins (if checked and found)\n * 2. Workspace always wins (among non-CWD)\n * 3. Highest version between global and registry\n * 4. Tie-breaker: prefer global (mutable) over registry (immutable)\n */\nfunction selectBestCandidate(candidates: PackageSourceCandidate[]): PackageSourceCandidate {\n if (candidates.length === 0) {\n throw new Error('selectBestCandidate called with empty candidates array');\n }\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n // CWD always wins if present\n const cwdCandidate = candidates.find(c => c.type === 'cwd');\n if (cwdCandidate) {\n return cwdCandidate;\n }\n\n // Workspace always wins (among non-CWD)\n const workspaceCandidate = candidates.find(c => c.type === 'workspace');\n if (workspaceCandidate) {\n return workspaceCandidate;\n }\n\n // Now we only have global and/or registry candidates\n // Handle unversioned packages\n const hasUnversioned = candidates.some(c => c.version === UNVERSIONED);\n if (hasUnversioned) {\n // Prefer versioned over unversioned\n const versioned = candidates.filter(c => c.version !== UNVERSIONED);\n if (versioned.length > 0) {\n // Return highest versioned\n versioned.sort((a, b) => semver.compare(b.version, a.version));\n return versioned[0];\n }\n // All unversioned - prefer global\n const global = candidates.find(c => c.type === 'global');\n return global || candidates[0];\n }\n\n // Sort by version (highest first), prefer global on tie\n const sorted = [...candidates].sort((a, b) => {\n const versionCompare = semver.compare(b.version, a.version);\n if (versionCompare !== 0) return versionCompare;\n\n // Tie-breaker: same version, prefer global (mutable)\n if (a.type === 'global' && b.type === 'registry') return -1;\n if (a.type === 'registry' && b.type === 'global') return 1;\n return 0;\n });\n\n return sorted[0];\n}\n\n/**\n * Determine the reason why a particular candidate was selected\n */\nfunction determineSelectionReason(\n candidates: PackageSourceCandidate[],\n selected: PackageSourceCandidate\n): SourceResolutionInfo['reason'] {\n if (candidates.length === 1) {\n return 'only-source';\n }\n\n if (selected.type === 'cwd') {\n return 'cwd-match';\n }\n\n if (selected.type === 'workspace') {\n return 'workspace-override';\n }\n\n // Compare with other candidates (global vs registry)\n const other = candidates.find(c => c !== selected && c.type !== 'workspace' && c.type !== 'cwd');\n if (!other) {\n return 'only-source';\n }\n\n // Handle unversioned comparisons\n if (selected.version === UNVERSIONED || other.version === UNVERSIONED) {\n return 'newer-version';\n }\n\n const versionCompare = semver.compare(selected.version, other.version);\n\n if (versionCompare > 0) {\n return 'newer-version';\n } else if (versionCompare === 0) {\n return 'same-version-prefer-mutable';\n }\n\n // Shouldn't reach here since we select highest\n return 'newer-version';\n}\n\n/**\n * Resolve a package name to a file system path.\n * \n * This function searches for packages in various locations based on the provided options:\n * - CWD (current working directory) - if checkCwd is true\n * - Workspace packages (.openpackage/packages/)\n * - Global packages (~/.openpackage/packages/)\n * - Local registry (~/.openpackage/registry/)\n * \n * Priority order:\n * 1. CWD (if name matches and checkCwd=true) - highest priority for pack\n * 2. Workspace packages - always wins among remaining sources\n * 3. Global vs Registry - version comparison, prefer higher version\n * 4. Tie-breaker - same version prefers global (mutable)\n * \n * @param options - Resolution options\n * @returns Resolution result with path and metadata\n */\nexport async function resolvePackageByName(\n options: PackageNameResolutionOptions\n): Promise<PackageNameResolutionResult> {\n const {\n cwd,\n packageName,\n checkCwd = false,\n searchWorkspace = true,\n searchGlobal = true,\n searchRegistry = true\n } = options;\n\n const candidates: PackageSourceCandidate[] = [];\n\n // 1. Check CWD (highest priority for pack)\n if (checkCwd) {\n const cwdCandidate = await checkCwdPackage(cwd, packageName);\n if (cwdCandidate) {\n candidates.push(cwdCandidate);\n }\n }\n\n // 2. Check workspace packages\n if (searchWorkspace) {\n const workspaceCandidate = await checkWorkspacePackage(cwd, packageName);\n if (workspaceCandidate) {\n candidates.push(workspaceCandidate);\n }\n }\n\n // 3. Check global packages\n if (searchGlobal) {\n const globalCandidate = await checkGlobalPackage(packageName);\n if (globalCandidate) {\n candidates.push(globalCandidate);\n }\n }\n\n // 4. Check local registry\n if (searchRegistry) {\n const registryCandidate = await checkRegistryPackage(packageName);\n if (registryCandidate) {\n candidates.push(registryCandidate);\n }\n }\n\n // No candidates found\n if (candidates.length === 0) {\n logger.debug('No package found in any location', { packageName, options });\n return { found: false };\n }\n\n // Select best candidate\n const selected = selectBestCandidate(candidates);\n const reason = determineSelectionReason(candidates, selected);\n\n logger.info('Resolved package name', {\n packageName,\n selected: {\n type: selected.type,\n version: selected.version,\n path: selected.path\n },\n candidateCount: candidates.length,\n reason\n });\n\n return {\n found: true,\n path: selected.path,\n version: selected.version,\n sourceType: selected.type,\n resolutionInfo: {\n candidates,\n selected,\n reason\n }\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isScopedName
4
+ } from "./chunk-VN22A7NW.js";
5
+ import {
6
+ readTextFile,
7
+ writeTextFile
8
+ } from "./chunk-S47F4OG4.js";
9
+
10
+ // ../core/src/utils/package-yml.ts
11
+ import * as yaml from "js-yaml";
12
+ async function parsePackageYml(packageYmlPath) {
13
+ try {
14
+ let content = await readTextFile(packageYmlPath), parsed = yaml.load(content), isPartial = parsed.partial === !0;
15
+ parsed.packages && !parsed.dependencies && (parsed.dependencies = parsed.packages), delete parsed.packages, parsed["dev-packages"] && !parsed["dev-dependencies"] && (parsed["dev-dependencies"] = parsed["dev-packages"]), delete parsed["dev-packages"];
16
+ let needsPluginMigration = !1, needsGitHubMigration = !1, needsSubdirectoryMigration = !1, { detectOldPluginNaming, detectOldGitHubNaming } = await import("./plugin-naming-YP2I4NPA.js");
17
+ if (parsed.dependencies)
18
+ for (let dep of parsed.dependencies) {
19
+ delete dep.include;
20
+ let newPluginName = detectOldPluginNaming(dep);
21
+ newPluginName && (dep.name = newPluginName, needsPluginMigration = !0);
22
+ let newGitHubName = detectOldGitHubNaming(dep);
23
+ if (newGitHubName && (dep.name = newGitHubName, needsGitHubMigration = !0), dep.git && !dep.url && (dep.url = dep.git, dep.ref && (dep.url.includes("#") || (dep.url = `${dep.url}#${dep.ref}`), delete dep.ref), delete dep.git), dep.subdirectory && (dep.git || dep.url) && !dep.path) {
24
+ let normalizedPath = dep.subdirectory.startsWith("./") ? dep.subdirectory.substring(2) : dep.subdirectory;
25
+ dep.path = normalizedPath, delete dep.subdirectory, needsSubdirectoryMigration = !0;
26
+ }
27
+ }
28
+ if (parsed["dev-dependencies"])
29
+ for (let dep of parsed["dev-dependencies"]) {
30
+ delete dep.include;
31
+ let newPluginName = detectOldPluginNaming(dep);
32
+ newPluginName && (dep.name = newPluginName, needsPluginMigration = !0);
33
+ let newGitHubName = detectOldGitHubNaming(dep);
34
+ if (newGitHubName && (dep.name = newGitHubName, needsGitHubMigration = !0), dep.git && !dep.url && (dep.url = dep.git, dep.ref && (dep.url.includes("#") || (dep.url = `${dep.url}#${dep.ref}`), delete dep.ref), delete dep.git), dep.subdirectory && (dep.git || dep.url) && !dep.path) {
35
+ let normalizedPath = dep.subdirectory.startsWith("./") ? dep.subdirectory.substring(2) : dep.subdirectory;
36
+ dep.path = normalizedPath, delete dep.subdirectory, needsSubdirectoryMigration = !0;
37
+ }
38
+ }
39
+ needsPluginMigration && (parsed._needsPluginMigration = !0), needsGitHubMigration && (parsed._needsGitHubMigration = !0), needsSubdirectoryMigration && (parsed._needsSubdirectoryMigration = !0);
40
+ let validateDependencies = (deps, section) => {
41
+ if (deps)
42
+ for (let dep of deps) {
43
+ let hasGitSource = dep.git || dep.url;
44
+ if ((hasGitSource ? [dep.version, dep.git, dep.url].filter(Boolean) : [dep.version, dep.path, dep.git, dep.url].filter(Boolean)).length > 1)
45
+ throw new Error(
46
+ `openpackage.yml ${section}: dependency '${dep.name}' has multiple sources; specify at most one of version, path, url, or git`
47
+ );
48
+ if (dep.ref && !(dep.git || dep.url))
49
+ throw new Error(
50
+ `openpackage.yml ${section}: dependency '${dep.name}' has ref but no git/url source`
51
+ );
52
+ if (dep.subdirectory && !hasGitSource)
53
+ throw new Error(
54
+ `openpackage.yml ${section}: dependency '${dep.name}' has subdirectory field without git/url source`
55
+ );
56
+ if (dep.subdirectory && dep.path)
57
+ throw new Error(
58
+ `openpackage.yml ${section}: dependency '${dep.name}' has both subdirectory and path fields; use path only`
59
+ );
60
+ if (dep.base !== void 0) {
61
+ if (typeof dep.base != "string")
62
+ throw new Error(
63
+ `openpackage.yml ${section}: dependency '${dep.name}' has invalid base field; must be a string`
64
+ );
65
+ if (dep.base.startsWith("/"))
66
+ throw new Error(
67
+ `openpackage.yml ${section}: dependency '${dep.name}' has absolute base path; base must be relative to repository root`
68
+ );
69
+ }
70
+ }
71
+ };
72
+ if (!parsed.name)
73
+ throw new Error("openpackage.yml must contain a name field");
74
+ return isPartial ? parsed.partial = !0 : delete parsed.partial, validateDependencies(parsed.dependencies, "dependencies"), validateDependencies(parsed["dev-dependencies"], "dev-dependencies"), validateDependencies(parsed.packages, "packages"), validateDependencies(parsed["dev-packages"], "dev-packages"), parsed;
75
+ } catch (error) {
76
+ throw new Error(`Failed to parse openpackage.yml: ${error}`);
77
+ }
78
+ }
79
+ function serializePackageYml(config) {
80
+ let content = yaml.dump(config, {
81
+ indent: 2,
82
+ noArrayIndent: !0,
83
+ sortKeys: !1,
84
+ quotingType: '"',
85
+ // Prefer double quotes for consistency
86
+ lineWidth: -1
87
+ // Disable line wrapping to prevent folded scalar style (>-)
88
+ });
89
+ if (isScopedName(config.name)) {
90
+ let lines = content.split(`
91
+ `);
92
+ for (let i = 0; i < lines.length; i++)
93
+ if (lines[i].trim().startsWith("name:")) {
94
+ let valueMatch = lines[i].match(/name:\s*(.+)$/);
95
+ if (valueMatch) {
96
+ let value = valueMatch[1].trim();
97
+ !value.startsWith('"') && !value.startsWith("'") && (lines[i] = lines[i].replace(/name:\s*(.+)$/, `name: "${config.name}"`));
98
+ }
99
+ break;
100
+ }
101
+ content = lines.join(`
102
+ `);
103
+ }
104
+ let flowStyleArrays = ["keywords"];
105
+ for (let arrayField of flowStyleArrays) {
106
+ let arrayValue = config[arrayField];
107
+ if (Array.isArray(arrayValue) && arrayValue.length > 0) {
108
+ let lines = content.split(`
109
+ `), result = [], i = 0;
110
+ for (; i < lines.length; ) {
111
+ let line = lines[i];
112
+ if (line.trim() === `${arrayField}:`) {
113
+ let arrayFlow = `${arrayField}: [${arrayValue.join(", ")}]`;
114
+ for (result.push(arrayFlow), i++; i < lines.length && lines[i].trim().startsWith("-"); )
115
+ i++;
116
+ continue;
117
+ }
118
+ result.push(line), i++;
119
+ }
120
+ content = result.join(`
121
+ `);
122
+ }
123
+ }
124
+ return content;
125
+ }
126
+ async function writePackageYml(packageYmlPath, config) {
127
+ let migratedConfig = { ...config };
128
+ migratedConfig.packages && !migratedConfig.dependencies && (migratedConfig.dependencies = migratedConfig.packages), delete migratedConfig.packages, migratedConfig["dev-packages"] && !migratedConfig["dev-dependencies"] && (migratedConfig["dev-dependencies"] = migratedConfig["dev-packages"]), delete migratedConfig["dev-packages"];
129
+ let cleanLegacyFields = (deps) => {
130
+ if (deps)
131
+ for (let dep of deps)
132
+ delete dep.subdirectory, delete dep.git, delete dep.ref, delete dep.include;
133
+ };
134
+ if (cleanLegacyFields(migratedConfig.dependencies), cleanLegacyFields(migratedConfig["dev-dependencies"]), config._needsPluginMigration) {
135
+ let { logger } = await import("./logger-WHZJRF6G.js");
136
+ logger.info("\u2713 Migrated plugin naming to new format"), delete migratedConfig._needsPluginMigration;
137
+ }
138
+ if (config._needsGitHubMigration) {
139
+ let { logger } = await import("./logger-WHZJRF6G.js");
140
+ logger.info("\u2713 Migrated GitHub package names to new format"), delete migratedConfig._needsGitHubMigration;
141
+ }
142
+ if (config._needsSubdirectoryMigration) {
143
+ let { logger } = await import("./logger-WHZJRF6G.js");
144
+ logger.info("\u2713 Migrated subdirectory fields to path"), delete migratedConfig._needsSubdirectoryMigration;
145
+ }
146
+ let content = serializePackageYml(migratedConfig);
147
+ await writeTextFile(packageYmlPath, content);
148
+ }
149
+
150
+ export {
151
+ parsePackageYml,
152
+ serializePackageYml,
153
+ writePackageYml
154
+ };
155
+ //# sourceMappingURL=chunk-427DCURL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/utils/package-yml.ts"],
4
+ "sourcesContent": ["import * as yaml from 'js-yaml';\nimport { PackageDependency, PackageYml } from '../types/index.js';\nimport { readTextFile, writeTextFile } from './fs.js';\nimport { isScopedName } from './package-name.js';\n\n/**\n * Parse openpackage.yml file with validation and backward compatibility\n */\nexport async function parsePackageYml(packageYmlPath: string): Promise<PackageYml> {\n try {\n const content = await readTextFile(packageYmlPath);\n const parsed = yaml.load(content) as PackageYml;\n const isPartial = (parsed as any).partial === true;\n \n // Backward compatibility: migrate old keys to new keys\n if (parsed.packages && !parsed.dependencies) {\n parsed.dependencies = parsed.packages;\n }\n // Delete old key to ensure it doesn't persist through round-trip serialization\n delete parsed.packages;\n \n if (parsed['dev-packages'] && !parsed['dev-dependencies']) {\n parsed['dev-dependencies'] = parsed['dev-packages'];\n }\n // Delete old key to ensure it doesn't persist through round-trip serialization\n delete parsed['dev-packages'];\n \n // Auto-migrate old plugin naming format\n let needsPluginMigration = false;\n let needsGitHubMigration = false;\n let needsSubdirectoryMigration = false;\n const { detectOldPluginNaming, detectOldGitHubNaming } = await import('./plugin-naming.js');\n \n if (parsed.dependencies) {\n for (const dep of parsed.dependencies) {\n // Ignore deprecated include field from legacy manifests\n delete (dep as any).include;\n\n // Check for old plugin naming (marketplace name vs repo name)\n const newPluginName = detectOldPluginNaming(dep);\n if (newPluginName) {\n dep.name = newPluginName;\n needsPluginMigration = true;\n }\n \n // Check for old GitHub naming (@username/repo vs gh@username/repo)\n const newGitHubName = detectOldGitHubNaming(dep);\n if (newGitHubName) {\n dep.name = newGitHubName;\n needsGitHubMigration = true;\n }\n \n // Migrate git \u2192 url and ref \u2192 embed in url\n if (dep.git && !dep.url) {\n dep.url = dep.git;\n if (dep.ref) {\n // Only embed ref if url doesn't already have one\n if (!dep.url.includes('#')) {\n dep.url = `${dep.url}#${dep.ref}`;\n }\n delete dep.ref;\n }\n delete dep.git;\n }\n \n // Migrate subdirectory field to path field\n if (dep.subdirectory && (dep.git || dep.url) && !dep.path) {\n // Normalize path: strip leading ./ if present\n const normalizedPath = dep.subdirectory.startsWith('./')\n ? dep.subdirectory.substring(2)\n : dep.subdirectory;\n dep.path = normalizedPath;\n delete dep.subdirectory;\n needsSubdirectoryMigration = true;\n }\n }\n }\n \n if (parsed['dev-dependencies']) {\n for (const dep of parsed['dev-dependencies']) {\n // Ignore deprecated include field from legacy manifests\n delete (dep as any).include;\n\n // Check for old plugin naming (marketplace name vs repo name)\n const newPluginName = detectOldPluginNaming(dep);\n if (newPluginName) {\n dep.name = newPluginName;\n needsPluginMigration = true;\n }\n \n // Check for old GitHub naming (@username/repo vs gh@username/repo)\n const newGitHubName = detectOldGitHubNaming(dep);\n if (newGitHubName) {\n dep.name = newGitHubName;\n needsGitHubMigration = true;\n }\n \n // Migrate git \u2192 url and ref \u2192 embed in url\n if (dep.git && !dep.url) {\n dep.url = dep.git;\n if (dep.ref) {\n // Only embed ref if url doesn't already have one\n if (!dep.url.includes('#')) {\n dep.url = `${dep.url}#${dep.ref}`;\n }\n delete dep.ref;\n }\n delete dep.git;\n }\n \n // Migrate subdirectory field to path field\n if (dep.subdirectory && (dep.git || dep.url) && !dep.path) {\n // Normalize path: strip leading ./ if present\n const normalizedPath = dep.subdirectory.startsWith('./')\n ? dep.subdirectory.substring(2)\n : dep.subdirectory;\n dep.path = normalizedPath;\n delete dep.subdirectory;\n needsSubdirectoryMigration = true;\n }\n }\n }\n \n // Mark for logging on write\n if (needsPluginMigration) {\n (parsed as any)._needsPluginMigration = true;\n }\n if (needsGitHubMigration) {\n (parsed as any)._needsGitHubMigration = true;\n }\n if (needsSubdirectoryMigration) {\n (parsed as any)._needsSubdirectoryMigration = true;\n }\n \n const validateDependencies = (deps: PackageDependency[] | undefined, section: string): void => {\n if (!deps) return;\n for (const dep of deps) {\n // For git/url sources, path is a subdirectory, not a source\n // For non-git sources, path is a source\n const hasGitSource = dep.git || dep.url;\n const sources = hasGitSource\n ? [dep.version, dep.git, dep.url].filter(Boolean)\n : [dep.version, dep.path, dep.git, dep.url].filter(Boolean);\n \n if (sources.length > 1) {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has multiple sources; specify at most one of version, path, url, or git`\n );\n }\n if (dep.ref && !(dep.git || dep.url)) {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has ref but no git/url source`\n );\n }\n // Validate legacy subdirectory field (should have been migrated)\n if (dep.subdirectory && !hasGitSource) {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has subdirectory field without git/url source`\n );\n }\n // Warn if both subdirectory and path exist (shouldn't happen after migration)\n if (dep.subdirectory && dep.path) {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has both subdirectory and path fields; use path only`\n );\n }\n // Phase 5: Validate base field\n if (dep.base !== undefined) {\n // Base should be a string (relative path)\n if (typeof dep.base !== 'string') {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has invalid base field; must be a string`\n );\n }\n // Base should not start with / or be absolute\n if (dep.base.startsWith('/')) {\n throw new Error(\n `openpackage.yml ${section}: dependency '${dep.name}' has absolute base path; base must be relative to repository root`\n );\n }\n }\n }\n };\n \n // Validate required fields\n if (!parsed.name) {\n throw new Error('openpackage.yml must contain a name field');\n }\n\n if (isPartial) {\n (parsed as any).partial = true;\n } else {\n delete (parsed as any).partial;\n }\n\n // Validate both old and new keys\n validateDependencies(parsed.dependencies, 'dependencies');\n validateDependencies(parsed['dev-dependencies'], 'dev-dependencies');\n validateDependencies(parsed.packages, 'packages');\n validateDependencies(parsed['dev-packages'], 'dev-packages');\n \n return parsed;\n } catch (error) {\n throw new Error(`Failed to parse openpackage.yml: ${error}`);\n }\n}\n\n/**\n * Write openpackage.yml file with consistent formatting\n */\nexport function serializePackageYml(config: PackageYml): string {\n // First generate YAML with default block style\n let content = yaml.dump(config, {\n indent: 2,\n noArrayIndent: true,\n sortKeys: false,\n quotingType: '\"', // Prefer double quotes for consistency\n lineWidth: -1, // Disable line wrapping to prevent folded scalar style (>-)\n });\n\n // Ensure scoped names (starting with @ or gh@) are quoted\n const scoped = isScopedName(config.name);\n if (scoped) {\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim().startsWith('name:')) {\n const valueMatch = lines[i].match(/name:\\s*(.+)$/);\n if (valueMatch) {\n const value = valueMatch[1].trim();\n if (!value.startsWith('\"') && !value.startsWith(\"'\")) {\n lines[i] = lines[i].replace(/name:\\s*(.+)$/, `name: \"${config.name}\"`);\n }\n }\n break;\n }\n }\n content = lines.join('\\n');\n }\n\n // Convert arrays from block style to flow style\n const flowStyleArrays = ['keywords'];\n\n for (const arrayField of flowStyleArrays) {\n const arrayValue = config[arrayField as keyof PackageYml];\n if (Array.isArray(arrayValue) && arrayValue.length > 0) {\n const lines = content.split('\\n');\n const result: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n if (line.trim() === `${arrayField}:`) {\n const arrayFlow = `${arrayField}: [${arrayValue.join(', ')}]`;\n result.push(arrayFlow);\n\n i++;\n while (i < lines.length && lines[i].trim().startsWith('-')) {\n i++;\n }\n continue;\n }\n\n result.push(line);\n i++;\n }\n\n content = result.join('\\n');\n }\n }\n\n return content;\n}\n\nexport async function writePackageYml(packageYmlPath: string, config: PackageYml): Promise<void> {\n // Auto-migrate old keys to new keys when writing\n const migratedConfig = { ...config };\n \n // Rename packages -> dependencies\n if (migratedConfig.packages && !migratedConfig.dependencies) {\n migratedConfig.dependencies = migratedConfig.packages;\n }\n delete migratedConfig.packages;\n \n // Rename dev-packages -> dev-dependencies\n if (migratedConfig['dev-packages'] && !migratedConfig['dev-dependencies']) {\n migratedConfig['dev-dependencies'] = migratedConfig['dev-packages'];\n }\n delete migratedConfig['dev-packages'];\n \n // Clean up legacy fields from all dependencies\n const cleanLegacyFields = (deps: PackageDependency[] | undefined) => {\n if (!deps) return;\n for (const dep of deps) {\n delete dep.subdirectory;\n delete dep.git;\n delete dep.ref;\n delete (dep as any).include;\n }\n };\n \n cleanLegacyFields(migratedConfig.dependencies);\n cleanLegacyFields(migratedConfig['dev-dependencies']);\n \n // Log if plugin naming was migrated\n if ((config as any)._needsPluginMigration) {\n const { logger } = await import('./logger.js');\n logger.info('\u2713 Migrated plugin naming to new format');\n delete (migratedConfig as any)._needsPluginMigration;\n }\n \n // Log if GitHub naming was migrated\n if ((config as any)._needsGitHubMigration) {\n const { logger } = await import('./logger.js');\n logger.info('\u2713 Migrated GitHub package names to new format');\n delete (migratedConfig as any)._needsGitHubMigration;\n }\n \n // Log if subdirectory field was migrated\n if ((config as any)._needsSubdirectoryMigration) {\n const { logger } = await import('./logger.js');\n logger.info('\u2713 Migrated subdirectory fields to path');\n delete (migratedConfig as any)._needsSubdirectoryMigration;\n }\n \n const content = serializePackageYml(migratedConfig);\n await writeTextFile(packageYmlPath, content);\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ consoleOutput,
4
+ normalizePathWithTilde
5
+ } from "./chunk-BROJ6OUT.js";
6
+
7
+ // ../core/src/utils/formatters.ts
8
+ import { relative, isAbsolute } from "path";
9
+ function formatPathForDisplay(path, cwd = process.cwd()) {
10
+ if (path.startsWith("~") || !isAbsolute(path))
11
+ return path;
12
+ let relativePath = relative(cwd, path);
13
+ if (relativePath && !relativePath.startsWith(".."))
14
+ return relativePath;
15
+ let tildePath = normalizePathWithTilde(path);
16
+ return tildePath.startsWith("~") ? tildePath : path;
17
+ }
18
+ function getTreeConnector(isLast) {
19
+ return isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
20
+ }
21
+ function formatFileCount(count, type = "files") {
22
+ return `${count} ${count === 1 ? type.slice(0, -1) : type}`;
23
+ }
24
+ function formatFileSize(bytes) {
25
+ let mb = bytes / 1048576;
26
+ return mb >= 1 ? `${mb.toFixed(2)}MB` : `${(bytes / 1024).toFixed(2)}KB`;
27
+ }
28
+ function formatScopeTag(scope) {
29
+ return scope === "global" ? " [global]" : "";
30
+ }
31
+ function formatScopeBadge(scopes) {
32
+ return typeof scopes == "string" ? scopes === "global" ? "[global]" : "" : scopes.has("global") ? "[global]" : "";
33
+ }
34
+ function displayPackageConfig(packageConfig, path, isExisting = !1, output) {
35
+ let out = output ?? consoleOutput, action = isExisting ? "already exists" : "created", displayPath = formatPathForDisplay(path);
36
+ out.success(`${displayPath} ${action}`), out.message(` Name: ${packageConfig.name}`), packageConfig.version && out.message(` Version: ${packageConfig.version}`), packageConfig.description && out.message(` Description: ${packageConfig.description}`), packageConfig.keywords && packageConfig.keywords.length > 0 && out.message(` Keywords: ${packageConfig.keywords.join(", ")}`), packageConfig.private && out.message(" Private: Yes");
37
+ }
38
+
39
+ export {
40
+ formatPathForDisplay,
41
+ getTreeConnector,
42
+ formatFileCount,
43
+ formatFileSize,
44
+ formatScopeTag,
45
+ formatScopeBadge,
46
+ displayPackageConfig
47
+ };
48
+ //# sourceMappingURL=chunk-4B5HJLP2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/utils/formatters.ts"],
4
+ "sourcesContent": ["import { PackageYml } from '../types/index.js';\nimport { relative, isAbsolute } from 'path';\nimport { normalizePathWithTilde } from './home-directory.js';\nimport type { OutputPort } from '../core/ports/output.js';\nimport { consoleOutput } from '../core/ports/console-output.js';\n\n/**\n * Formatting utilities for consistent display across commands\n */\n\n/**\n * Format a file system path for display to the user.\n * \n * This function provides a unified way to display paths across all commands:\n * - Uses tilde notation (~) for paths under home directory (e.g., ~/.claude/..., ~/.config/..., ~/.openpackage/...)\n * - Uses relative paths from cwd for paths in the workspace\n * - Falls back to absolute path for other cases\n * \n * @param path - The path to format (can be absolute or relative)\n * @param cwd - Current working directory (defaults to process.cwd())\n * @returns Formatted path string for display\n * \n * @example\n * formatPathForDisplay('/Users/user/.openpackage/packages/my-pkg') // => '~/.openpackage/packages/my-pkg'\n * formatPathForDisplay('/Users/user/.claude/agents/x.md') // => '~/.claude/agents/x.md'\n * formatPathForDisplay('/Users/user/workspace/file.txt', '/Users/user/workspace') // => 'file.txt'\n * formatPathForDisplay('./relative/path.txt') // => './relative/path.txt'\n */\nexport function formatPathForDisplay(path: string, cwd: string = process.cwd()): string {\n // If path is already in tilde notation, return as-is\n if (path.startsWith('~')) {\n return path;\n }\n \n // If path is relative, return as-is\n if (!isAbsolute(path)) {\n return path;\n }\n \n // Try relative path from cwd first (paths in workspace take precedence)\n const relativePath = relative(cwd, path);\n if (relativePath && !relativePath.startsWith('..')) {\n // Only use relative path if it's within cwd (doesn't start with ..)\n return relativePath;\n }\n \n // Use tilde notation for any path under home directory (~/.claude, ~/.config, ~/.cursor, ~/.openpackage, etc.)\n const tildePath = normalizePathWithTilde(path);\n if (tildePath.startsWith('~')) {\n return tildePath;\n }\n \n // Fall back to absolute path\n return path;\n}\n\n/**\n * Interface for package table entries\n */\nexport interface PackageTableEntry {\n name: string;\n version: string;\n description?: string;\n status?: string;\n type?: string;\n available?: string;\n}\n\n/**\n * Format and display an extended package table with status information (used by list command)\n */\nexport function displayExtendedPackageTable(packages: PackageTableEntry[], output?: OutputPort): void {\n const out = output ?? consoleOutput;\n if (packages.length === 0) {\n out.message('No packages found.');\n return;\n }\n \n // Table header\n out.message('FORMULA'.padEnd(20) + 'INSTALLED'.padEnd(12) + 'STATUS'.padEnd(15) + 'TYPE'.padEnd(15) + 'AVAILABLE');\n out.message('-------'.padEnd(20) + '---------'.padEnd(12) + '------'.padEnd(15) + '----'.padEnd(15) + '---------');\n \n // Display each package\n for (const pkg of packages) {\n const name = pkg.name.padEnd(20);\n const version = pkg.version.padEnd(12);\n const status = (pkg.status || '').padEnd(15);\n const type = (pkg.type || '').padEnd(15);\n const available = (pkg.available || '-').padEnd(9);\n \n out.message(`${name}${version}${status}${type}${available}`);\n }\n \n out.message('');\n out.message(`Total: ${packages.length} packages`);\n}\n\n/**\n * Generic table formatter for custom column layouts\n */\nexport function displayCustomTable<T>(\n items: T[],\n columns: Array<{\n header: string;\n width: number;\n accessor: (item: T) => string;\n }>,\n title?: string,\n output?: OutputPort\n): void {\n const out = output ?? consoleOutput;\n if (title) {\n out.message(title);\n out.message('');\n }\n \n if (items.length === 0) {\n out.message('No items found.');\n return;\n }\n \n // Build header\n const headerLine = columns.map(col => col.header.padEnd(col.width)).join('');\n const separatorLine = columns.map(col => '-'.repeat(col.header.length).padEnd(col.width)).join('');\n \n out.message(headerLine);\n out.message(separatorLine);\n \n // Display rows\n for (const item of items) {\n const row = columns.map(col => col.accessor(item).padEnd(col.width)).join('');\n out.message(row);\n }\n \n out.message('');\n out.message(`Total: ${items.length} items`);\n}\n\n/**\n * Format project summary line\n */\nexport function formatProjectSummary(name: string, version: string): string {\n return `${name}@${version}`;\n}\n\n/**\n * Format tree connector symbols\n */\nexport function getTreeConnector(isLast: boolean): string {\n return isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n}\n\n/**\n * Format tree prefix for nested items\n */\nexport function getTreePrefix(prefix: string, isLast: boolean): string {\n return prefix + (isLast ? ' ' : '\u2502 ');\n}\n\n/**\n * Format status with appropriate emoji\n */\nexport function formatStatus(status: string): string {\n switch (status.toLowerCase()) {\n case 'installed':\n return '\u2705 installed';\n case 'missing':\n return '\u274C missing';\n case 'outdated':\n return '\u26A0\uFE0F outdated';\n case 'dependency-mismatch':\n return '\uD83D\uDD04 mismatch';\n default:\n return status;\n }\n}\n\n/**\n * Format file count with appropriate description\n */\nexport function formatFileCount(count: number, type: string = 'files'): string {\n return `${count} ${count === 1 ? type.slice(0, -1) : type}`;\n}\n\n/**\n * Format dependency list for display\n */\nexport function formatDependencyList(dependencies: Array<{ name: string; version: string }>): string[] {\n return dependencies.map(dep => `${dep.name}@${dep.version}`);\n}\n\n/**\n * Format file size in appropriate units (KB or MB)\n */\nexport function formatFileSize(bytes: number): string {\n const mb = bytes / (1024 * 1024);\n if (mb >= 1) {\n return `${mb.toFixed(2)}MB`;\n }\n const kb = bytes / 1024;\n return `${kb.toFixed(2)}KB`;\n}\n\n/**\n * Format a single scope as a tag.\n * Only [global] is shown \u2014 [project] is the default context and omitted to reduce noise.\n */\nexport function formatScopeTag(scope: string): string {\n return scope === 'global' ? ' [global]' : '';\n}\n\n/**\n * Format one or more scopes as a badge.\n * Only [global] is shown \u2014 [project] is the default context and omitted to reduce noise.\n */\nexport function formatScopeBadge(scopes: Set<string> | string): string {\n if (typeof scopes === 'string') {\n return scopes === 'global' ? '[global]' : '';\n }\n const hasGlobal = scopes.has('global');\n return hasGlobal ? '[global]' : '';\n}\n\n/**\n * Display package configuration details in a consistent format\n */\nexport function displayPackageConfig(packageConfig: PackageYml, path: string, isExisting: boolean = false, output?: OutputPort): void {\n const out = output ?? consoleOutput;\n const action = isExisting ? 'already exists' : 'created';\n const displayPath = formatPathForDisplay(path);\n \n out.success(`${displayPath} ${action}`);\n\n out.message(` Name: ${packageConfig.name}`);\n if (packageConfig.version) {\n out.message(` Version: ${packageConfig.version}`);\n }\n if (packageConfig.description) {\n out.message(` Description: ${packageConfig.description}`);\n }\n if (packageConfig.keywords && packageConfig.keywords.length > 0) {\n out.message(` Keywords: ${packageConfig.keywords.join(', ')}`);\n }\n if (packageConfig.private) {\n out.message(` Private: Yes`);\n }\n}\n"],
5
+ "mappings": ";;;;;;;AACA,SAAS,UAAU,kBAAkB;AA2B9B,SAAS,qBAAqB,MAAc,MAAc,QAAQ,IAAI,GAAW;AAOtF,MALI,KAAK,WAAW,GAAG,KAKnB,CAAC,WAAW,IAAI;AAClB,WAAO;AAIT,MAAM,eAAe,SAAS,KAAK,IAAI;AACvC,MAAI,gBAAgB,CAAC,aAAa,WAAW,IAAI;AAE/C,WAAO;AAIT,MAAM,YAAY,uBAAuB,IAAI;AAC7C,SAAI,UAAU,WAAW,GAAG,IACnB,YAIF;AACT;AA8FO,SAAS,iBAAiB,QAAyB;AACxD,SAAO,SAAS,wBAAS;AAC3B;AA8BO,SAAS,gBAAgB,OAAe,OAAe,SAAiB;AAC7E,SAAO,GAAG,KAAK,IAAI,UAAU,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI;AAC3D;AAYO,SAAS,eAAe,OAAuB;AACpD,MAAM,KAAK,QAAS;AACpB,SAAI,MAAM,IACD,GAAG,GAAG,QAAQ,CAAC,CAAC,OAGlB,IADI,QAAQ,MACN,QAAQ,CAAC,CAAC;AACzB;AAMO,SAAS,eAAe,OAAuB;AACpD,SAAO,UAAU,WAAW,cAAc;AAC5C;AAMO,SAAS,iBAAiB,QAAsC;AACrE,SAAI,OAAO,UAAW,WACb,WAAW,WAAW,aAAa,KAE1B,OAAO,IAAI,QAAQ,IAClB,aAAa;AAClC;AAKO,SAAS,qBAAqB,eAA2B,MAAc,aAAsB,IAAO,QAA2B;AACpI,MAAM,MAAM,UAAU,eAChB,SAAS,aAAa,mBAAmB,WACzC,cAAc,qBAAqB,IAAI;AAE7C,MAAI,QAAQ,GAAG,WAAW,IAAI,MAAM,EAAE,GAEtC,IAAI,QAAQ,WAAW,cAAc,IAAI,EAAE,GACvC,cAAc,WAChB,IAAI,QAAQ,cAAc,cAAc,OAAO,EAAE,GAE/C,cAAc,eAChB,IAAI,QAAQ,kBAAkB,cAAc,WAAW,EAAE,GAEvD,cAAc,YAAY,cAAc,SAAS,SAAS,KAC5D,IAAI,QAAQ,eAAe,cAAc,SAAS,KAAK,IAAI,CAAC,EAAE,GAE5D,cAAc,WAChB,IAAI,QAAQ,gBAAgB;AAEhC;",
6
+ "names": []
7
+ }