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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/ports/console-output.ts", "../../core/src/core/ports/console-prompt.ts", "../../core/src/core/ports/resolve.ts", "../../core/src/core/execution-context.ts", "../../core/src/utils/home-directory.ts", "../src/cli/clack-output-adapter.ts", "../src/utils/spinner.ts", "../src/cli/clack-prompt-adapter.ts", "../src/cli/plain-prompt-adapter.ts", "../src/cli/clack-progress-adapter.ts", "../src/cli/context.ts"],
4
+ "sourcesContent": ["/**\n * Console Output Adapter (Default/CI)\n * \n * Plain console.log-based implementation of OutputPort.\n * Used as the default fallback when no interactive UI is available.\n * Safe for CI/CD pipelines and headless environments.\n */\n\nimport type { OutputPort, UnifiedSpinner } from './output.js';\n\nexport const consoleOutput: OutputPort = {\n info(message: string): void {\n console.log(message);\n },\n\n step(message: string): void {\n console.log(message);\n },\n\n connector(): void {\n // No-op in plain console mode\n },\n\n message(message: string): void {\n console.log(message);\n },\n\n success(message: string): void {\n console.log(`\u2713 ${message}`);\n },\n\n error(message: string): void {\n console.log(`\u2717 ${message}`);\n },\n\n warn(message: string): void {\n console.log(`\u26A0 ${message}`);\n },\n\n note(content: string, title?: string): void {\n const indented = content.split('\\n').map(line => ` ${line}`).join('\\n');\n if (title) {\n console.log(`\\n${title}\\n${indented}`);\n } else {\n console.log(`\\n${indented}`);\n }\n },\n\n async confirm(_message: string, options?: { initial?: boolean }): Promise<boolean> {\n // In non-interactive mode, return the default value\n return options?.initial ?? false;\n },\n\n spinner(): UnifiedSpinner {\n let msg = '';\n return {\n start(message: string) {\n msg = message;\n console.log(`\u2026 ${message}`);\n },\n stop(finalMessage?: string) {\n if (finalMessage) {\n console.log(`\u2713 ${finalMessage}`);\n } else {\n console.log(`\u2713 ${msg}`);\n }\n },\n message(text: string) {\n msg = text;\n },\n };\n },\n};\n", "/**\n * Non-Interactive Prompt Adapter (Default/CI)\n * \n * PromptPort implementation that throws on any prompt attempt.\n * Used in CI/CD pipelines and headless environments where\n * user interaction is not possible.\n */\n\nimport type { PromptPort, PromptChoice, PromptGroupChoices, TextPromptOptions } from './prompt.js';\n\nexport class NonInteractivePromptError extends Error {\n constructor(promptType: string) {\n super(\n `Cannot prompt for ${promptType} in non-interactive mode. ` +\n `Use specific flags or options to provide the required input.`\n );\n this.name = 'NonInteractivePromptError';\n }\n}\n\nexport const nonInteractivePrompt: PromptPort = {\n async confirm(_message: string, _initial?: boolean): Promise<boolean> {\n throw new NonInteractivePromptError('confirmation');\n },\n\n async select<T>(_message: string, _choices: Array<PromptChoice<T>>, _hint?: string): Promise<T> {\n throw new NonInteractivePromptError('selection');\n },\n\n async multiselect<T>(_message: string, _choices: Array<PromptChoice<T>>): Promise<T[]> {\n throw new NonInteractivePromptError('multi-selection');\n },\n\n async groupMultiselect<T>(_message: string, _groups: PromptGroupChoices<T>): Promise<T[]> {\n throw new NonInteractivePromptError('group selection');\n },\n\n async text(_message: string, _options?: TextPromptOptions): Promise<string> {\n throw new NonInteractivePromptError('text input');\n },\n};\n", "/**\n * Port Resolution Helpers\n * \n * Utilities for resolving OutputPort, PromptPort, and ProgressPort from\n * ExecutionContext, falling back to safe defaults when ports are not\n * explicitly provided.\n */\n\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport type { OutputPort } from './output.js';\nimport type { PromptPort } from './prompt.js';\nimport type { ProgressPort } from './progress.js';\nimport { consoleOutput } from './console-output.js';\nimport { nonInteractivePrompt } from './console-prompt.js';\nimport { silentProgress } from './console-progress.js';\n\n/**\n * Resolve the OutputPort from an ExecutionContext.\n * Falls back to consoleOutput (plain console.log) if not provided.\n */\nexport function resolveOutput(ctx?: ExecutionContext | { output?: OutputPort }): OutputPort {\n return ctx?.output ?? consoleOutput;\n}\n\n/**\n * Resolve the PromptPort from an ExecutionContext.\n * Falls back to nonInteractivePrompt (throws on any prompt) if not provided.\n */\nexport function resolvePrompt(ctx?: ExecutionContext | { prompt?: PromptPort }): PromptPort {\n return ctx?.prompt ?? nonInteractivePrompt;\n}\n\n/**\n * Resolve the ProgressPort from an ExecutionContext.\n * Falls back to silentProgress (no-op) if not provided.\n * \n * The default is silent (not consoleProgress) because progress events\n * are opt-in: the CLI adapter or GUI adapter must explicitly subscribe.\n * This prevents noisy [progress] logs in CI/CD unless explicitly requested.\n */\nexport function resolveProgress(ctx?: ExecutionContext | { progress?: ProgressPort }): ProgressPort {\n return ctx?.progress ?? silentProgress;\n}\n", "/**\n * Execution Context Module\n * \n * Central module for all directory resolution logic.\n * Creates and validates ExecutionContext for commands.\n * \n * This is the single source of truth for determining:\n * - Where to resolve input arguments (sourceCwd)\n * - Where to write output files (targetDir)\n */\n\nimport { resolve } from 'path';\nimport { stat, access, constants as fsConstants } from 'fs/promises';\nimport type { ExecutionContext, ExecutionOptions, ContextVariables } from '../types/execution-context.js';\nimport { getHomeDirectory, isHomeDirectory, normalizePathWithTilde } from '../utils/home-directory.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Create an ExecutionContext from command options.\n * \n * Priority logic:\n * 1. If --global: targetDir = home directory\n * 2. Else if --cwd: targetDir = resolve(cwd)\n * 3. Else: targetDir = process.cwd()\n * \n * sourceCwd is always process.cwd() (original working directory)\n * \n * @param options - Command options (global, cwd flags)\n * @returns Validated ExecutionContext\n * @throws Error if validation fails\n */\nexport async function createExecutionContext(options: ExecutionOptions = {}): Promise<ExecutionContext> {\n // sourceCwd is always the original working directory\n const sourceCwd = process.cwd();\n \n // Determine targetDir based on options\n let targetDir: string;\n let isGlobal: boolean;\n \n if (options.global) {\n targetDir = getHomeDirectory();\n isGlobal = true;\n \n // Log warning if both flags present\n if (options.cwd) {\n logger.info('--global option present, ignoring --cwd', { \n cwd: options.cwd,\n targetDir \n });\n }\n } else if (options.cwd) {\n targetDir = resolve(sourceCwd, options.cwd);\n isGlobal = isHomeDirectory(targetDir);\n } else {\n targetDir = sourceCwd;\n isGlobal = isHomeDirectory(targetDir);\n }\n \n // Create context\n const context: ExecutionContext = {\n sourceCwd,\n targetDir,\n isGlobal,\n interactive: options.interactive\n };\n \n // Validate context\n await validateExecutionContext(context);\n \n // Log context creation\n logger.debug('Created execution context', {\n sourceCwd: context.sourceCwd,\n targetDir: context.targetDir,\n isGlobal: context.isGlobal\n });\n \n return context;\n}\n\n/**\n * Validate an ExecutionContext.\n * \n * Checks:\n * - targetDir exists and is a directory\n * - targetDir is writable\n * - sourceCwd exists and is readable\n * \n * @param context - ExecutionContext to validate\n * @throws Error with helpful message if validation fails\n */\nasync function validateExecutionContext(context: ExecutionContext): Promise<void> {\n // Validate targetDir\n try {\n const targetStat = await stat(context.targetDir);\n if (!targetStat.isDirectory()) {\n throw new Error(`Target path is not a directory: ${context.targetDir}`);\n }\n \n // Check if writable\n await access(context.targetDir, fsConstants.W_OK);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Target directory does not exist: ${context.targetDir}\\n\\n` +\n `Hint: Create the directory or specify a different target with --cwd`\n );\n }\n if ((error as NodeJS.ErrnoException).code === 'EACCES') {\n throw new Error(\n `Target directory is not writable: ${context.targetDir}\\n\\n` +\n `Hint: Check directory permissions`\n );\n }\n throw new Error(\n `Invalid target directory: ${context.targetDir}\\n` +\n `Error: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n \n // Validate sourceCwd\n try {\n const sourceStat = await stat(context.sourceCwd);\n if (!sourceStat.isDirectory()) {\n throw new Error(`Source working directory is not a directory: ${context.sourceCwd}`);\n }\n \n // Check if readable\n await access(context.sourceCwd, fsConstants.R_OK);\n } catch (error) {\n throw new Error(\n `Invalid source working directory: ${context.sourceCwd}\\n` +\n `Error: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Generate context variables for platform flows and conditional logic.\n * \n * Variables:\n * - $$targetRoot: Normalized target path (with ~/ if home)\n * - $$sourceCwd: Original working directory\n * - $$isGlobal: Global flag for convenience\n * \n * @param context - ExecutionContext\n * @returns Map of context variables\n */\nexport function getContextVariables(context: ExecutionContext): ContextVariables {\n return {\n $$targetRoot: normalizePathWithTilde(context.targetDir),\n $$sourceCwd: context.sourceCwd,\n $$isGlobal: context.isGlobal\n };\n}\n\n/**\n * Get display-friendly target directory path.\n * Shows ~/ for home directory.\n * \n * @param context - ExecutionContext\n * @returns Display-friendly path\n */\nexport function getDisplayTargetDir(context: ExecutionContext): string {\n return normalizePathWithTilde(context.targetDir);\n}\n", "/**\n * Home Directory Utilities\n * \n * Centralized module for all home directory operations.\n * Handles path resolution, comparison, and display normalization.\n */\n\nimport { homedir } from 'os';\nimport { resolve, normalize } from 'path';\n\n/**\n * Get the home directory path.\n * \n * @returns Absolute path to the user's home directory\n */\nexport function getHomeDirectory(): string {\n return homedir();\n}\n\n/**\n * Check if a path equals the home directory.\n * \n * Handles path normalization to ensure accurate comparison.\n * \n * @param path - Path to check\n * @returns True if path is the home directory\n */\nexport function isHomeDirectory(path: string): boolean {\n const normalizedPath = normalize(resolve(path));\n const normalizedHome = normalize(getHomeDirectory());\n return normalizedPath === normalizedHome;\n}\n\n/**\n * Convert home directory path to tilde notation for display.\n * \n * Only converts if the path is exactly the home directory or\n * a subdirectory of it. Other paths are returned unchanged.\n * \n * @param path - Absolute path to normalize\n * @returns Path with ~/ prefix if applicable, otherwise original path\n */\nexport function normalizePathWithTilde(path: string): string {\n const normalizedPath = normalize(resolve(path));\n const homeDir = getHomeDirectory();\n const normalizedHome = normalize(homeDir);\n \n // Exact match - return ~/\n if (normalizedPath === normalizedHome) {\n return '~/';\n }\n \n // Subdirectory of home - replace prefix\n if (normalizedPath.startsWith(normalizedHome + '/')) {\n return '~/' + normalizedPath.slice(normalizedHome.length + 1);\n }\n \n // Not in home directory - return as-is\n return normalizedPath;\n}\n\n/**\n * Expand tilde notation to full home directory path.\n * \n * Used for path comparison in flow conditions and path resolution.\n * \n * @param path - Path that may start with ~/\n * @returns Path with ~/ expanded to home directory\n */\nexport function expandTilde(path: string): string {\n if (path === '~' || path === '~/') {\n return getHomeDirectory();\n }\n \n if (path.startsWith('~/')) {\n return resolve(getHomeDirectory(), path.slice(2));\n }\n \n return path;\n}\n", "/**\n * Clack Output Adapter\n * \n * CLI-specific OutputPort implementation that routes to @clack/prompts\n * for rich interactive terminal UI. Falls back to plain console for\n * non-interactive sessions.\n * \n * This is the CLI's implementation of the OutputPort interface defined\n * in core/ports/output.ts.\n */\n\nimport { log, spinner as clackSpinner, confirm as clackConfirm, note as clackNote, isCancel, cancel } from '@clack/prompts';\nimport { Spinner } from '../utils/spinner.js';\nimport type { OutputPort, UnifiedSpinner } from '@opkg/core/core/ports/output.js';\n\n/**\n * Create a Clack-based OutputPort for interactive terminal sessions.\n */\nexport function createClackOutput(): OutputPort {\n return {\n info(message: string): void {\n log.info(message);\n },\n\n step(message: string): void {\n log.step(message);\n },\n\n connector(): void {\n log.message(' ', { spacing: 0 });\n },\n\n message(message: string): void {\n log.message(message, { spacing: 0 });\n },\n\n success(message: string): void {\n log.success(message);\n },\n\n error(message: string): void {\n log.error(message);\n },\n\n warn(message: string): void {\n log.warn(message);\n },\n\n note(content: string, title?: string): void {\n clackNote(content, title ?? '');\n },\n\n async confirm(message: string, options?: { initial?: boolean }): Promise<boolean> {\n const result = await clackConfirm({\n message,\n initialValue: options?.initial ?? false,\n });\n if (isCancel(result)) {\n cancel('Operation cancelled.');\n const { UserCancellationError } = await import('@opkg/core/utils/errors.js');\n throw new UserCancellationError('Operation cancelled by user');\n }\n return result as boolean;\n },\n\n spinner(): UnifiedSpinner {\n const s = clackSpinner();\n let isStarted = false;\n\n return {\n start(message: string) {\n if (!isStarted) {\n s.start(message);\n isStarted = true;\n }\n },\n stop(finalMessage?: string) {\n if (isStarted) {\n if (finalMessage) {\n s.stop(finalMessage);\n } else {\n s.stop();\n }\n isStarted = false;\n }\n },\n message(text: string) {\n if (isStarted) {\n s.message(text);\n }\n },\n };\n },\n };\n}\n\n/**\n * Create a plain console OutputPort for non-interactive sessions (CI, piped output).\n */\nexport function createPlainOutput(): OutputPort {\n return {\n info(message: string): void {\n console.log(message);\n },\n\n step(message: string): void {\n console.log(message);\n },\n\n connector(): void {\n // No-op in plain mode\n },\n\n message(message: string): void {\n console.log(message);\n },\n\n success(message: string): void {\n console.log(`\u2713 ${message}`);\n },\n\n error(message: string): void {\n console.log(`\u274C ${message}`);\n },\n\n warn(message: string): void {\n console.log(`\u26A0\uFE0F ${message}`);\n },\n\n note(content: string, title?: string): void {\n const indented = content.split('\\n').map(line => ` ${line}`).join('\\n');\n if (title) {\n console.log(`\\n${title}\\n${indented}`);\n } else {\n console.log(`\\n${indented}`);\n }\n },\n\n async confirm(_message: string, options?: { initial?: boolean }): Promise<boolean> {\n // In non-interactive/plain mode, return the default value.\n // There is no TTY to prompt the user, so we fall through silently.\n console.log(`${_message} ${options?.initial ? '(Y)' : '(N)'}`);\n return options?.initial ?? false;\n },\n\n spinner(): UnifiedSpinner {\n let s: Spinner | null = null;\n\n return {\n start(message: string) {\n s = new Spinner(message);\n s.start();\n },\n stop(finalMessage?: string) {\n if (s) {\n s.stop();\n if (finalMessage) {\n console.log(`\u2713 ${finalMessage}`);\n }\n s = null;\n }\n },\n message(text: string) {\n if (s) {\n s.update(text);\n }\n },\n };\n },\n };\n}\n", "/**\n * Simple spinner utility for showing loading indicators in CLI\n */\n\nexport class Spinner {\n private intervalId: NodeJS.Timeout | null = null;\n private message: string;\n private frames: string[];\n private currentFrame: number = 0;\n private isRunning: boolean = false;\n\n constructor(message: string = 'Loading...') {\n this.message = message;\n // Different spinner frames for variety\n this.frames = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F'];\n }\n\n /**\n * Start the spinner animation\n */\n start(): void {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.currentFrame = 0;\n\n // Hide cursor for cleaner output\n process.stdout.write('\\x1B[?25l');\n\n this.intervalId = setInterval(() => {\n const frame = this.frames[this.currentFrame % this.frames.length];\n process.stdout.write(`\\r${frame} ${this.message}`);\n this.currentFrame++;\n }, 80); // Update every 80ms for smooth animation\n }\n\n /**\n * Update the spinner message\n */\n update(message: string): void {\n this.message = message;\n }\n\n /**\n * Stop the spinner\n */\n stop(): void {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n // Clear the spinner line\n process.stdout.write('\\r' + ' '.repeat(process.stdout.columns || 80) + '\\r');\n\n // Show cursor again\n process.stdout.write('\\x1B[?25h');\n }\n\n}\n\n", "/**\n * Clack Prompt Adapter\n * \n * CLI-specific PromptPort implementation that routes to @clack/prompts\n * for rich interactive terminal prompts.\n * \n * This is the CLI's implementation of the PromptPort interface defined\n * in core/ports/prompt.ts.\n */\n\nimport * as clack from '@clack/prompts';\nimport type { PromptPort, PromptChoice, PromptGroupChoices, TextPromptOptions } from '@opkg/core/core/ports/prompt.js';\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\n\nfunction handleCancel(result: unknown): void {\n if (clack.isCancel(result)) {\n clack.cancel('Operation cancelled.');\n throw new UserCancellationError('Operation cancelled by user');\n }\n}\n\n/**\n * Create a Clack-based PromptPort for interactive terminal sessions.\n */\nexport function createClackPrompt(): PromptPort {\n return {\n async confirm(message: string, initial?: boolean): Promise<boolean> {\n const result = await clack.confirm({\n message,\n initialValue: initial ?? false,\n });\n handleCancel(result);\n return result as boolean;\n },\n\n async select<T>(\n message: string,\n choices: Array<PromptChoice<T>>,\n hint?: string\n ): Promise<T> {\n const result = await clack.select({\n message,\n options: choices.map(c => ({\n label: c.title,\n value: c.value,\n ...(c.description ? { hint: c.description } : {}),\n })) as any,\n });\n handleCancel(result);\n return result as T;\n },\n\n async multiselect<T>(\n message: string,\n choices: Array<PromptChoice<T>>,\n options?: { hint?: string; min?: number }\n ): Promise<T[]> {\n const result = await clack.multiselect({\n message,\n options: choices.map(c => ({\n label: c.title,\n value: c.value,\n ...(c.description ? { hint: c.description } : {}),\n })) as any,\n required: options?.min ? options.min > 0 : false,\n });\n handleCancel(result);\n return result as T[];\n },\n\n async groupMultiselect<T>(\n message: string,\n groups: PromptGroupChoices<T>\n ): Promise<T[]> {\n const result = await clack.groupMultiselect({\n message,\n options: groups as any,\n });\n handleCancel(result);\n return result as T[];\n },\n\n async text(\n message: string,\n options?: TextPromptOptions\n ): Promise<string> {\n // @clack/core does NOT await validate results, so async validators\n // will render as [object Promise]. We need to handle sync and async\n // validators differently.\n const userValidate = options?.validate;\n\n // Wrap validate to be synchronous for clack. If the user's validator\n // is async, we skip clack's built-in validate and handle it via a\n // retry loop below.\n let isAsync = false;\n\n const syncValidate = userValidate ? (value: string | undefined) => {\n const r = userValidate(value ?? '');\n if (r && typeof (r as any).then === 'function') {\n // Async validator detected \u2014 let clack accept the value,\n // we'll validate after the prompt returns.\n isAsync = true;\n return undefined;\n }\n if (r === true || r === undefined) return undefined;\n return r as string;\n } : undefined;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const result = await clack.text({\n message,\n placeholder: options?.placeholder,\n defaultValue: options?.initial,\n validate: syncValidate,\n });\n handleCancel(result);\n\n // If the validator was async, run it now and re-prompt on failure\n if (isAsync && userValidate) {\n const asyncResult = await userValidate((result as string) ?? '');\n if (asyncResult !== true && asyncResult !== undefined) {\n // Show the validation error and re-prompt\n clack.log.error(asyncResult as string);\n isAsync = false; // reset for next iteration\n continue;\n }\n }\n\n return result as string;\n }\n },\n };\n}\n", "/**\n * Plain Prompt Adapter\n *\n * PromptPort implementation backed by the `prompts` npm package\n * (terkelg/prompts). Provides arrow-key interactive selection,\n * confirm, multiselect, and text input without the box-drawing\n * chrome of @clack/prompts.\n *\n * Used when the CLI commits to \"plain\" output mode on a TTY.\n */\n\nimport prompts from 'prompts';\nimport type {\n PromptPort,\n PromptChoice,\n PromptGroupChoices,\n TextPromptOptions,\n} from '@opkg/core/core/ports/prompt.js';\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Shared onCancel handler -- throws so callers never see `undefined`. */\nfunction onCancel(): never {\n throw new UserCancellationError('Prompt cancelled');\n}\n\n// ---------------------------------------------------------------------------\n// Adapter\n// ---------------------------------------------------------------------------\n\nexport function createPlainPrompt(): PromptPort {\n return {\n // \u2500\u2500 confirm \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n async confirm(message: string, initial?: boolean): Promise<boolean> {\n const { value } = await prompts(\n {\n type: 'confirm',\n name: 'value',\n message,\n initial: initial ?? false,\n },\n { onCancel },\n );\n return value as boolean;\n },\n\n // \u2500\u2500 select \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n async select<T>(\n message: string,\n choices: Array<PromptChoice<T>>,\n hint?: string,\n ): Promise<T> {\n const { value } = await prompts(\n {\n type: 'select',\n name: 'value',\n message,\n choices: choices.map((c) => ({\n title: c.title,\n value: c.value,\n description: c.description,\n })),\n hint,\n },\n { onCancel },\n );\n return value as T;\n },\n\n // \u2500\u2500 multiselect \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n async multiselect<T>(\n message: string,\n choices: Array<PromptChoice<T>>,\n options?: { hint?: string; min?: number },\n ): Promise<T[]> {\n const { value } = await prompts(\n {\n type: 'multiselect',\n name: 'value',\n message,\n choices: choices.map((c) => ({\n title: c.title,\n value: c.value,\n description: c.description,\n })),\n hint: options?.hint ?? '- Space: select/deselect, Enter: confirm',\n min: options?.min,\n },\n { onCancel },\n );\n return value as T[];\n },\n\n // \u2500\u2500 groupMultiselect \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n async groupMultiselect<T>(\n message: string,\n groups: PromptGroupChoices<T>,\n ): Promise<T[]> {\n // `prompts` has no native grouped multiselect, so we flatten the\n // groups into a single list with \"Group / Label\" titles.\n const flatChoices: Array<{ title: string; value: T }> = [];\n for (const [groupLabel, items] of Object.entries(groups)) {\n for (const item of items) {\n flatChoices.push({\n title: `${groupLabel} / ${item.label}`,\n value: item.value,\n });\n }\n }\n\n const { value } = await prompts(\n {\n type: 'multiselect',\n name: 'value',\n message,\n choices: flatChoices.map((c) => ({\n title: c.title,\n value: c.value,\n })),\n hint: '- Space: select/deselect, Enter: confirm',\n },\n { onCancel },\n );\n return value as T[];\n },\n\n // \u2500\u2500 text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n async text(\n message: string,\n options?: TextPromptOptions,\n ): Promise<string> {\n const userValidate = options?.validate;\n\n // Detect whether the validator is async by probing with a dummy call.\n // If async, we skip prompts' built-in validate and loop manually.\n let isAsync = false;\n const syncValidate = userValidate\n ? (value: string) => {\n const r = userValidate(value);\n if (r && typeof (r as any).then === 'function') {\n isAsync = true;\n return true; // accept for now, validate after\n }\n if (r === true || r === undefined) return true;\n return r as string;\n }\n : undefined;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { value } = await prompts(\n {\n type: 'text',\n name: 'value',\n message,\n initial: options?.initial,\n validate: syncValidate,\n },\n { onCancel },\n );\n\n const result = (value as string) ?? '';\n\n // Post-submit async validation\n if (isAsync && userValidate) {\n const asyncResult = await userValidate(result);\n if (asyncResult !== true && asyncResult !== undefined) {\n console.error(` Error: ${asyncResult}`);\n isAsync = false; // reset for next iteration\n continue;\n }\n }\n\n return result;\n }\n },\n };\n}\n", "/**\n * Clack Progress Adapter\n * \n * CLI-specific ProgressPort implementation that routes structured\n * progress events to @clack/prompts log output for terminal display.\n * \n * This is the CLI's implementation of the ProgressPort interface\n * defined in core/ports/progress.ts.\n */\n\nimport { log } from '@clack/prompts';\nimport type { ProgressPort, ProgressEvent, ProgressLogLevel } from '@opkg/core/core/ports/progress.js';\n\n/**\n * Create a Clack-based ProgressPort for interactive terminal sessions.\n * \n * Routes progress events to @clack/prompts log methods for rich\n * terminal output. Failed events are highlighted; success events\n * are concise.\n */\nexport function createClackProgress(): ProgressPort {\n return {\n emit(event: ProgressEvent): void {\n switch (event.type) {\n case 'install:start':\n log.step(`Installing ${event.packages.length} package(s)`);\n break;\n case 'install:resolve':\n if (event.status === 'failed') {\n log.warn(`Failed to resolve ${event.package}${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n case 'install:download':\n if (event.status === 'failed') {\n log.warn(`Failed to download ${event.package}${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n case 'install:extract':\n if (event.status === 'failed') {\n log.warn(`Failed to extract ${event.package}${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n case 'install:complete': {\n const { installed, failed, skipped } = event.summary;\n if (failed > 0) {\n log.warn(`Install complete: ${installed} installed, ${failed} failed, ${skipped} skipped`);\n } else {\n log.info(`Install complete: ${installed} installed${skipped > 0 ? `, ${skipped} skipped` : ''}`);\n }\n break;\n }\n\n case 'publish:start':\n log.step(`Publishing ${event.package}@${event.version}`);\n break;\n case 'publish:upload':\n if (event.status === 'failed') {\n log.warn(`Upload failed for ${event.package}${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n case 'publish:complete':\n if (event.success) {\n log.info(`Published ${event.package}`);\n } else {\n log.warn(`Failed to publish ${event.package}`);\n }\n break;\n\n case 'uninstall:start':\n log.step(`Uninstalling ${event.packages.length} package(s)`);\n break;\n case 'uninstall:remove':\n if (event.status === 'failed') {\n log.warn(`Failed to remove ${event.package}${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n case 'uninstall:complete': {\n const { removed, failed } = event.summary;\n if (failed > 0) {\n log.warn(`Uninstall complete: ${removed} removed, ${failed} failed`);\n } else {\n log.info(`Uninstall complete: ${removed} removed`);\n }\n break;\n }\n\n case 'search:start':\n // Intentionally quiet -- search is fast\n break;\n case 'search:scanning':\n // Intentionally quiet\n break;\n case 'search:complete':\n log.info(`Found ${event.resultCount} result(s)`);\n break;\n\n case 'pipeline:start':\n log.step(`${event.pipeline}${event.detail ? `: ${event.detail}` : ''}`);\n break;\n case 'pipeline:step':\n log.info(`${event.step}${event.detail ? `: ${event.detail}` : ''}`);\n break;\n case 'pipeline:complete':\n if (!event.success) {\n log.warn(`${event.pipeline} failed${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n }\n },\n\n log(level: ProgressLogLevel, message: string): void {\n switch (level) {\n case 'debug':\n // Silent in normal CLI mode\n break;\n case 'info':\n log.info(message);\n break;\n case 'warn':\n log.warn(message);\n break;\n case 'error':\n log.error(message);\n break;\n }\n },\n };\n}\n\n/**\n * Create a plain console ProgressPort for non-interactive sessions.\n * Minimal output -- only failures and summaries.\n */\nexport function createPlainProgress(): ProgressPort {\n return {\n emit(event: ProgressEvent): void {\n switch (event.type) {\n case 'install:complete':\n console.log(`Installed: ${event.summary.installed}, failed: ${event.summary.failed}, skipped: ${event.summary.skipped}`);\n break;\n case 'publish:complete':\n console.log(`Publish ${event.package}: ${event.success ? 'success' : 'failed'}`);\n break;\n case 'uninstall:complete':\n console.log(`Removed: ${event.summary.removed}, failed: ${event.summary.failed}`);\n break;\n case 'search:complete':\n console.log(`Found ${event.resultCount} result(s)`);\n break;\n case 'pipeline:complete':\n if (!event.success) {\n console.log(`${event.pipeline} failed${event.detail ? `: ${event.detail}` : ''}`);\n }\n break;\n default:\n // Silent for intermediate events in non-interactive mode\n break;\n }\n },\n\n log(level: ProgressLogLevel, message: string): void {\n switch (level) {\n case 'debug':\n case 'info':\n break;\n case 'warn':\n console.warn(message);\n break;\n case 'error':\n console.error(message);\n break;\n }\n },\n };\n}\n", "/**\n * CLI Context Factory\n * \n * Creates ExecutionContext instances with CLI-specific port implementations.\n * \n * Output mode is committed once at context creation. When the mode is not\n * yet known (e.g. install command that may discover a marketplace), the\n * context starts in plain mode and provides a `commitOutputMode` callback\n * that the orchestrator can invoke to upgrade to rich mode before any\n * visible output is produced.\n */\n\nimport type { ExecutionContext, ExecutionOptions, OutputMode } from '@opkg/core/types/execution-context.js';\nimport { createExecutionContext } from '@opkg/core/core/execution-context.js';\nimport { createClackOutput, createPlainOutput } from './clack-output-adapter.js';\nimport { createClackPrompt } from './clack-prompt-adapter.js';\nimport { createPlainPrompt } from './plain-prompt-adapter.js';\nimport { createClackProgress, createPlainProgress } from './clack-progress-adapter.js';\nimport { nonInteractivePrompt } from '@opkg/core/core/ports/console-prompt.js';\nimport type { OutputPort } from '@opkg/core/core/ports/output.js';\nimport type { PromptPort } from '@opkg/core/core/ports/prompt.js';\nimport type { ProgressPort } from '@opkg/core/core/ports/progress.js';\n\nexport interface CliContextOptions extends ExecutionOptions {\n /**\n * Explicit output mode.\n * - `'rich'` \u2013 Clack output, Clack prompts, Clack progress\n * - `'plain'` \u2013 Console output, readline prompts, plain progress\n * - When omitted, defaults to `'plain'`.\n */\n outputMode?: OutputMode;\n}\n\n// \u2500\u2500 Cached singletons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet cachedClackOutput: OutputPort | undefined;\nlet cachedPlainOutput: OutputPort | undefined;\nlet cachedClackPrompt: PromptPort | undefined;\nlet cachedPlainPrompt: PromptPort | undefined;\nlet cachedClackProgress: ProgressPort | undefined;\nlet cachedPlainProgress: ProgressPort | undefined;\n\n// \u2500\u2500 TTY detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Detect whether the current session is interactive (TTY, no CI). */\nfunction detectInteractive(): boolean {\n const isTTY = process.stdin.isTTY === true;\n return isTTY && process.env.CI !== 'true';\n}\n\n// \u2500\u2500 Port assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Apply an output mode to an ExecutionContext, setting all three ports\n * (output, prompt, progress) atomically.\n */\nfunction applyOutputMode(ctx: ExecutionContext, mode: OutputMode, isTTY: boolean): void {\n ctx.outputMode = mode;\n\n if (mode === 'rich') {\n ctx.output = cachedClackOutput ??= createClackOutput();\n ctx.prompt = isTTY\n ? (cachedClackPrompt ??= createClackPrompt())\n : nonInteractivePrompt;\n ctx.progress = cachedClackProgress ??= createClackProgress();\n } else {\n ctx.output = cachedPlainOutput ??= createPlainOutput();\n ctx.prompt = isTTY\n ? (cachedPlainPrompt ??= createPlainPrompt())\n : nonInteractivePrompt;\n ctx.progress = cachedPlainProgress ??= createPlainProgress();\n }\n}\n\n// \u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Create an ExecutionContext with CLI-specific ports injected.\n *\n * The output mode is committed once. If the caller does not know the\n * mode yet (e.g. the install command before preprocessing), omit\n * `outputMode` -- the context starts in plain mode and exposes a\n * `commitOutputMode` callback that core code can invoke to upgrade\n * to rich mode before any visible output is produced.\n */\nexport async function createCliExecutionContext(options: CliContextOptions = {}): Promise<ExecutionContext> {\n const ctx = await createExecutionContext(options);\n const isTTY = detectInteractive();\n const initialMode: OutputMode = options.outputMode ?? 'plain';\n\n applyOutputMode(ctx, initialMode, isTTY);\n\n // Allow core code to change mode (e.g. after install preprocessing\n // determines marketplace flow). No-op when already in the requested mode.\n ctx.commitOutputMode = (mode: OutputMode) => {\n if (ctx.outputMode === mode) return;\n applyOutputMode(ctx, mode, isTTY);\n };\n\n return ctx;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["text", "resolve", "resolve", "UserCancellationError", "text", "log"]
7
+ }
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ walkFiles
4
+ } from "./chunk-A6ISKBNM.js";
5
+ import {
6
+ defaultNameFromPath,
7
+ defaultNameFromSkillDir,
8
+ preferFrontmatterName
9
+ } from "./chunk-6YZNE3MU.js";
10
+ import {
11
+ splitFrontmatter
12
+ } from "./chunk-VQ2KY6CK.js";
13
+ import {
14
+ exists,
15
+ readTextFile
16
+ } from "./chunk-S47F4OG4.js";
17
+ import {
18
+ logger
19
+ } from "./chunk-5EFWGD33.js";
20
+
21
+ // ../core/src/core/install/resource-discoverer.ts
22
+ import { join, basename, dirname, relative, resolve } from "path";
23
+
24
+ // ../core/src/core/resources/markdown-metadata.ts
25
+ function extractMarkdownResourceMetadata(content) {
26
+ let { frontmatter } = splitFrontmatter(content);
27
+ return !frontmatter || typeof frontmatter != "object" ? {} : {
28
+ name: typeof frontmatter.name == "string" ? frontmatter.name : void 0,
29
+ description: typeof frontmatter.description == "string" ? frontmatter.description : void 0,
30
+ version: extractVersionFromFrontmatter(frontmatter)
31
+ };
32
+ }
33
+ function extractVersionFromFrontmatter(frontmatter) {
34
+ if (!frontmatter || typeof frontmatter != "object")
35
+ return;
36
+ let version = frontmatter.version ?? frontmatter.metadata?.version;
37
+ if (typeof version == "string") {
38
+ let trimmed = version.trim();
39
+ return trimmed.length > 0 ? trimmed : void 0;
40
+ }
41
+ }
42
+
43
+ // ../core/src/core/install/resource-discoverer.ts
44
+ async function discoverResources(basePath, repoRoot) {
45
+ logger.debug("Discovering resources", { basePath, repoRoot });
46
+ let basePathResolved = resolve(basePath), repoRootResolved = resolve(repoRoot), allResources = [], agents = await discoverAgents(basePathResolved, repoRootResolved), skills = await discoverSkills(basePathResolved, repoRootResolved), commands = await discoverCommands(basePathResolved, repoRootResolved), rules = await discoverRules(basePathResolved, repoRootResolved), hooks = await discoverHooks(basePathResolved, repoRootResolved), mcp = await discoverMCP(basePathResolved, repoRootResolved);
47
+ allResources.push(...agents, ...skills, ...commands, ...rules, ...hooks, ...mcp);
48
+ let byType = /* @__PURE__ */ new Map();
49
+ for (let resource of allResources) {
50
+ let existing = byType.get(resource.resourceType) || [];
51
+ existing.push(resource), byType.set(resource.resourceType, existing);
52
+ }
53
+ return logger.info("Resource discovery complete", {
54
+ total: allResources.length,
55
+ agents: agents.length,
56
+ skills: skills.length,
57
+ commands: commands.length,
58
+ rules: rules.length,
59
+ hooks: hooks.length,
60
+ mcp: mcp.length
61
+ }), {
62
+ all: allResources,
63
+ byType,
64
+ total: allResources.length,
65
+ basePath: basePathResolved,
66
+ repoRoot: repoRootResolved
67
+ };
68
+ }
69
+ async function discoverAgents(basePath, repoRoot) {
70
+ let resources = [], agentsDir = join(basePath, "agents");
71
+ if (!await exists(agentsDir))
72
+ return resources;
73
+ for await (let file of walkFiles(agentsDir)) {
74
+ if (!file.endsWith(".md"))
75
+ continue;
76
+ let content = await readTextFile(file), metadata = extractMarkdownResourceMetadata(content), resourcePath = normalizeResourcePath(file, repoRoot);
77
+ resources.push({
78
+ resourceType: "agent",
79
+ resourcePath,
80
+ displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),
81
+ description: metadata.description,
82
+ version: metadata.version,
83
+ filePath: file,
84
+ installKind: "file",
85
+ matchedBy: metadata.name ? "frontmatter" : "filename"
86
+ });
87
+ }
88
+ return resources;
89
+ }
90
+ async function discoverSkills(basePath, repoRoot) {
91
+ let resources = [], skillsDir = join(basePath, "skills");
92
+ if (!await exists(skillsDir))
93
+ return resources;
94
+ for await (let file of walkFiles(skillsDir)) {
95
+ if (basename(file) !== "SKILL.md")
96
+ continue;
97
+ let skillDir = dirname(file), content = await readTextFile(file), metadata = extractMarkdownResourceMetadata(content), resourcePath = normalizeResourcePath(skillDir, repoRoot);
98
+ resources.push({
99
+ resourceType: "skill",
100
+ resourcePath,
101
+ displayName: preferFrontmatterName(metadata.name, defaultNameFromSkillDir(skillDir)),
102
+ description: metadata.description,
103
+ version: metadata.version,
104
+ filePath: skillDir,
105
+ installKind: "directory",
106
+ matchedBy: metadata.name ? "frontmatter" : "dirname"
107
+ });
108
+ }
109
+ return resources;
110
+ }
111
+ async function discoverCommands(basePath, repoRoot) {
112
+ let resources = [], commandsDir = join(basePath, "commands");
113
+ if (!await exists(commandsDir))
114
+ return resources;
115
+ for await (let file of walkFiles(commandsDir)) {
116
+ if (!file.endsWith(".md"))
117
+ continue;
118
+ let content = await readTextFile(file), metadata = extractMarkdownResourceMetadata(content), resourcePath = normalizeResourcePath(file, repoRoot);
119
+ resources.push({
120
+ resourceType: "command",
121
+ resourcePath,
122
+ displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),
123
+ description: metadata.description,
124
+ version: metadata.version,
125
+ filePath: file,
126
+ installKind: "file",
127
+ matchedBy: metadata.name ? "frontmatter" : "filename"
128
+ });
129
+ }
130
+ return resources;
131
+ }
132
+ async function discoverRules(basePath, repoRoot) {
133
+ let resources = [], rulesDir = join(basePath, "rules");
134
+ if (!await exists(rulesDir))
135
+ return resources;
136
+ for await (let file of walkFiles(rulesDir)) {
137
+ if (!file.endsWith(".md"))
138
+ continue;
139
+ let content = await readTextFile(file), metadata = extractMarkdownResourceMetadata(content), resourcePath = normalizeResourcePath(file, repoRoot);
140
+ resources.push({
141
+ resourceType: "rule",
142
+ resourcePath,
143
+ displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),
144
+ description: metadata.description,
145
+ version: metadata.version,
146
+ filePath: file,
147
+ installKind: "file",
148
+ matchedBy: metadata.name ? "frontmatter" : "filename"
149
+ });
150
+ }
151
+ return resources;
152
+ }
153
+ async function discoverHooks(basePath, repoRoot) {
154
+ let resources = [], hooksDir = join(basePath, "hooks");
155
+ if (!await exists(hooksDir))
156
+ return resources;
157
+ for await (let file of walkFiles(hooksDir)) {
158
+ let resourcePath = normalizeResourcePath(file, repoRoot), displayName = basename(file);
159
+ resources.push({
160
+ resourceType: "hook",
161
+ resourcePath,
162
+ displayName,
163
+ filePath: file,
164
+ installKind: "file"
165
+ });
166
+ }
167
+ return resources;
168
+ }
169
+ async function discoverMCP(basePath, repoRoot) {
170
+ let resources = [], mcpFiles = ["mcp.jsonc", "mcp.json"];
171
+ for (let filename of mcpFiles) {
172
+ let filePath = join(basePath, filename);
173
+ if (await exists(filePath)) {
174
+ let resourcePath = normalizeResourcePath(filePath, repoRoot);
175
+ resources.push({
176
+ resourceType: "mcp",
177
+ resourcePath,
178
+ displayName: "configs",
179
+ description: "Model Context Protocol server configuration",
180
+ filePath,
181
+ installKind: "file"
182
+ });
183
+ break;
184
+ }
185
+ }
186
+ return resources;
187
+ }
188
+ function normalizeResourcePath(absolutePath, repoRoot) {
189
+ return relative(repoRoot, absolutePath).replace(/\\/g, "/").replace(/^\.\//, "");
190
+ }
191
+
192
+ export {
193
+ discoverResources
194
+ };
195
+ //# sourceMappingURL=chunk-RSFLK2TP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/install/resource-discoverer.ts", "../../core/src/core/resources/markdown-metadata.ts"],
4
+ "sourcesContent": ["/**\n * Resource Discovery Module\n * \n * Discovers all installable resources within a package/plugin:\n * - Agents (agents/.../*.md)\n * - Skills (skills/.../ directories with SKILL.md)\n * - Commands (commands/.../*.md)\n * - Rules (rules/.../*.md)\n * - Hooks (hooks/.../)\n * - MCP servers (mcp.jsonc, mcp.json)\n */\n\nimport { join, basename, dirname, relative, resolve } from 'path';\nimport { walkFiles } from '../../utils/file-walker.js';\nimport { exists, readTextFile } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { extractMarkdownResourceMetadata } from '../resources/markdown-metadata.js';\nimport { defaultNameFromPath, defaultNameFromSkillDir, preferFrontmatterName } from '../resources/resource-naming.js';\nimport type { \n DiscoveredResource, \n ResourceDiscoveryResult,\n ResourceType \n} from './resource-types.js';\n\n/**\n * Discover all installable resources within a package\n * \n * @param basePath - Base path to search from (detectedBase or contentRoot)\n * @param repoRoot - Repository root path for relative path calculation\n * @returns Discovery result with all found resources\n */\nexport async function discoverResources(\n basePath: string,\n repoRoot: string\n): Promise<ResourceDiscoveryResult> {\n logger.debug('Discovering resources', { basePath, repoRoot });\n \n const basePathResolved = resolve(basePath);\n const repoRootResolved = resolve(repoRoot);\n \n const allResources: DiscoveredResource[] = [];\n \n // Discover each resource type\n const agents = await discoverAgents(basePathResolved, repoRootResolved);\n const skills = await discoverSkills(basePathResolved, repoRootResolved);\n const commands = await discoverCommands(basePathResolved, repoRootResolved);\n const rules = await discoverRules(basePathResolved, repoRootResolved);\n const hooks = await discoverHooks(basePathResolved, repoRootResolved);\n const mcp = await discoverMCP(basePathResolved, repoRootResolved);\n \n allResources.push(...agents, ...skills, ...commands, ...rules, ...hooks, ...mcp);\n \n // Group by type\n const byType = new Map<ResourceType, DiscoveredResource[]>();\n for (const resource of allResources) {\n const existing = byType.get(resource.resourceType) || [];\n existing.push(resource);\n byType.set(resource.resourceType, existing);\n }\n \n logger.info('Resource discovery complete', {\n total: allResources.length,\n agents: agents.length,\n skills: skills.length,\n commands: commands.length,\n rules: rules.length,\n hooks: hooks.length,\n mcp: mcp.length\n });\n \n return {\n all: allResources,\n byType,\n total: allResources.length,\n basePath: basePathResolved,\n repoRoot: repoRootResolved\n };\n}\n\n/**\n * Discover agents (agents/.../*.md)\n */\nasync function discoverAgents(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const agentsDir = join(basePath, 'agents');\n \n if (!(await exists(agentsDir))) {\n return resources;\n }\n \n for await (const file of walkFiles(agentsDir)) {\n if (!file.endsWith('.md')) {\n continue;\n }\n \n const content = await readTextFile(file);\n const metadata = extractMarkdownResourceMetadata(content);\n const resourcePath = normalizeResourcePath(file, repoRoot);\n \n resources.push({\n resourceType: 'agent',\n resourcePath,\n displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),\n description: metadata.description,\n version: metadata.version,\n filePath: file,\n installKind: 'file',\n matchedBy: metadata.name ? 'frontmatter' : 'filename'\n });\n }\n \n return resources;\n}\n\n/**\n * Discover skills (skills/.../ directories with SKILL.md)\n */\nasync function discoverSkills(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const skillsDir = join(basePath, 'skills');\n \n if (!(await exists(skillsDir))) {\n return resources;\n }\n \n for await (const file of walkFiles(skillsDir)) {\n if (basename(file) !== 'SKILL.md') {\n continue;\n }\n \n const skillDir = dirname(file);\n const content = await readTextFile(file);\n const metadata = extractMarkdownResourceMetadata(content);\n const resourcePath = normalizeResourcePath(skillDir, repoRoot);\n \n resources.push({\n resourceType: 'skill',\n resourcePath,\n displayName: preferFrontmatterName(metadata.name, defaultNameFromSkillDir(skillDir)),\n description: metadata.description,\n version: metadata.version,\n filePath: skillDir,\n installKind: 'directory',\n matchedBy: metadata.name ? 'frontmatter' : 'dirname'\n });\n }\n \n return resources;\n}\n\n/**\n * Discover commands (commands/.../*.md)\n */\nasync function discoverCommands(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const commandsDir = join(basePath, 'commands');\n \n if (!(await exists(commandsDir))) {\n return resources;\n }\n \n for await (const file of walkFiles(commandsDir)) {\n if (!file.endsWith('.md')) {\n continue;\n }\n \n const content = await readTextFile(file);\n const metadata = extractMarkdownResourceMetadata(content);\n const resourcePath = normalizeResourcePath(file, repoRoot);\n \n resources.push({\n resourceType: 'command',\n resourcePath,\n displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),\n description: metadata.description,\n version: metadata.version,\n filePath: file,\n installKind: 'file',\n matchedBy: metadata.name ? 'frontmatter' : 'filename'\n });\n }\n \n return resources;\n}\n\n/**\n * Discover rules (rules/.../*.md)\n */\nasync function discoverRules(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const rulesDir = join(basePath, 'rules');\n \n if (!(await exists(rulesDir))) {\n return resources;\n }\n \n for await (const file of walkFiles(rulesDir)) {\n if (!file.endsWith('.md')) {\n continue;\n }\n \n const content = await readTextFile(file);\n const metadata = extractMarkdownResourceMetadata(content);\n const resourcePath = normalizeResourcePath(file, repoRoot);\n \n resources.push({\n resourceType: 'rule',\n resourcePath,\n displayName: preferFrontmatterName(metadata.name, defaultNameFromPath(file)),\n description: metadata.description,\n version: metadata.version,\n filePath: file,\n installKind: 'file',\n matchedBy: metadata.name ? 'frontmatter' : 'filename'\n });\n }\n \n return resources;\n}\n\n/**\n * Discover hooks (hooks/.../)\n */\nasync function discoverHooks(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const hooksDir = join(basePath, 'hooks');\n \n if (!(await exists(hooksDir))) {\n return resources;\n }\n \n // Discover hook files or directories\n for await (const file of walkFiles(hooksDir)) {\n const resourcePath = normalizeResourcePath(file, repoRoot);\n const displayName = basename(file);\n \n resources.push({\n resourceType: 'hook',\n resourcePath,\n displayName,\n filePath: file,\n installKind: 'file'\n });\n }\n \n return resources;\n}\n\n/**\n * Discover MCP server configuration files\n */\nasync function discoverMCP(\n basePath: string,\n repoRoot: string\n): Promise<DiscoveredResource[]> {\n const resources: DiscoveredResource[] = [];\n const mcpFiles = ['mcp.jsonc', 'mcp.json'];\n \n for (const filename of mcpFiles) {\n const filePath = join(basePath, filename);\n \n if (await exists(filePath)) {\n const resourcePath = normalizeResourcePath(filePath, repoRoot);\n \n resources.push({\n resourceType: 'mcp',\n resourcePath,\n displayName: 'configs',\n description: 'Model Context Protocol server configuration',\n filePath,\n installKind: 'file'\n });\n \n // Only return the first found\n break;\n }\n }\n \n return resources;\n}\n\n/**\n * Normalize resource path to be relative to repository root\n */\nfunction normalizeResourcePath(\n absolutePath: string,\n repoRoot: string\n): string {\n const rel = relative(repoRoot, absolutePath);\n return rel.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n", "import { splitFrontmatter } from '../markdown-frontmatter.js';\n\nexport interface MarkdownResourceMetadata {\n name?: string;\n description?: string;\n version?: string;\n}\n\nexport function extractMarkdownResourceMetadata(content: string): MarkdownResourceMetadata {\n const { frontmatter } = splitFrontmatter(content);\n\n if (!frontmatter || typeof frontmatter !== 'object') {\n return {};\n }\n\n return {\n name: typeof frontmatter.name === 'string' ? frontmatter.name : undefined,\n description: typeof frontmatter.description === 'string' ? frontmatter.description : undefined,\n version: extractVersionFromFrontmatter(frontmatter),\n };\n}\n\nfunction extractVersionFromFrontmatter(frontmatter: any): string | undefined {\n if (!frontmatter || typeof frontmatter !== 'object') {\n return undefined;\n }\n\n const version = frontmatter.version ?? frontmatter.metadata?.version;\n\n if (typeof version === 'string') {\n const trimmed = version.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ configManager
4
+ } from "./chunk-WF7H2YDU.js";
5
+ import {
6
+ resolvePrompt
7
+ } from "./chunk-RAKMX654.js";
8
+ import {
9
+ getPackagePath
10
+ } from "./chunk-GDVFS3YP.js";
11
+ import {
12
+ isScopedName,
13
+ normalizePackageName,
14
+ validatePackageName
15
+ } from "./chunk-VN22A7NW.js";
16
+ import {
17
+ exists
18
+ } from "./chunk-S47F4OG4.js";
19
+ import {
20
+ UserCancellationError
21
+ } from "./chunk-ID4SVDQZ.js";
22
+
23
+ // ../core/src/core/scoping/package-scoping.ts
24
+ async function isPackageNameTaken(name) {
25
+ let normalized = normalizePackageName(name);
26
+ return await exists(getPackagePath(normalized));
27
+ }
28
+ function buildScopedNameFromScope(unscopedName, scope) {
29
+ let normalizedScope = normalizePackageName(scope.replace(/^@/, "")), normalizedName = normalizePackageName(unscopedName);
30
+ return `@${normalizedScope}/${normalizedName}`;
31
+ }
32
+ async function ensureScopedNameAvailable(name) {
33
+ try {
34
+ validatePackageName(name);
35
+ } catch (error) {
36
+ throw new Error(error.message.replace("%s", name));
37
+ }
38
+ if (!isScopedName(name))
39
+ throw new Error("Name must be scoped (e.g. @scope/name)");
40
+ if (await isPackageNameTaken(name))
41
+ throw new Error(
42
+ `Package '${name}' already exists in local registry. Choose a different scoped name.`
43
+ );
44
+ }
45
+ async function getDefaultScopeForProfile(profileName) {
46
+ return profileName ? (await configManager.getAll()).profiles?.[profileName]?.defaults?.scope : void 0;
47
+ }
48
+ async function resolveScopedNameForPushWithUserScope(unscopedName, username, profileName, prompt) {
49
+ if (isScopedName(unscopedName))
50
+ throw new Error(`Expected unscoped name, received '${unscopedName}'`);
51
+ if (!username?.trim())
52
+ throw new Error("Username is required to apply default scope.");
53
+ let prm = prompt ?? resolvePrompt(), normalizedName = normalizePackageName(unscopedName), choice = await prm.select(
54
+ `Package '${normalizedName}' must be scoped before pushing. Choose a scope:`,
55
+ [
56
+ {
57
+ title: `Use default scope @${username}`,
58
+ value: "default",
59
+ description: `Renames to @${username}/${normalizedName}`
60
+ },
61
+ {
62
+ title: "Enter scope...",
63
+ value: "custom",
64
+ description: `Enter a custom scope for ${normalizedName}`
65
+ }
66
+ ],
67
+ "Use arrow keys to select, Enter to confirm"
68
+ );
69
+ if (!choice)
70
+ throw new UserCancellationError("Operation cancelled by user");
71
+ let scope = username;
72
+ if (choice === "custom") {
73
+ let initialScope = (await getDefaultScopeForProfile(profileName))?.replace(/^@/, "") || username, enteredScope = await prm.text(
74
+ `Enter a scope (without @) for '${normalizedName}':`,
75
+ {
76
+ initial: initialScope,
77
+ validate: async (value) => {
78
+ if (!value) return "Scope is required";
79
+ let candidate = buildScopedNameFromScope(normalizedName, value);
80
+ try {
81
+ return await ensureScopedNameAvailable(candidate), !0;
82
+ } catch (error) {
83
+ return error.message;
84
+ }
85
+ }
86
+ }
87
+ );
88
+ if (!enteredScope)
89
+ throw new UserCancellationError("Operation cancelled by user");
90
+ scope = enteredScope;
91
+ }
92
+ let scopedName = buildScopedNameFromScope(normalizedName, scope);
93
+ return await ensureScopedNameAvailable(scopedName), scopedName;
94
+ }
95
+
96
+ export {
97
+ resolveScopedNameForPushWithUserScope
98
+ };
99
+ //# sourceMappingURL=chunk-S26PR2BS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/scoping/package-scoping.ts"],
4
+ "sourcesContent": ["import { SCOPED_PACKAGE_REGEX, GITHUB_PACKAGE_REGEX, normalizePackageName, validatePackageName, isScopedName } from '../../utils/package-name.js';\n\nexport { isScopedName } from '../../utils/package-name.js';\nimport { listAllPackages, getPackagePath } from '../directory.js';\nimport { exists } from '../../utils/fs.js';\nimport { configManager } from '../config.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt } from '../ports/resolve.js';\nimport { UserCancellationError } from '../../utils/errors.js';\n\n/**\n * Extract the local (non-scope) part from a package name.\n */\nexport function getLocalPart(name: string): string {\n const match = name.match(SCOPED_PACKAGE_REGEX);\n return match ? match[2] : name;\n}\n\n/**\n * Get all scoped package names in the local registry that share the same local name.\n */\nconst PACKAGE_LIST_CACHE_TTL_MS = 5000;\nlet cachedPackageList: string[] | null = null;\nlet cachedPackageListTimestamp = 0;\n\nasync function getCachedPackageList(): Promise<string[]> {\n const now = Date.now();\n if (cachedPackageList && now - cachedPackageListTimestamp < PACKAGE_LIST_CACHE_TTL_MS) {\n return cachedPackageList;\n }\n\n cachedPackageList = await listAllPackages();\n cachedPackageListTimestamp = now;\n return cachedPackageList;\n}\n\nexport async function findScopedVariantsInRegistry(baseName: string): Promise<string[]> {\n const normalizedBase = normalizePackageName(baseName);\n const packages = await getCachedPackageList();\n\n return packages.filter(candidate => {\n const match = candidate.match(SCOPED_PACKAGE_REGEX);\n if (!match) {\n return false;\n }\n const localPart = normalizePackageName(match[2]);\n return localPart === normalizedBase;\n });\n}\n\nasync function isPackageNameTaken(name: string): Promise<boolean> {\n const normalized = normalizePackageName(name);\n return await exists(getPackagePath(normalized));\n}\n\nfunction buildScopedNameFromScope(unscopedName: string, scope: string): string {\n const normalizedScope = normalizePackageName(scope.replace(/^@/, ''));\n const normalizedName = normalizePackageName(unscopedName);\n return `@${normalizedScope}/${normalizedName}`;\n}\n\nasync function ensureScopedNameAvailable(name: string): Promise<void> {\n try {\n validatePackageName(name);\n } catch (error) {\n throw new Error((error as Error).message.replace('%s', name));\n }\n\n if (!isScopedName(name)) {\n throw new Error('Name must be scoped (e.g. @scope/name)');\n }\n\n if (await isPackageNameTaken(name)) {\n throw new Error(\n `Package '${name}' already exists in local registry. Choose a different scoped name.`\n );\n }\n}\n\n/**\n * Fetch the configured default scope for a given profile (if any).\n */\nexport async function getDefaultScopeForProfile(profileName?: string): Promise<string | undefined> {\n if (!profileName) {\n return undefined;\n }\n\n const config = await configManager.getAll();\n const profileConfig = config.profiles?.[profileName];\n return profileConfig?.defaults?.scope;\n}\n\n/**\n * Suggest a scoped package name using the configured default scope.\n */\nexport async function suggestScopedNameFromConfig(\n unscopedName: string,\n profileName?: string\n): Promise<string | undefined> {\n const defaultScope = await getDefaultScopeForProfile(profileName);\n if (!defaultScope) {\n return undefined;\n }\n\n const normalizedScope = normalizePackageName(defaultScope.replace(/^@/, ''));\n const normalizedName = normalizePackageName(unscopedName);\n return `@${normalizedScope}/${normalizedName}`;\n}\n\n/**\n * Prompt user for a new scoped name and ensure it does not already exist locally.\n */\nexport async function promptForNewScopedName(\n baseName: string,\n profileName?: string,\n message?: string,\n prompt?: PromptPort\n): Promise<string> {\n const prm = prompt ?? resolvePrompt();\n const initial = await suggestScopedNameFromConfig(baseName, profileName);\n\n const scopedName = await prm.text(\n message ?? `Enter a scoped name for '${baseName}' (format @scope/${baseName}):`,\n {\n initial,\n validate: async (value: string) => {\n if (!value) return 'Name is required';\n try {\n await ensureScopedNameAvailable(value);\n return true;\n } catch (error) {\n return (error as Error).message;\n }\n }\n }\n );\n\n if (!scopedName) {\n throw new UserCancellationError('Operation cancelled by user');\n }\n\n return normalizePackageName(scopedName);\n}\n\n/**\n * Determine the scoped name to use when pushing an unscoped package.\n */\nexport async function resolveScopedNameForPush(\n unscopedName: string,\n profileName?: string,\n prompt?: PromptPort\n): Promise<string> {\n if (isScopedName(unscopedName)) {\n throw new Error(`Expected unscoped name, received '${unscopedName}'`);\n }\n\n return await promptForNewScopedName(\n unscopedName,\n profileName,\n `Remote registry requires a scope. Enter a scoped name for '${unscopedName}' (format @scope/${unscopedName}):`,\n prompt\n );\n}\n\nexport async function resolveScopedNameForPushWithUserScope(\n unscopedName: string,\n username: string,\n profileName?: string,\n prompt?: PromptPort\n): Promise<string> {\n if (isScopedName(unscopedName)) {\n throw new Error(`Expected unscoped name, received '${unscopedName}'`);\n }\n\n if (!username?.trim()) {\n throw new Error('Username is required to apply default scope.');\n }\n\n const prm = prompt ?? resolvePrompt();\n const normalizedName = normalizePackageName(unscopedName);\n\n const choice = await prm.select<'default' | 'custom'>(\n `Package '${normalizedName}' must be scoped before pushing. Choose a scope:`,\n [\n {\n title: `Use default scope @${username}`,\n value: 'default' as const,\n description: `Renames to @${username}/${normalizedName}`\n },\n {\n title: 'Enter scope...',\n value: 'custom' as const,\n description: `Enter a custom scope for ${normalizedName}`\n }\n ],\n 'Use arrow keys to select, Enter to confirm'\n );\n\n if (!choice) {\n throw new UserCancellationError('Operation cancelled by user');\n }\n\n let scope = username;\n if (choice === 'custom') {\n const profileScope = await getDefaultScopeForProfile(profileName);\n const initialScope = profileScope?.replace(/^@/, '') || username;\n\n const enteredScope = await prm.text(\n `Enter a scope (without @) for '${normalizedName}':`,\n {\n initial: initialScope,\n validate: async (value: string) => {\n if (!value) return 'Scope is required';\n\n const candidate = buildScopedNameFromScope(normalizedName, value);\n try {\n await ensureScopedNameAvailable(candidate);\n return true;\n } catch (error) {\n return (error as Error).message;\n }\n }\n }\n );\n\n if (!enteredScope) {\n throw new UserCancellationError('Operation cancelled by user');\n }\n\n scope = enteredScope;\n }\n\n const scopedName = buildScopedNameFromScope(normalizedName, scope);\n await ensureScopedNameAvailable(scopedName);\n return scopedName;\n}\n\nexport interface SaveNameResolution {\n effectiveName: string;\n selectedExistingScopedName?: string;\n newScopedName?: string;\n nameChanged: boolean;\n}\n\n/**\n * Resolve which name should be used for a save invocation, prompting when needed.\n */\nexport async function resolveEffectiveNameForSave(\n inputName: string,\n profileName?: string,\n prompt?: PromptPort\n): Promise<SaveNameResolution> {\n const prm = prompt ?? resolvePrompt();\n const normalizedInput = normalizePackageName(inputName);\n\n if (isScopedName(normalizedInput)) {\n return {\n effectiveName: normalizedInput,\n nameChanged: false\n };\n }\n\n const scopedVariants = await findScopedVariantsInRegistry(normalizedInput);\n if (scopedVariants.length === 0) {\n return {\n effectiveName: normalizedInput,\n nameChanged: false\n };\n }\n\n const choice = await prm.select<string>(\n `Found scoped packages matching '${normalizedInput}'. How should this save proceed?`,\n [\n ...scopedVariants.map(variant => ({\n title: `Use existing scoped package ${variant}`,\n value: variant,\n description: `Treat this package as '${variant}'`\n })),\n {\n title: 'Create a new scoped name',\n value: '__create_new_scoped__',\n description: 'Create a brand new scoped identity (will prompt for name)'\n },\n {\n title: `Keep unscoped name '${normalizedInput}'`,\n value: '__keep_unscoped__',\n description: 'Continue saving as unscoped (push will still require scoping later)'\n }\n ],\n 'Use arrow keys to select, Enter to confirm'\n );\n\n if (!choice) {\n throw new UserCancellationError('Operation cancelled by user');\n }\n\n if (choice === '__keep_unscoped__') {\n return {\n effectiveName: normalizedInput,\n nameChanged: false\n };\n }\n\n if (choice === '__create_new_scoped__') {\n const newScopedName = await promptForNewScopedName(normalizedInput, profileName, undefined, prm);\n return {\n effectiveName: newScopedName,\n newScopedName,\n nameChanged: newScopedName !== normalizedInput\n };\n }\n\n const normalizedChoice = normalizePackageName(choice);\n return {\n effectiveName: normalizedChoice,\n selectedExistingScopedName: normalizedChoice,\n nameChanged: normalizedChoice !== normalizedInput\n };\n}\n\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAkDA,eAAe,mBAAmB,MAAgC;AAChE,MAAM,aAAa,qBAAqB,IAAI;AAC5C,SAAO,MAAM,OAAO,eAAe,UAAU,CAAC;AAChD;AAEA,SAAS,yBAAyB,cAAsB,OAAuB;AAC7E,MAAM,kBAAkB,qBAAqB,MAAM,QAAQ,MAAM,EAAE,CAAC,GAC9D,iBAAiB,qBAAqB,YAAY;AACxD,SAAO,IAAI,eAAe,IAAI,cAAc;AAC9C;AAEA,eAAe,0BAA0B,MAA6B;AACpE,MAAI;AACF,wBAAoB,IAAI;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,IAAI,MAAO,MAAgB,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,aAAa,IAAI;AACpB,UAAM,IAAI,MAAM,wCAAwC;AAG1D,MAAI,MAAM,mBAAmB,IAAI;AAC/B,UAAM,IAAI;AAAA,MACR,YAAY,IAAI;AAAA,IAClB;AAEJ;AAKA,eAAsB,0BAA0B,aAAmD;AACjG,SAAK,eAIU,MAAM,cAAc,OAAO,GACb,WAAW,WAAW,GAC7B,UAAU,QAL9B;AAMJ;AA0EA,eAAsB,sCACpB,cACA,UACA,aACA,QACiB;AACjB,MAAI,aAAa,YAAY;AAC3B,UAAM,IAAI,MAAM,qCAAqC,YAAY,GAAG;AAGtE,MAAI,CAAC,UAAU,KAAK;AAClB,UAAM,IAAI,MAAM,8CAA8C;AAGhE,MAAM,MAAM,UAAU,cAAc,GAC9B,iBAAiB,qBAAqB,YAAY,GAElD,SAAS,MAAM,IAAI;AAAA,IACvB,YAAY,cAAc;AAAA,IAC1B;AAAA,MACE;AAAA,QACE,OAAO,sBAAsB,QAAQ;AAAA,QACrC,OAAO;AAAA,QACP,aAAa,eAAe,QAAQ,IAAI,cAAc;AAAA,MACxD;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,aAAa,4BAA4B,cAAc;AAAA,MACzD;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC;AACH,UAAM,IAAI,sBAAsB,6BAA6B;AAG/D,MAAI,QAAQ;AACZ,MAAI,WAAW,UAAU;AAEvB,QAAM,gBADe,MAAM,0BAA0B,WAAW,IAC7B,QAAQ,MAAM,EAAE,KAAK,UAElD,eAAe,MAAM,IAAI;AAAA,MAC7B,kCAAkC,cAAc;AAAA,MAChD;AAAA,QACE,SAAS;AAAA,QACT,UAAU,OAAO,UAAkB;AACjC,cAAI,CAAC,MAAO,QAAO;AAEnB,cAAM,YAAY,yBAAyB,gBAAgB,KAAK;AAChE,cAAI;AACF,yBAAM,0BAA0B,SAAS,GAClC;AAAA,UACT,SAAS,OAAO;AACd,mBAAQ,MAAgB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC;AACH,YAAM,IAAI,sBAAsB,6BAA6B;AAG/D,YAAQ;AAAA,EACV;AAEA,MAAM,aAAa,yBAAyB,gBAAgB,KAAK;AACjE,eAAM,0BAA0B,UAAU,GACnC;AACT;",
6
+ "names": []
7
+ }