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": ["../src/commands/add.ts", "../../core/src/core/add/add-to-source-pipeline.ts", "../../core/src/core/add/source-collector.ts", "../../core/src/core/add/add-conflict-handler.ts", "../../core/src/core/add/add-orchestrator.ts", "../../core/src/core/add/add-input-classifier.ts", "../../core/src/core/add/add-dependency-flow.ts"],
4
+ "sourcesContent": ["/**\n * Add Command (CLI layer)\n *\n * Thin shell over core/add/ pipelines.\n * Handles CLI arg parsing, interactive file selection, and display formatting.\n */\n\nimport type { Command } from 'commander';\nimport { join, relative } from 'path';\n\nimport { runAddToSourcePipelineBatch, type AddToSourceResult } from '@opkg/core/core/add/add-to-source-pipeline.js';\nimport { processAddResource, type AddResourceResult } from '@opkg/core/core/add/add-orchestrator.js';\nimport { formatPathForDisplay, getTreeConnector } from '@opkg/core/utils/formatters.js';\nimport { interactiveFileSelect } from '../utils/interactive-file-selector.js';\nimport { expandDirectorySelections, hasDirectorySelections } from '@opkg/core/utils/expand-directory-selections.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveMutableSource } from '@opkg/core/core/source-resolution/resolve-mutable-source.js';\nimport { buildWorkspacePackageContext } from '@opkg/core/utils/workspace-package-context.js';\nimport { createInteractionPolicy, PromptTier } from '@opkg/core/core/interaction-policy.js';\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js';\n\n// ---------------------------------------------------------------------------\n// Display helpers (CLI-specific)\n// ---------------------------------------------------------------------------\n\nfunction displayAddResults(data: AddToSourceResult, out: ReturnType<typeof resolveOutput>, interactive: boolean, skipHeader = false): void {\n const { filesAdded, packageName: resolvedName, addedFilePaths, isWorkspaceRoot, sourcePath } = data;\n const target = isWorkspaceRoot ? 'workspace package' : resolvedName;\n\n if (interactive && !skipHeader) {\n const pkgLabel = isWorkspaceRoot ? 'workspace package' : resolvedName;\n const displayPath = formatPathForDisplay(sourcePath, process.cwd());\n out.info(`To: ${pkgLabel} (${displayPath})`);\n }\n\n if (filesAdded > 0) {\n const count = filesAdded === 1 ? '1 file' : `${filesAdded} files`;\n if (interactive) {\n out.success(`Added ${count} to ${target}`);\n } else {\n const displayPath = formatPathForDisplay(sourcePath, process.cwd());\n out.success(`Added ${count} to ${target} (${displayPath})`);\n }\n const sortedFiles = [...(addedFilePaths || [])].sort((a, b) => a.localeCompare(b));\n const relPaths = sortedFiles.map((f) => relative(sourcePath, f).replace(/\\\\/g, '/'));\n\n if (interactive) {\n const maxDisplay = 10;\n const displayPaths = relPaths.slice(0, maxDisplay);\n const more = relPaths.length > maxDisplay ? `\\n... and ${relPaths.length - maxDisplay} more` : '';\n out.note(displayPaths.join('\\n') + more, 'Added files');\n } else {\n for (let i = 0; i < relPaths.length; i++) {\n const connector = getTreeConnector(i === relPaths.length - 1);\n out.message(` ${connector}${relPaths[i]}`);\n }\n }\n } else {\n out.success(`No new files added to ${target}`);\n }\n}\n\nfunction displayDependencyResult(depResult: AddResourceResult & { kind: 'dependency' }, out: ReturnType<typeof resolveOutput>, interactive: boolean): void {\n const { result: dep, classification } = depResult;\n const displayPath = formatPathForDisplay(dep.targetManifest, process.cwd());\n\n if (interactive) {\n // Interactive mode: keep existing clack-based display\n const header = `To: ${dep.packageName} (${displayPath})`;\n out.info(header);\n if (dep.wasAutoDetected) {\n out.info(`Detected package at ${classification.localPath} \u2014 adding as dependency.`);\n out.message('To copy files instead, use --copy.');\n }\n const versionSuffix = classification.version ? `@${classification.version}` : '';\n out.success(`Added ${dep.packageName}${versionSuffix} to ${dep.section}`);\n } else {\n // Non-interactive: clean tree format\n // \u2713 Added to dependencies (.openpackage/openpackage.yml)\n // \u2514\u2500\u2500 essentials@1.2.0\n out.success(`Added to ${dep.section} (${displayPath})`);\n const versionSuffix = classification.version ? `@${classification.version}` : '';\n const connector = getTreeConnector(true);\n out.message(` ${connector}${dep.packageName}${versionSuffix}`);\n if (dep.wasAutoDetected) {\n out.message(' Detected local package \u2014 use --copy to copy files instead.');\n }\n }\n}\n\nfunction displayResult(result: AddResourceResult, out: ReturnType<typeof resolveOutput>, interactive: boolean, resourceSpec: string): void {\n switch (result.kind) {\n case 'dependency':\n displayDependencyResult(result, out, interactive);\n break;\n case 'workspace-resource':\n if (result.result.data) {\n out.info(`Resolved \"${resourceSpec}\" from installed workspace resources.`);\n displayAddResults(result.result.data, out, interactive);\n }\n break;\n case 'copy':\n if (result.result.data) {\n displayAddResults(result.result.data, out, interactive);\n }\n break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Command setup\n// ---------------------------------------------------------------------------\n\nexport async function setupAddCommand(args: any[]): Promise<void> {\n const [resource, options, command] = args as [string | undefined, any, Command];\n const cwd = process.cwd();\n const programOpts = command.parent?.opts() || {};\n const interactive = !resource;\n\n const execContext = await createCliExecutionContext({\n global: false,\n cwd: programOpts.cwd,\n interactive,\n outputMode: interactive ? 'rich' : 'plain',\n });\n\n const policy = createInteractionPolicy({ interactive, force: options.force });\n execContext.interactionPolicy = policy;\n const out = resolveOutput(execContext);\n\n if (!resource) {\n // Interactive file selector path\n if (!policy.canPrompt(PromptTier.OptionalMenu)) {\n throw new Error(\n '<resource-spec> argument is required in non-interactive mode.\\n' +\n 'Usage: opkg add <resource-spec> [options]'\n );\n }\n\n let pkgLabel: string;\n let sourcePath: string;\n if (options.to) {\n const source = await resolveMutableSource({ cwd, packageName: options.to });\n pkgLabel = source.packageName;\n sourcePath = source.absolutePath;\n } else {\n const context = await buildWorkspacePackageContext(cwd);\n pkgLabel = 'workspace package';\n sourcePath = context.packageRootDir;\n }\n out.step(`To: ${pkgLabel} (${formatPathForDisplay(sourcePath, cwd)})`);\n out.connector();\n\n const selectedFiles = await interactiveFileSelect({ cwd, includeDirs: true });\n if (!selectedFiles || selectedFiles.length === 0) return;\n\n let filesToProcess: string[];\n if (hasDirectorySelections(selectedFiles)) {\n filesToProcess = await expandDirectorySelections(selectedFiles, cwd);\n out.info(`Found ${filesToProcess.length} total file${filesToProcess.length === 1 ? '' : 's'} to add`);\n } else {\n filesToProcess = selectedFiles;\n }\n\n const absPaths = filesToProcess.map((f) => join(cwd, f));\n const result = await runAddToSourcePipelineBatch(options.to, absPaths, cwd, { ...options, execContext });\n if (!result.success) throw new Error(result.error || 'Add operation failed');\n if (result.data) displayAddResults(result.data, out, interactive, true);\n return;\n }\n\n // Non-interactive: delegate to core orchestrator\n const result = await processAddResource(resource, options, cwd, execContext);\n displayResult(result, out, interactive, resource);\n}\n", "import { resolve as resolvePath, join } from 'path';\n\nimport type { CommandResult } from '../../types/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport { assertMutableSourceOrThrow } from '../source-mutability.js';\nimport { collectSourceEntries, type SourceEntry } from './source-collector.js';\nimport { copyFilesWithConflictResolution } from './add-conflict-handler.js';\nimport type { PackageContext } from '../package-context.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { exists } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { resolveSourceOperationArguments } from '../../utils/source-operation-arguments.js';\nimport { buildWorkspacePackageContext } from '../workspace-package-context.js';\n\nexport interface AddToSourceOptions {\n platformSpecific?: boolean;\n force?: boolean;\n execContext?: ExecutionContext;\n}\n\nexport interface AddToSourceResult {\n packageName: string;\n filesAdded: number;\n sourcePath: string;\n sourceType: 'workspace' | 'global';\n isWorkspaceRoot: boolean;\n addedFilePaths: string[];\n}\n\nexport async function runAddToSourcePipeline(\n packageName: string | undefined,\n pathArg: string | undefined,\n options: AddToSourceOptions = {}\n): Promise<CommandResult<AddToSourceResult>> {\n const cwd = process.cwd();\n\n // Resolve arguments: packageName from --to option, pathArg is required\n const { resolvedPackageName, resolvedPath } = await resolveSourceOperationArguments(\n cwd,\n packageName,\n pathArg,\n { command: 'add', checkWorkspaceRoot: false }\n );\n\n const absInputPath = resolvePath(cwd, resolvedPath);\n if (!(await exists(absInputPath))) {\n return { success: false, error: `Path not found: ${resolvedPath}` };\n }\n\n // Build package context (workspace root or mutable package source)\n let packageContext: Pick<PackageContext, 'name' | 'version' | 'config' | 'packageYmlPath' | 'packageRootDir' | 'packageFilesDir'>;\n let sourceType: 'workspace' | 'global';\n const isWorkspaceRoot = resolvedPackageName === null;\n \n if (isWorkspaceRoot) {\n // No package name: add to workspace root (.openpackage/)\n try {\n packageContext = await buildWorkspacePackageContext(cwd);\n sourceType = 'workspace';\n \n logger.info('Adding files to workspace package', {\n sourcePath: packageContext.packageRootDir,\n inputPath: resolvedPath\n });\n } catch (error) {\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n } else {\n // Package name provided: resolve mutable source\n let source;\n try {\n source = await resolveMutableSource({ cwd, packageName: resolvedPackageName });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n \n // Additional safety check\n assertMutableSourceOrThrow(source.absolutePath, { packageName: source.packageName, command: 'add' });\n\n packageContext = await buildPackageContextFromSource(source);\n sourceType = source.absolutePath.includes(`${cwd}/.openpackage/packages/`) \n ? 'workspace' as const\n : 'global' as const;\n \n logger.info('Adding files to package source', {\n packageName: source.packageName,\n sourcePath: source.absolutePath,\n sourceType: source.sourceType,\n inputPath: resolvedPath\n });\n }\n\n // Collect entries - source-collector now handles flow-based mapping\n const entries = await collectSourceEntries(absInputPath, cwd);\n\n const changed = await copyFilesWithConflictResolution(packageContext, entries, options);\n\n logger.info('Files copied to package source', {\n packageName: packageContext.name,\n filesAdded: changed.length\n });\n\n // Build array of added file paths (package-root-relative paths)\n const addedFilePaths = changed.map(file => join(packageContext.packageRootDir, file.path));\n\n return {\n success: true,\n data: {\n packageName: packageContext.name,\n filesAdded: changed.length,\n sourcePath: packageContext.packageRootDir,\n sourceType,\n isWorkspaceRoot,\n addedFilePaths\n }\n };\n}\n\n/**\n * Run add pipeline for multiple paths as a single batch (one copy pass, one result).\n * Used when interactive selection yields multiple files.\n */\nexport async function runAddToSourcePipelineBatch(\n packageName: string | undefined,\n absPaths: string[],\n cwd: string,\n options: AddToSourceOptions = {}\n): Promise<CommandResult<AddToSourceResult>> {\n let packageContext: Pick<PackageContext, 'name' | 'version' | 'config' | 'packageYmlPath' | 'packageRootDir' | 'packageFilesDir'>;\n let sourceType: 'workspace' | 'global';\n const isWorkspaceRoot = !packageName;\n\n if (isWorkspaceRoot) {\n try {\n packageContext = await buildWorkspacePackageContext(cwd);\n sourceType = 'workspace';\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n } else {\n let source;\n try {\n source = await resolveMutableSource({ cwd, packageName });\n assertMutableSourceOrThrow(source.absolutePath, { packageName: source.packageName, command: 'add' });\n packageContext = await buildPackageContextFromSource(source);\n sourceType = source.absolutePath.includes(`${cwd}/.openpackage/packages/`) ? 'workspace' : 'global';\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n const allEntries: SourceEntry[] = [];\n const seenRegistryPaths = new Set<string>();\n\n for (const absPath of absPaths) {\n if (!(await exists(absPath))) {\n return { success: false, error: `Path not found: ${absPath}` };\n }\n try {\n const entries = await collectSourceEntries(absPath, cwd);\n for (const entry of entries) {\n if (!seenRegistryPaths.has(entry.registryPath)) {\n seenRegistryPaths.add(entry.registryPath);\n allEntries.push(entry);\n }\n }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n if (allEntries.length === 0) {\n return { success: true, data: { packageName: packageContext.name, filesAdded: 0, sourcePath: packageContext.packageRootDir, sourceType, isWorkspaceRoot, addedFilePaths: [] } };\n }\n\n const changed = await copyFilesWithConflictResolution(packageContext, allEntries, options);\n const addedFilePaths = changed.map(f => join(packageContext.packageRootDir, f.path));\n\n return {\n success: true,\n data: {\n packageName: packageContext.name,\n filesAdded: changed.length,\n sourcePath: packageContext.packageRootDir,\n sourceType,\n isWorkspaceRoot,\n addedFilePaths\n }\n };\n}\n\n/**\n * Build context for workspace root package at .openpackage/\n * Creates the workspace manifest if it doesn't exist.\n */\ntype AddContext = Pick<PackageContext, 'name' | 'version' | 'config' | 'packageYmlPath' | 'packageRootDir' | 'packageFilesDir'>;\n\n/**\n * Build add context from a resolved mutable source.\n */\nasync function buildPackageContextFromSource(\n source: Awaited<ReturnType<typeof resolveMutableSource>>\n): Promise<AddContext> {\n const packageYmlPath = join(source.absolutePath, FILE_PATTERNS.OPENPACKAGE_YML);\n const config = await parsePackageYml(packageYmlPath);\n\n return {\n name: source.packageName,\n version: config.version,\n config,\n packageYmlPath,\n packageRootDir: source.absolutePath,\n packageFilesDir: source.absolutePath\n };\n}\n\n\n\n\n", "import { relative, basename } from 'path';\nimport { realpathSync } from 'fs';\n\nimport { DIR_PATTERNS } from '../../constants/index.js';\nimport { isDirectory, isFile, walkFiles } from '../../utils/fs.js';\nimport { normalizePathForProcessing } from '../../utils/path-normalization.js';\nimport { mapWorkspaceFileToUniversal } from '../platform/platform-mapper.js';\nimport { isPlatformRootFile } from '../platform/platform-utils.js';\nimport type { Flow } from '../../types/flows.js';\n\nexport interface SourceEntry {\n sourcePath: string;\n registryPath: string;\n flow?: Flow;\n}\n\n/**\n * Collect source entries from a workspace path for adding to a package source.\n * Uses IMPORT flows (workspace \u2192 package direction) to map files correctly.\n */\nexport async function collectSourceEntries(resolvedPath: string, cwd: string): Promise<SourceEntry[]> {\n const entries: SourceEntry[] = [];\n\n if (await isDirectory(resolvedPath)) {\n for await (const filePath of walkFiles(resolvedPath)) {\n const entry = deriveSourceEntry(filePath, cwd);\n if (!entry) {\n throw new Error(`Unsupported file inside directory: ${relative(cwd, filePath)}`);\n }\n entries.push(entry);\n }\n return entries;\n }\n\n if (await isFile(resolvedPath)) {\n const entry = deriveSourceEntry(resolvedPath, cwd);\n if (!entry) {\n throw new Error(`Unsupported file: ${relative(cwd, resolvedPath)}`);\n }\n entries.push(entry);\n return entries;\n }\n\n throw new Error(`Unsupported path type: ${resolvedPath}`);\n}\n\n/**\n * Derive a source entry from an absolute file path.\n * Uses IMPORT flows to map workspace files to their universal package paths.\n * \n * Flow-based mapping:\n * 1. Try to match against platform IMPORT flows (workspace \u2192 package)\n * 2. Check if it's a platform root file (AGENTS.md, CLAUDE.md, etc.)\n * 3. Otherwise, treat as root-level content (stored at package root)\n */\nfunction deriveSourceEntry(absFilePath: string, cwd: string): SourceEntry | null {\n // Resolve symlinks to ensure consistent path comparison\n const realFilePath = realpathSync(absFilePath);\n const realCwd = realpathSync(cwd);\n const relativePath = relative(realCwd, realFilePath);\n const normalizedRelPath = normalizePathForProcessing(relativePath);\n\n // 1. Try to map using platform IMPORT flows (workspace \u2192 package direction)\n const mapping = mapWorkspaceFileToUniversal(absFilePath, cwd);\n if (mapping) {\n // Successfully mapped via import flow\n // Construct registry path: subdir/relPath (e.g., \"commands/test.md\")\n const registryPath = [mapping.subdir, mapping.relPath].filter(Boolean).join('/');\n return {\n sourcePath: absFilePath,\n registryPath,\n flow: mapping.flow\n };\n }\n\n // 2. Check if this is a platform root file (e.g., AGENTS.md, CLAUDE.md)\n const fileName = basename(normalizedRelPath);\n if (fileName && isPlatformRootFile(fileName) && !normalizedRelPath.includes('/')) {\n // Root files: stored at package root with no prefix\n return {\n sourcePath: absFilePath,\n registryPath: fileName\n };\n }\n\n // 3. All other files: treat as root-level content\n // These are non-platform-specific files stored at package root under root/\n return {\n sourcePath: absFilePath,\n registryPath: `root/${normalizedRelPath}`\n };\n}\n\n", "import { basename, dirname, extname, join, relative as pathRelative } from 'path';\n\nimport type { PackageFile } from '../../types/index.js';\nimport { ensureDir, exists, readTextFile, writeTextFile } from '../../utils/fs.js';\nimport { UserCancellationError } from '../../utils/errors.js';\nimport { logger } from '../../utils/logger.js';\nimport type { SourceEntry } from './source-collector.js';\nimport type { PackageContext } from '../package-context.js';\nimport { PromptTier } from '../../core/interaction-policy.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt, resolveOutput } from '../ports/resolve.js';\nimport { applyMapPipeline, createMapContext, splitMapPipeline } from '../flows/map-pipeline/index.js';\nimport { defaultTransformRegistry } from '../flows/flow-transforms.js';\nimport { parseMarkdownDocument, serializeMarkdownDocument } from '../flows/markdown.js';\n\ntype ConflictDecision = 'keep-existing' | 'overwrite';\n\n/**\n * Resolve the target path for a registry path.\n * Registry paths are package-root-relative (universal subdirs already at root)\n */\nfunction resolveTargetPath(packageContext: Pick<PackageContext, 'packageRootDir'>, registryPath: string): string {\n return join(packageContext.packageRootDir, registryPath);\n}\n\nfunction transformMarkdownWithFlowMap(\n raw: string,\n entry: SourceEntry,\n workspaceRoot: string\n): { transformed: boolean; output: string } {\n const flow = entry.flow;\n if (!flow?.map || flow.map.length === 0) {\n return { transformed: false, output: raw };\n }\n\n // Only transform markdown for now (the reported regression is agent markdown frontmatter)\n if (!['.md', '.mdc'].includes(extname(entry.sourcePath).toLowerCase())) {\n return { transformed: false, output: raw };\n }\n\n // Parse markdown frontmatter leniently: if frontmatter is invalid, treat as plain markdown\n const parsed = parseMarkdownDocument(raw, { lenient: true });\n if (!parsed.frontmatter) {\n return { transformed: false, output: raw };\n }\n\n // Apply flow.map to frontmatter, same as flow executor does for markdown\n const mapContext = createMapContext({\n filename: basename(entry.sourcePath, extname(entry.sourcePath)),\n dirname: basename(dirname(entry.sourcePath)),\n path: pathRelative(workspaceRoot, entry.sourcePath).replace(/\\\\/g, '/'),\n ext: extname(entry.sourcePath),\n });\n\n // Split schema vs pipe ops (match flow-executor semantics)\n const { schemaOps, pipeOps } = splitMapPipeline(flow.map);\n\n let nextFrontmatter = parsed.frontmatter;\n if (schemaOps.length > 0) {\n nextFrontmatter = applyMapPipeline(nextFrontmatter, schemaOps as any, mapContext, defaultTransformRegistry);\n }\n if (pipeOps.length > 0) {\n nextFrontmatter = applyMapPipeline(nextFrontmatter, pipeOps as any, mapContext, defaultTransformRegistry);\n }\n\n const output = serializeMarkdownDocument({ frontmatter: nextFrontmatter, body: parsed.body });\n return { transformed: true, output };\n}\n\nexport interface CopyFilesWithConflictResolutionOptions {\n force?: boolean;\n execContext?: { interactionPolicy?: { canPrompt(tier: PromptTier): boolean }; prompt?: PromptPort };\n prompt?: PromptPort;\n}\n\nexport async function copyFilesWithConflictResolution(\n packageContext: Pick<PackageContext, 'name' | 'packageRootDir'>,\n entries: SourceEntry[],\n options: CopyFilesWithConflictResolutionOptions = {}\n): Promise<PackageFile[]> {\n const changedFiles: PackageFile[] = [];\n const { name } = packageContext;\n const policy = options.execContext?.interactionPolicy;\n const forceOverwrite = options.force ?? false;\n\n for (const entry of entries) {\n // Resolve target path based on registry path format\n const destination = resolveTargetPath(packageContext, entry.registryPath);\n\n const sourceContent = await readTextFile(entry.sourcePath);\n const transformed = transformMarkdownWithFlowMap(sourceContent, entry, process.cwd());\n const contentToWrite = transformed.output;\n const destExists = await exists(destination);\n\n if (destExists) {\n const existingContent = await readTextFile(destination).catch(() => '');\n\n if (existingContent === contentToWrite) {\n logger.debug(`Skipping unchanged file: ${entry.registryPath}`);\n continue;\n }\n\n let decision: ConflictDecision;\n if (forceOverwrite) {\n decision = 'overwrite';\n } else if (policy?.canPrompt(PromptTier.Confirmation)) {\n const effectivePrompt = options.prompt ?? options.execContext?.prompt;\n decision = await promptConflictDecision(name, entry.registryPath, effectivePrompt);\n } else {\n resolveOutput().warn(`Skipping '${entry.registryPath}' (already exists). Use --force to overwrite.`);\n continue;\n }\n\n if (decision === 'keep-existing') {\n logger.debug(`Kept existing file for ${entry.registryPath}`);\n continue;\n }\n }\n\n await ensureDir(dirname(destination));\n await writeTextFile(destination, contentToWrite);\n\n changedFiles.push({\n path: entry.registryPath,\n content: contentToWrite,\n encoding: 'utf8'\n });\n }\n\n return changedFiles;\n}\n\nasync function promptConflictDecision(packageName: string, registryPath: string, prompt?: PromptPort): Promise<ConflictDecision> {\n const p = prompt ?? resolvePrompt();\n const decision = await p.select<ConflictDecision | 'cancel'>(\n `File '${registryPath}' already exists in package '${packageName}'. Choose how to proceed:`,\n [\n { title: 'Keep existing file (skip)', value: 'keep-existing' },\n { title: 'Replace with workspace file', value: 'overwrite' },\n { title: 'Cancel operation', value: 'cancel' }\n ]\n );\n\n if (decision === 'cancel') {\n throw new UserCancellationError();\n }\n\n return decision as ConflictDecision;\n}\n\n", "/**\n * Add Orchestrator\n *\n * Core orchestration logic for the `add` command.\n * Classifies input, dispatches to the correct pipeline (dependency, workspace-resource, copy),\n * and returns typed results. No terminal-UI dependencies.\n */\n\nimport { join, resolve } from 'path';\n\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport type { CommandResult } from '../../types/index.js';\nimport { classifyAddInput, type AddInputClassification, type AddClassifyOptions } from './add-input-classifier.js';\nimport { runAddDependencyFlow, type AddDependencyResult, type AddDependencyOptions } from './add-dependency-flow.js';\nimport { runAddToSourcePipeline, runAddToSourcePipelineBatch, type AddToSourceResult, type AddToSourceOptions } from './add-to-source-pipeline.js';\nimport { exists } from '../../utils/fs.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type AddResourceResult =\n | { kind: 'dependency'; result: AddDependencyResult; classification: AddInputClassification }\n | { kind: 'copy'; result: CommandResult<AddToSourceResult> }\n | { kind: 'workspace-resource'; result: CommandResult<AddToSourceResult> };\n\nexport interface ProcessAddResourceOptions {\n copy?: boolean;\n dev?: boolean;\n to?: string;\n platformSpecific?: boolean;\n force?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Orchestration\n// ---------------------------------------------------------------------------\n\n/** Check if input looks like a bare name (could be registry or local path) */\nfunction isBareNameInput(input: string): boolean {\n return (\n !input.startsWith('./') &&\n !input.startsWith('../') &&\n !input.startsWith('/') &&\n !input.startsWith('~') &&\n !input.endsWith('/')\n );\n}\n\n/**\n * Process a single resource spec through the add pipeline.\n * Classifies the input and dispatches to the appropriate flow\n * (dependency, workspace-resource, or copy).\n *\n * Returns a typed discriminated union so the caller (CLI or GUI)\n * can render the result however it chooses.\n */\nexport async function processAddResource(\n resourceSpec: string,\n options: ProcessAddResourceOptions,\n cwd: string,\n execContext: ExecutionContext\n): Promise<AddResourceResult> {\n const classification = await classifyAddInput(resourceSpec, cwd, {\n copy: options.copy,\n dev: options.dev,\n });\n\n if (classification.mode === 'dependency') {\n if (options.platformSpecific) {\n throw new Error('--platform-specific can only be used with --copy or when adding files');\n }\n try {\n const result = await runAddDependencyFlow(classification, {\n dev: options.dev,\n to: options.to,\n });\n return { kind: 'dependency', result, classification };\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (isBareNameInput(resourceSpec)) {\n const localPath = resolve(cwd, resourceSpec);\n if (await exists(localPath)) {\n throw new Error(\n `${msg}\\n\\nA local path './${resourceSpec}' exists \u2014 did you mean:\\n opkg add ./${resourceSpec}`\n );\n }\n }\n throw error;\n }\n }\n\n if (classification.mode === 'workspace-resource') {\n if (options.dev) {\n throw new Error('--dev can only be used when adding a dependency, not when copying files');\n }\n const resource = classification.resolvedResource!;\n const absPath = resource.sourcePath || join(execContext.targetDir, resource.targetFiles[0]);\n\n const result = await runAddToSourcePipeline(options.to, absPath, { ...options, execContext });\n if (!result.success) {\n throw new Error(result.error || 'Add operation failed');\n }\n return { kind: 'workspace-resource', result };\n }\n\n // copy mode\n if (options.dev) {\n throw new Error('--dev can only be used when adding a dependency, not when copying files');\n }\n const result = await runAddToSourcePipeline(options.to, classification.copySourcePath!, { ...options, execContext });\n if (!result.success) {\n throw new Error(result.error || 'Add operation failed');\n }\n return { kind: 'copy', result };\n}\n", "import { join, basename, resolve } from 'path';\n\nimport { exists, isDirectory } from '../../utils/fs.js';\nimport { classifyInputBase, type BaseInputClassification } from '../install/input-classifier-base.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { logger } from '../../utils/logger.js';\nimport { isValidPackageDirectory } from '../package-context.js';\nimport { detectPluginType } from '../install/plugin-detector.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\n\nexport type AddMode = 'dependency' | 'copy' | 'workspace-resource';\n\nexport interface AddInputClassification {\n mode: AddMode;\n packageName?: string;\n version?: string;\n gitUrl?: string;\n gitRef?: string;\n gitPath?: string;\n localPath?: string;\n resourcePath?: string;\n copySourcePath?: string;\n /** Resolved workspace resource (for workspace-resource mode) */\n resolvedResource?: import('../resources/resource-builder.js').ResolvedResource;\n}\n\nexport interface AddClassifyOptions {\n copy?: boolean;\n dev?: boolean;\n}\n\n/**\n * Classify add command input to determine mode (dependency vs. copy) and extract metadata.\n *\n * Disambiguation layers (in order):\n * 1. --copy flag \u2192 force copy mode\n * 2. Trailing slash \u2192 local directory (strip /, resolve, require exists+isDirectory)\n * 3. Bare name with file extension \u2192 local file (require exists)\n * 4. Base classifier \u2192 registry, git, explicit paths\n *\n * @param input - User input string\n * @param cwd - Current working directory\n * @param options - Add-specific options (--copy, --dev)\n * @returns Add classification with mode and metadata\n */\nexport async function classifyAddInput(\n input: string,\n cwd: string,\n options: AddClassifyOptions\n): Promise<AddInputClassification> {\n // Layer 0: Handle --copy flag first (force copy mode)\n if (options.copy) {\n return handleCopyMode(input, cwd);\n }\n\n // Layer 1: Trailing slash \u2192 local directory (unambiguous dir intent)\n if (input.endsWith('/')) {\n const stripped = input.replace(/\\/+$/, '');\n const resolvedPath = resolve(cwd, stripped);\n if (await exists(resolvedPath)) {\n if (await isDirectory(resolvedPath)) {\n const localPathSpec = await buildLocalPathSpec(resolvedPath);\n return enrichWithAddMode(localPathSpec);\n }\n throw new ValidationError(\n `Path '${input}' is not a directory. Trailing slash indicates directory intent.`\n );\n }\n throw new ValidationError(`Directory not found: ${input}`);\n }\n\n // Layer 2: Bare name with file extension \u2192 local file (unambiguous file intent)\n if (isBareNameWithExtension(input)) {\n const resolvedPath = resolve(cwd, input);\n if (await exists(resolvedPath)) {\n return { mode: 'copy', copySourcePath: resolvedPath };\n }\n throw new ValidationError(`File not found: ${input}`);\n }\n\n // Layer 3: Use base classifier (registry, git, explicit paths)\n const base = await classifyInputBase(input, cwd);\n return enrichWithAddMode(base);\n}\n\n/** Check if input is a bare name with a file-extension-like suffix (e.g. README.md, config.json) */\nfunction isBareNameWithExtension(input: string): boolean {\n if (input.startsWith('./') || input.startsWith('../') || input.startsWith('/') || input.startsWith('~')) {\n return false;\n }\n if (input.includes('@') || input.includes('/')) {\n return false;\n }\n // Exclude tarballs \u2014 they are packages, not content files\n if (input.endsWith('.tgz') || input.endsWith('.tar.gz')) {\n return false;\n }\n const lastDot = input.lastIndexOf('.');\n if (lastDot <= 0) return false;\n const ext = input.slice(lastDot + 1);\n return ext.length >= 1 && ext.length <= 8 && /^[a-zA-Z0-9]+$/.test(ext);\n}\n\n/** Build a LocalPathInputSpec from an absolute path (for trailing-slash and local-path enrichment) */\nasync function buildLocalPathSpec(absolutePath: string): Promise<BaseInputClassification> {\n const isValid = await isValidPackageDirectory(absolutePath);\n const pluginResult = await detectPluginType(absolutePath);\n\n let packageName: string | undefined;\n if (isValid || pluginResult.isPlugin) {\n try {\n const manifestPath = join(absolutePath, 'openpackage.yml');\n if (await exists(manifestPath)) {\n const config = await parsePackageYml(manifestPath);\n packageName = config.name ?? basename(absolutePath);\n }\n } catch {\n packageName = basename(absolutePath);\n }\n }\n\n return {\n type: 'local-path',\n absolutePath,\n isDirectory: true,\n packageName,\n isValidPackage: isValid || pluginResult.isPlugin\n };\n}\n\n/**\n * Handle --copy mode (force copy regardless of input type).\n * Accepts any input that resolves to an existing local path (including package directories).\n */\nasync function handleCopyMode(\n input: string,\n cwd: string\n): Promise<AddInputClassification> {\n const resolvedAbsPath = resolve(cwd, input);\n if (!(await exists(resolvedAbsPath))) {\n throw new ValidationError(\n `Path not found: ${input}\\n--copy requires an existing local path.`\n );\n }\n return { mode: 'copy', copySourcePath: resolvedAbsPath };\n}\n\n/**\n * Enrich base classification with add-specific mode determination\n */\nfunction enrichWithAddMode(\n base: BaseInputClassification\n): AddInputClassification {\n switch (base.type) {\n case 'bulk':\n throw new ValidationError('Add command requires an input argument');\n\n case 'git':\n return {\n mode: 'dependency',\n packageName: base.derivedName!,\n gitUrl: base.gitUrl,\n gitRef: base.gitRef,\n gitPath: base.gitPath\n };\n\n case 'local-path': {\n // Tarballs (.tgz, .tar.gz) \u2192 path dependency\n if (\n base.absolutePath.endsWith('.tgz') ||\n base.absolutePath.endsWith('.tar.gz')\n ) {\n return {\n mode: 'dependency',\n packageName: base.packageName ?? basename(base.absolutePath).replace(/\\.(tgz|tar\\.gz)$/, ''),\n localPath: base.absolutePath\n };\n }\n\n // Determine if dependency or copy based on package validity\n if (base.isValidPackage) {\n logger.debug('Classified local directory as dependency', {\n packageName: base.packageName,\n absolutePath: base.absolutePath\n });\n return {\n mode: 'dependency',\n packageName: base.packageName!,\n localPath: base.absolutePath\n };\n }\n\n // Not a valid package - copy mode\n return {\n mode: 'copy',\n copySourcePath: base.absolutePath\n };\n }\n\n case 'registry':\n return {\n mode: 'dependency',\n packageName: base.packageName,\n version: base.version,\n resourcePath: base.registryPath\n };\n }\n}\n", "import { join } from 'path';\n\nimport type { AddInputClassification } from './add-input-classifier.js';\nimport type { PackageDependency } from '../../types/index.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport { addPackageToYml, ensureLocalOpenPackageStructure, createWorkspacePackageYml } from '../package-management.js';\nimport { parsePackageYml, writePackageYml } from '../../utils/package-yml.js';\nimport { normalizePackageName, arePackageNamesEquivalent } from '../../utils/package-name.js';\nimport { formatPathForYaml } from '../../utils/path-resolution.js';\nimport { getLocalPackageYmlPath } from '../../utils/paths.js';\nimport { exists } from '../../utils/fs.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { logger } from '../../utils/logger.js';\n\nexport interface AddDependencyOptions {\n dev?: boolean;\n to?: string;\n}\n\nexport interface AddDependencyResult {\n packageName: string;\n targetManifest: string;\n section: 'dependencies' | 'dev-dependencies';\n isLocalPath: boolean;\n wasAutoDetected: boolean;\n}\n\nexport async function runAddDependencyFlow(\n classification: AddInputClassification,\n options: AddDependencyOptions\n): Promise<AddDependencyResult> {\n const cwd = process.cwd();\n const isDev = options.dev ?? false;\n const section = isDev ? 'dev-dependencies' : 'dependencies';\n const packageName = classification.packageName!;\n const isLocalPath = !!classification.localPath;\n\n const localPath = classification.localPath\n ? formatPathForYaml(classification.localPath, cwd)\n : undefined;\n\n let gitUrl: string | undefined;\n if (classification.gitUrl) {\n gitUrl = classification.gitRef\n ? `${classification.gitUrl}#${classification.gitRef}`\n : classification.gitUrl;\n }\n\n const gitPath = classification.gitPath || classification.resourcePath;\n\n if (options.to) {\n const source = await resolveMutableSource({ cwd, packageName: options.to });\n const manifestPath = join(source.absolutePath, FILE_PATTERNS.OPENPACKAGE_YML);\n\n await addDependencyToManifest(manifestPath, packageName, {\n version: classification.version,\n path: localPath,\n url: gitUrl,\n gitPath,\n isDev,\n });\n\n logger.info(`Added ${packageName} to ${manifestPath} [${section}]`);\n\n return {\n packageName,\n targetManifest: manifestPath,\n section,\n isLocalPath,\n wasAutoDetected: isLocalPath,\n };\n }\n\n const packageYmlPath = getLocalPackageYmlPath(cwd);\n if (!(await exists(packageYmlPath))) {\n await ensureLocalOpenPackageStructure(cwd);\n await createWorkspacePackageYml(cwd);\n }\n\n await addPackageToYml(\n cwd,\n packageName,\n classification.version,\n isDev,\n undefined,\n true, // silent \u2014 CLI layer handles display\n localPath,\n classification.gitUrl,\n classification.gitRef,\n gitPath,\n undefined\n );\n\n logger.info(`Added ${packageName} to workspace manifest [${section}]`);\n\n return {\n packageName,\n targetManifest: packageYmlPath,\n section,\n isLocalPath,\n wasAutoDetected: isLocalPath,\n };\n}\n\nasync function addDependencyToManifest(\n manifestPath: string,\n packageName: string,\n options: {\n version?: string;\n path?: string;\n url?: string;\n gitPath?: string;\n isDev: boolean;\n }\n): Promise<void> {\n const config = await parsePackageYml(manifestPath);\n if (!config.dependencies) config.dependencies = [];\n if (!config['dev-dependencies']) config['dev-dependencies'] = [];\n\n const normalized = normalizePackageName(packageName);\n\n const dependency: PackageDependency = {\n name: normalized,\n ...(options.url ? { url: options.url } : {}),\n ...(options.path && !options.url ? { path: options.path } : {}),\n ...(options.version && !options.url && !options.path ? { version: options.version } : {}),\n ...(options.gitPath && options.url ? { path: options.gitPath } : {}),\n };\n\n const targetKey = options.isDev ? 'dev-dependencies' : 'dependencies';\n const otherKey = options.isDev ? 'dependencies' : 'dev-dependencies';\n\n const otherArr = config[otherKey]!;\n const otherIdx = otherArr.findIndex(d => arePackageNamesEquivalent(d.name, normalized));\n if (otherIdx >= 0) {\n otherArr.splice(otherIdx, 1);\n }\n\n const targetArr = config[targetKey]!;\n const existingIdx = targetArr.findIndex(d => arePackageNamesEquivalent(d.name, normalized));\n if (existingIdx >= 0) {\n targetArr[existingIdx] = dependency;\n } else {\n targetArr.push(dependency);\n }\n\n await writePackageYml(manifestPath, config);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "relative", "join", "basename", "basename", "join", "join", "resolve", "join", "basename", "join", "basename", "join", "join", "resolve", "join", "result", "relative", "join", "result"]
7
+ }
@@ -0,0 +1,371 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ walkFiles
4
+ } from "./chunk-A6ISKBNM.js";
5
+ import {
6
+ createWorkspacePackageYml,
7
+ ensureLocalOpenPackageStructure
8
+ } from "./chunk-6CYW66HD.js";
9
+ import {
10
+ getLocalOpenPackageDir
11
+ } from "./chunk-BCYZDID6.js";
12
+ import {
13
+ parsePackageYml
14
+ } from "./chunk-QTQYI4L5.js";
15
+ import {
16
+ FILE_PATTERNS
17
+ } from "./chunk-J4IFFBLP.js";
18
+ import {
19
+ exists
20
+ } from "./chunk-S47F4OG4.js";
21
+ import {
22
+ logger
23
+ } from "./chunk-5EFWGD33.js";
24
+
25
+ // ../core/src/core/workspace-package-context.ts
26
+ import { join, basename } from "path";
27
+ async function buildWorkspacePackageContext(cwd) {
28
+ await ensureLocalOpenPackageStructure(cwd), await createWorkspacePackageYml(cwd);
29
+ let openpackageDir = getLocalOpenPackageDir(cwd), packageYmlPath = join(openpackageDir, FILE_PATTERNS.OPENPACKAGE_YML), config;
30
+ try {
31
+ config = await parsePackageYml(packageYmlPath);
32
+ } catch (error) {
33
+ throw new Error(
34
+ `Failed to read workspace manifest at ${packageYmlPath}: ${error}`
35
+ );
36
+ }
37
+ return {
38
+ name: config.name || basename(cwd),
39
+ version: config.version,
40
+ config,
41
+ packageYmlPath,
42
+ packageRootDir: openpackageDir,
43
+ packageFilesDir: openpackageDir
44
+ };
45
+ }
46
+
47
+ // ../core/src/utils/expand-directory-selections.ts
48
+ import { join as join2, relative } from "path";
49
+ import { promises as fs } from "fs";
50
+ import { isJunk } from "junk";
51
+ async function expandDirectorySelections(selectedPaths, basePath) {
52
+ let expandedFiles = [], seenFiles = /* @__PURE__ */ new Set();
53
+ for (let path of selectedPaths)
54
+ if (path.endsWith("/")) {
55
+ let dirPath = path.slice(0, -1), absDirPath = join2(basePath, dirPath);
56
+ try {
57
+ if (!(await fs.stat(absDirPath)).isDirectory())
58
+ continue;
59
+ } catch {
60
+ continue;
61
+ }
62
+ let filter = (filePath, isDirectory) => {
63
+ if (isDirectory)
64
+ return !0;
65
+ let segments = filePath.split("/"), basename2 = segments[segments.length - 1];
66
+ return !isJunk(basename2);
67
+ };
68
+ for await (let filePath of walkFiles(absDirPath, { filter })) {
69
+ let relativePath = relative(basePath, filePath);
70
+ seenFiles.has(relativePath) || (seenFiles.add(relativePath), expandedFiles.push(relativePath));
71
+ }
72
+ } else
73
+ seenFiles.has(path) || (seenFiles.add(path), expandedFiles.push(path));
74
+ return expandedFiles;
75
+ }
76
+ function hasDirectorySelections(selectedPaths) {
77
+ return selectedPaths.some((path) => path.endsWith("/"));
78
+ }
79
+ function countSelectionTypes(selectedPaths) {
80
+ let dirs = 0, files = 0;
81
+ for (let path of selectedPaths)
82
+ path.endsWith("/") ? dirs++ : files++;
83
+ return { dirs, files };
84
+ }
85
+
86
+ // src/utils/interactive-file-selector.ts
87
+ import { note, log } from "@clack/prompts";
88
+
89
+ // src/utils/file-selector-with-header.ts
90
+ import { AutocompletePrompt, isCancel } from "@clack/core";
91
+ import { search } from "fast-fuzzy";
92
+ import pico from "picocolors";
93
+ var FileSelectorWithHeader = class extends AutocompletePrompt {
94
+ constructor(options) {
95
+ let fileOptions = options.files.map((file) => ({
96
+ value: file,
97
+ label: file
98
+ }));
99
+ super({
100
+ options: fileOptions,
101
+ multiple: !0,
102
+ render() {
103
+ return this.renderWithHeader();
104
+ }
105
+ }), this.allFiles = options.files, this.message = options.message, this.placeholder = options.placeholder || "Type to search...", this.maxVisibleItems = options.maxItems || 10, this.fuzzyThreshold = options.fuzzyThreshold || 0.5, this.setupFuzzyFiltering(), this.setupNoOverscroll();
106
+ }
107
+ /**
108
+ * Prevent wrap-around: stay at top when pressing up at first item (don't jump to last)
109
+ */
110
+ setupNoOverscroll() {
111
+ this.on("key", (_char, key) => {
112
+ let len = this.filteredOptions.length;
113
+ len <= 1 || key.name === "up" && this.cursor === len - 1 && this.emit("key", void 0, { name: "down", ctrl: !1, meta: !1, shift: !1 });
114
+ });
115
+ }
116
+ /**
117
+ * Setup fuzzy filtering based on user input
118
+ */
119
+ setupFuzzyFiltering() {
120
+ this.on("userInput", () => {
121
+ this.updateFilteredOptions();
122
+ });
123
+ }
124
+ /**
125
+ * Update filtered options based on current user input
126
+ */
127
+ updateFilteredOptions() {
128
+ let input = this.userInput, filteredFiles;
129
+ !input || input.trim() === "" ? filteredFiles = this.allFiles : filteredFiles = search(input, this.allFiles, {
130
+ threshold: this.fuzzyThreshold,
131
+ ignoreCase: !0,
132
+ returnMatchData: !1
133
+ }), this.filteredOptions = filteredFiles.map((file) => ({
134
+ value: file,
135
+ label: file
136
+ }));
137
+ }
138
+ /**
139
+ * Main render method with dynamic header
140
+ */
141
+ renderWithHeader() {
142
+ if (this.state === "cancel")
143
+ return this.renderCancelled();
144
+ if (this.state === "submit")
145
+ return this.selectedValues.length === 0 ? this.renderCancelled() : this.renderSubmitted();
146
+ let sections = [];
147
+ return sections.push(this.renderSelectedFilesHeader()), sections.push(this.renderSearchSection()), sections.push(this.renderOptionsList()), sections.push(this.renderFooter()), sections.join(`
148
+ `);
149
+ }
150
+ /**
151
+ * Get a smart label for the current selection (e.g., "2 dirs, 1 file" or "3 files")
152
+ */
153
+ getSelectionLabel() {
154
+ let count = this.selectedValues.length, dirs = this.selectedValues.filter((v) => v.endsWith("/")).length, files = count - dirs;
155
+ return dirs === 0 ? `${files} file${files === 1 ? "" : "s"}` : files === 0 ? `${dirs} dir${dirs === 1 ? "" : "s"}` : `${dirs} dir${dirs === 1 ? "" : "s"}, ${files} file${files === 1 ? "" : "s"}`;
156
+ }
157
+ /**
158
+ * Render the selected files header using Clack's simple log-style format
159
+ */
160
+ renderSelectedFilesHeader() {
161
+ let count = this.selectedValues.length, lines = [], title = count === 0 ? `Selected: ${pico.dim("none (use Space to select)")}` : `Selected: ${pico.cyan(this.getSelectionLabel())}`;
162
+ if (lines.push(`${pico.cyan("\u25C6")} ${title}`), count > 0) {
163
+ let displayCount = Math.min(5, count);
164
+ for (let i = 0; i < displayCount; i++) {
165
+ let file = this.selectedValues[i];
166
+ lines.push(`${pico.cyan("\u2502")} ${pico.dim("\u2713 " + file)}`);
167
+ }
168
+ count > displayCount && lines.push(`${pico.cyan("\u2502")} ${pico.dim(`... and ${count - displayCount} more`)}`);
169
+ }
170
+ return lines.push(pico.cyan("\u2502")), lines.join(`
171
+ `);
172
+ }
173
+ /**
174
+ * Render the search section
175
+ */
176
+ renderSearchSection() {
177
+ let matchCount = this.filteredOptions.length, totalCount = this.allFiles.length, stateSymbol = pico.cyan("\u25C6"), searchLabel = pico.dim("Search:"), input = this.userInput || pico.gray(this.placeholder), cursor = this.state === "active" ? pico.cyan("\u2588") : "", matches = matchCount !== totalCount ? pico.dim(` (${matchCount} ${matchCount === 1 ? "match" : "matches"})`) : "";
178
+ return `${stateSymbol} ${this.message}
179
+ ${pico.cyan("\u2502")} ${searchLabel} ${input}${cursor}${matches}`;
180
+ }
181
+ /**
182
+ * Render the options list with sliding window to keep cursor in view
183
+ */
184
+ renderOptionsList() {
185
+ let lines = [], totalOptions = this.filteredOptions.length, maxItems = this.maxVisibleItems;
186
+ if (totalOptions === 0)
187
+ return lines.push(`${pico.cyan("\u2502")} ${pico.gray("No matches found")}`), lines.join(`
188
+ `);
189
+ let visibleStart = 0;
190
+ this.cursor >= maxItems - 3 && (visibleStart = Math.max(0, Math.min(this.cursor - maxItems + 3, totalOptions - maxItems)));
191
+ let visibleEnd = Math.min(visibleStart + maxItems, totalOptions), visibleOptions = this.filteredOptions.slice(visibleStart, visibleEnd);
192
+ visibleStart > 0 && lines.push(`${pico.cyan("\u2502")} ${pico.gray(`... ${visibleStart} above`)}`);
193
+ for (let i = 0; i < visibleOptions.length; i++) {
194
+ let option = visibleOptions[i], isSelected = this.selectedValues.includes(option.value), isCursor = visibleStart + i === this.cursor, checkbox = isSelected ? pico.cyan("\u25FC") : pico.dim("\u25FB"), cursorMark = isCursor ? pico.cyan("\u25B8") : " ", fileName = option.label;
195
+ isCursor ? fileName = pico.cyan(fileName) : isSelected ? fileName = pico.white(fileName) : fileName = pico.dim(fileName), lines.push(`${pico.cyan("\u2502")} ${cursorMark} ${checkbox} ${fileName}`);
196
+ }
197
+ if (visibleEnd < totalOptions) {
198
+ let remaining = totalOptions - visibleEnd;
199
+ lines.push(`${pico.cyan("\u2502")} ${pico.gray(`... ${remaining} more`)}`);
200
+ }
201
+ return lines.join(`
202
+ `);
203
+ }
204
+ /**
205
+ * Render the footer with hints
206
+ */
207
+ renderFooter() {
208
+ let hints = pico.dim("Space: select \u2022 Enter: confirm \u2022 Esc: cancel");
209
+ return `${pico.cyan("\u2514")} ${hints}`;
210
+ }
211
+ /**
212
+ * Render the collapsed cancelled state
213
+ */
214
+ renderCancelled() {
215
+ let symbol = pico.red("\u25A0"), end = pico.gray("\u2514");
216
+ return `${symbol} ${this.message}
217
+ ${end} ${pico.dim("Operation cancelled")}`;
218
+ }
219
+ /**
220
+ * Render the collapsed submitted state (for successful selection)
221
+ */
222
+ renderSubmitted() {
223
+ let symbol = pico.green("\u25C7"), bar = pico.gray("\u2502"), status = pico.dim(this.getSelectionLabel() + " selected");
224
+ return `${symbol} ${this.message}
225
+ ${bar} ${status}`;
226
+ }
227
+ };
228
+ async function promptFileSelector(options) {
229
+ let result = await new FileSelectorWithHeader(options).prompt();
230
+ return isCancel(result) ? null : result;
231
+ }
232
+
233
+ // ../core/src/utils/file-scanner.ts
234
+ import { relative as relative2 } from "path";
235
+ import { isJunk as isJunk2 } from "junk";
236
+ var DEFAULT_EXCLUDE_DIRS = /* @__PURE__ */ new Set([
237
+ "node_modules",
238
+ ".git",
239
+ ".next",
240
+ ".turbo",
241
+ "dist",
242
+ "build",
243
+ "out",
244
+ ".cache",
245
+ "coverage",
246
+ ".nyc_output",
247
+ ".parcel-cache",
248
+ ".webpack",
249
+ ".vscode",
250
+ ".idea",
251
+ "__pycache__",
252
+ "target",
253
+ "vendor"
254
+ ]);
255
+ function isExcludedDir(fullPath, excludeDirs) {
256
+ let segments = fullPath.split("/");
257
+ for (let segment of segments)
258
+ if (excludeDirs.has(segment))
259
+ return !0;
260
+ return !1;
261
+ }
262
+ async function scanWorkspaceFiles(options = {}) {
263
+ let {
264
+ cwd = process.cwd(),
265
+ basePath,
266
+ excludeDirs = [],
267
+ maxFiles = 1e4,
268
+ followSymlinks = !1,
269
+ includeDirs = !1
270
+ } = options, scanDir = basePath || cwd, allExcludeDirs = /* @__PURE__ */ new Set([
271
+ ...DEFAULT_EXCLUDE_DIRS,
272
+ ...excludeDirs
273
+ ]), files = [], dirs = [], fileCount = 0;
274
+ try {
275
+ let filter = (path, isDirectory) => {
276
+ let segments = path.split("/"), basename2 = segments[segments.length - 1];
277
+ return !(isJunk2(basename2) || isExcludedDir(path, allExcludeDirs));
278
+ };
279
+ for await (let filePath of walkFiles(scanDir, { filter, followSymlinks, includeDirs })) {
280
+ if (fileCount >= maxFiles) {
281
+ logger.debug(`File scan limit reached: ${maxFiles} files`);
282
+ break;
283
+ }
284
+ let relativePath = relative2(scanDir, filePath);
285
+ !relativePath || relativePath === "." || (includeDirs && (await (await import("fs")).promises.stat(filePath)).isDirectory() ? dirs.push(relativePath + "/") : files.push(relativePath), fileCount++);
286
+ }
287
+ let allItems = [...dirs.sort(), ...files.sort()];
288
+ return allItems.sort((a, b) => {
289
+ let aPath = a.endsWith("/") ? a.slice(0, -1) : a, bPath = b.endsWith("/") ? b.slice(0, -1) : b, aDepth = aPath.split("/").length, bDepth = bPath.split("/").length;
290
+ return aDepth !== bDepth ? aDepth - bDepth : a.localeCompare(b);
291
+ }), logger.debug(`Scanned ${allItems.length} items in workspace`, { scanDir, includeDirs }), allItems;
292
+ } catch (error) {
293
+ throw logger.error("Error scanning workspace files", { error, scanDir }), new Error(`Failed to scan workspace files: ${error}`);
294
+ }
295
+ }
296
+
297
+ // src/utils/interactive-file-selector.ts
298
+ async function interactiveFileSelect(options = {}) {
299
+ let {
300
+ cwd = process.cwd(),
301
+ basePath,
302
+ message,
303
+ placeholder,
304
+ maxItems = 10,
305
+ excludeDirs = [],
306
+ fuzzyThreshold = 0.5,
307
+ includeDirs = !1
308
+ } = options, finalMessage = message || (includeDirs ? "Select files or directories to add" : "Select files to add"), finalPlaceholder = placeholder || (includeDirs ? "Type to search..." : "Type to search files..."), scanDir = basePath || cwd;
309
+ try {
310
+ logger.debug("Scanning workspace for files", { scanDir });
311
+ let allFiles = await scanWorkspaceFiles({ cwd, basePath, excludeDirs, includeDirs });
312
+ if (allFiles.length === 0)
313
+ return logger.warn("No files found in workspace"), note("No files found in the workspace directory", "No Files"), null;
314
+ logger.debug(`Found ${allFiles.length} files to display`);
315
+ let selectedFiles = await promptFileSelector({
316
+ message: finalMessage,
317
+ files: allFiles,
318
+ placeholder: finalPlaceholder,
319
+ maxItems,
320
+ fuzzyThreshold
321
+ });
322
+ if (!selectedFiles || selectedFiles.length === 0)
323
+ return logger.debug("No files selected or user cancelled"), null;
324
+ logger.debug(`User selected ${selectedFiles.length} file(s)`, { selectedFiles });
325
+ let fileList = selectedFiles.length <= 5 ? selectedFiles.join(`
326
+ `) : selectedFiles.slice(0, 5).join(`
327
+ `) + `
328
+ ... and ${selectedFiles.length - 5} more`, countLabel = includeDirs ? (() => {
329
+ let { dirs, files } = countSelectionTypes(selectedFiles), parts = [];
330
+ return dirs > 0 && parts.push(`${dirs} dir${dirs === 1 ? "" : "s"}`), files > 0 && parts.push(`${files} file${files === 1 ? "" : "s"}`), parts.join(" and ");
331
+ })() : `${selectedFiles.length} file${selectedFiles.length === 1 ? "" : "s"}`;
332
+ return log.success(`Selected ${countLabel}:
333
+ ${fileList}`), selectedFiles;
334
+ } catch (error) {
335
+ throw logger.error("Error during file selection", { error }), new Error(`File selection failed: ${error}`);
336
+ }
337
+ }
338
+
339
+ // ../core/src/utils/source-operation-arguments.ts
340
+ import { resolve as resolvePath, join as join3 } from "path";
341
+ async function resolveSourceOperationArguments(cwd, packageName, pathArg, options) {
342
+ let { command, checkWorkspaceRoot = !1 } = options, flagName = command === "add" ? "--to" : "--from";
343
+ if (packageName && pathArg)
344
+ return { resolvedPackageName: packageName, resolvedPath: pathArg };
345
+ let singleArg = packageName || pathArg;
346
+ if (!singleArg)
347
+ throw new Error(`Path argument is required for ${command}.`);
348
+ let absPath = resolvePath(cwd, singleArg), pathExists = await exists(absPath);
349
+ if (!pathExists && checkWorkspaceRoot) {
350
+ let openpackageDir = getLocalOpenPackageDir(cwd), workspaceRootPath = join3(openpackageDir, singleArg);
351
+ pathExists = await exists(workspaceRootPath);
352
+ }
353
+ if (pathExists)
354
+ return { resolvedPackageName: null, resolvedPath: singleArg };
355
+ if (checkWorkspaceRoot && command === "remove")
356
+ return { resolvedPackageName: null, resolvedPath: singleArg };
357
+ throw new Error(
358
+ `Path '${singleArg}' not found.
359
+
360
+ If you meant to specify a package name, use: opkg ${command} <path> ${flagName} ${singleArg}`
361
+ );
362
+ }
363
+
364
+ export {
365
+ resolveSourceOperationArguments,
366
+ buildWorkspacePackageContext,
367
+ expandDirectorySelections,
368
+ hasDirectorySelections,
369
+ interactiveFileSelect
370
+ };
371
+ //# sourceMappingURL=chunk-23VBP5L6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/workspace-package-context.ts", "../../core/src/utils/expand-directory-selections.ts", "../src/utils/interactive-file-selector.ts", "../src/utils/file-selector-with-header.ts", "../../core/src/utils/file-scanner.ts", "../../core/src/utils/source-operation-arguments.ts"],
4
+ "sourcesContent": ["import { join, basename } from 'path';\n\nimport { FILE_PATTERNS } from '../constants/index.js';\nimport { ensureLocalOpenPackageStructure, createWorkspacePackageYml } from './package-management.js';\nimport { getLocalOpenPackageDir } from '../utils/paths.js';\nimport { parsePackageYml } from '../utils/package-yml.js';\nimport type { PackageYml } from '../types/index.js';\n\n/**\n * Workspace package context for add/remove operations.\n * Contains essential package metadata for operating on workspace root (.openpackage/).\n */\nexport interface WorkspacePackageContext {\n /** Package name (from manifest or workspace directory name) */\n name: string;\n /** Package version (if specified in manifest) */\n version?: string;\n /** Full package configuration from openpackage.yml */\n config: PackageYml;\n /** Absolute path to package manifest (openpackage.yml) */\n packageYmlPath: string;\n /** Root directory of the package (.openpackage/) */\n packageRootDir: string;\n /** Directory containing package files (same as root for workspace packages) */\n packageFilesDir: string;\n}\n\n/**\n * Build workspace package context for operations on workspace root (.openpackage/).\n * \n * This utility creates or ensures the workspace package structure exists and loads\n * the manifest configuration. Used by add/remove commands when operating on the\n * workspace root (no specific package specified via --to/--from).\n * \n * @param cwd - Current working directory\n * @returns Workspace package context with loaded configuration\n * @throws Error if manifest cannot be read\n * \n * @example\n * // Add command: opkg add ./file.md (no --to option)\n * const context = await buildWorkspacePackageContext(cwd);\n * // Files will be added to context.packageRootDir (.openpackage/)\n * \n * @example\n * // Remove command: opkg remove agents/my-agent (no --from option)\n * const context = await buildWorkspacePackageContext(cwd);\n * // Files will be removed from context.packageRootDir (.openpackage/)\n */\nexport async function buildWorkspacePackageContext(\n cwd: string\n): Promise<WorkspacePackageContext> {\n // Ensure .openpackage/ structure exists\n await ensureLocalOpenPackageStructure(cwd);\n\n // Create workspace manifest if it doesn't exist\n await createWorkspacePackageYml(cwd);\n\n const openpackageDir = getLocalOpenPackageDir(cwd);\n const packageYmlPath = join(openpackageDir, FILE_PATTERNS.OPENPACKAGE_YML);\n\n // Load workspace manifest\n let config: PackageYml;\n try {\n config = await parsePackageYml(packageYmlPath);\n } catch (error) {\n throw new Error(\n `Failed to read workspace manifest at ${packageYmlPath}: ${error}`\n );\n }\n\n // Use workspace directory name as package name if not specified in manifest\n const packageName = config.name || basename(cwd);\n\n return {\n name: packageName,\n version: config.version,\n config,\n packageYmlPath,\n packageRootDir: openpackageDir,\n packageFilesDir: openpackageDir\n };\n}\n\n/**\n * Ensure workspace package structure exists and is initialized.\n * This is a convenience wrapper around ensureLocalOpenPackageStructure and createWorkspacePackageYml.\n * \n * @param cwd - Current working directory\n * \n * @example\n * // Ensure workspace is ready before performing operations\n * await ensureWorkspacePackageExists(cwd);\n * // Now .openpackage/ directory and openpackage.yml exist\n */\nexport async function ensureWorkspacePackageExists(cwd: string): Promise<void> {\n await ensureLocalOpenPackageStructure(cwd);\n await createWorkspacePackageYml(cwd);\n}\n", "/**\n * Directory Selection Expansion Utility\n * \n * Expands directory selections (paths ending with '/') into all files within them.\n * Used by add and remove commands to handle directory selections from interactive file selector.\n */\n\nimport { join, relative } from 'path';\nimport { promises as fs } from 'fs';\nimport { walkFiles } from './file-walker.js';\nimport { isJunk } from 'junk';\n\n/**\n * Expand directory selections into individual file paths\n * \n * @param selectedPaths - Array of selected paths (files and directories with '/' suffix)\n * @param basePath - Base directory path for resolving relative paths\n * @returns Array of individual file paths (no directories)\n * \n * @example\n * const selections = ['src/', 'package.json', 'docs/readme.md'];\n * const expanded = await expandDirectorySelections(selections, '/workspace');\n * // Returns: ['src/index.ts', 'src/utils/helper.ts', 'package.json', 'docs/readme.md']\n */\nexport async function expandDirectorySelections(\n selectedPaths: string[],\n basePath: string\n): Promise<string[]> {\n const expandedFiles: string[] = [];\n const seenFiles = new Set<string>();\n \n for (const path of selectedPaths) {\n if (path.endsWith('/')) {\n // This is a directory - expand it to all files within\n const dirPath = path.slice(0, -1); // Remove trailing '/'\n const absDirPath = join(basePath, dirPath);\n \n // Check if directory exists\n try {\n const stat = await fs.stat(absDirPath);\n if (!stat.isDirectory()) {\n // Not a directory, skip\n continue;\n }\n } catch {\n // Directory doesn't exist or is inaccessible, skip\n continue;\n }\n \n // Walk all files in the directory\n const filter = (filePath: string, isDirectory: boolean) => {\n if (isDirectory) {\n return true; // Always traverse directories\n }\n \n // Filter out junk files\n const segments = filePath.split('/');\n const basename = segments[segments.length - 1];\n return !isJunk(basename);\n };\n \n for await (const filePath of walkFiles(absDirPath, { filter })) {\n // Convert to relative path from basePath (path.relative handles trailing slashes correctly)\n const relativePath = relative(basePath, filePath);\n \n // Only add if not already seen (avoid duplicates)\n if (!seenFiles.has(relativePath)) {\n seenFiles.add(relativePath);\n expandedFiles.push(relativePath);\n }\n }\n } else {\n // This is a regular file - add it directly if not already seen\n if (!seenFiles.has(path)) {\n seenFiles.add(path);\n expandedFiles.push(path);\n }\n }\n }\n \n return expandedFiles;\n}\n\n/**\n * Check if any selected paths are directories\n * \n * @param selectedPaths - Array of selected paths\n * @returns True if at least one path is a directory (ends with '/')\n */\nexport function hasDirectorySelections(selectedPaths: string[]): boolean {\n return selectedPaths.some(path => path.endsWith('/'));\n}\n\n/**\n * Count how many directories and files are in the selection\n * \n * @param selectedPaths - Array of selected paths\n * @returns Object with counts of directories and files\n */\nexport function countSelectionTypes(selectedPaths: string[]): { dirs: number; files: number } {\n let dirs = 0;\n let files = 0;\n \n for (const path of selectedPaths) {\n if (path.endsWith('/')) {\n dirs++;\n } else {\n files++;\n }\n }\n \n return { dirs, files };\n}\n", "/**\n * Interactive File Selector\n * \n * Provides fuzzy file selection with dynamic header showing selected files.\n * Uses custom AutocompletePrompt that updates the header in real-time.\n */\n\nimport { note, log } from '@clack/prompts';\nimport { promptFileSelector } from './file-selector-with-header.js';\nimport { scanWorkspaceFiles } from '@opkg/core/utils/file-scanner.js';\nimport { countSelectionTypes } from '@opkg/core/utils/expand-directory-selections.js';\nimport { logger } from '@opkg/core/utils/logger.js';\n\n/**\n * Options for interactive file selection\n */\nexport interface FileSelectionOptions {\n /** Base directory to scan from (default: process.cwd()) */\n cwd?: string;\n \n /** Specific directory path to scan (overrides cwd if provided) */\n basePath?: string;\n \n /** Prompt message to display (default: 'Select files') */\n message?: string;\n \n /** Placeholder text when no input (default: 'Type to search files...') */\n placeholder?: string;\n \n /** Maximum items to display at once (default: 10) */\n maxItems?: number;\n \n /** Additional directories to exclude from scanning */\n excludeDirs?: string[];\n \n /** Fuzzy search threshold (0-1, default: 0.5) */\n fuzzyThreshold?: number;\n \n /** Whether to include directories in results (default: false) */\n includeDirs?: boolean;\n}\n\n/**\n * Display an interactive fuzzy file selector with dynamic header\n * \n * Features:\n * - Dynamic header showing selected files (updates in real-time)\n * - Fuzzy search with real-time filtering\n * - Space to toggle selection\n * - Enter to confirm\n * \n * @param options - Selection options\n * @returns Array of selected relative file paths, or null if cancelled\n * \n * @example\n * const files = await interactiveFileSelect({ cwd: process.cwd() });\n * if (files) {\n * console.log('Selected:', files);\n * } else {\n * console.log('Cancelled');\n * }\n */\nexport async function interactiveFileSelect(\n options: FileSelectionOptions = {}\n): Promise<string[] | null> {\n const {\n cwd = process.cwd(),\n basePath,\n message,\n placeholder,\n maxItems = 10,\n excludeDirs = [],\n fuzzyThreshold = 0.5,\n includeDirs = false\n } = options;\n \n // Set smart defaults based on whether directories are included\n const finalMessage = message || (includeDirs ? 'Select files or directories to add' : 'Select files to add');\n const finalPlaceholder = placeholder || (includeDirs ? 'Type to search...' : 'Type to search files...');\n \n const scanDir = basePath || cwd;\n \n try {\n // Scan workspace for all files\n logger.debug('Scanning workspace for files', { scanDir });\n const allFiles = await scanWorkspaceFiles({ cwd, basePath, excludeDirs, includeDirs });\n \n // Check if any files found\n if (allFiles.length === 0) {\n logger.warn('No files found in workspace');\n note('No files found in the workspace directory', 'No Files');\n return null;\n }\n \n logger.debug(`Found ${allFiles.length} files to display`);\n \n // Display the file selector with dynamic header\n const selectedFiles = await promptFileSelector({\n message: finalMessage,\n files: allFiles,\n placeholder: finalPlaceholder,\n maxItems,\n fuzzyThreshold\n });\n \n // Check if user cancelled or selected nothing\n if (!selectedFiles || selectedFiles.length === 0) {\n logger.debug('No files selected or user cancelled');\n return null; // Prompt handles its own cancellation display\n }\n \n logger.debug(`User selected ${selectedFiles.length} file(s)`, { selectedFiles });\n\n // Show summary after selection (use dir/file counts when includeDirs)\n const fileList = selectedFiles.length <= 5\n ? selectedFiles.join('\\n')\n : selectedFiles.slice(0, 5).join('\\n') + `\\n... and ${selectedFiles.length - 5} more`;\n const countLabel = includeDirs\n ? (() => {\n const { dirs, files } = countSelectionTypes(selectedFiles);\n const parts: string[] = [];\n if (dirs > 0) parts.push(`${dirs} dir${dirs === 1 ? '' : 's'}`);\n if (files > 0) parts.push(`${files} file${files === 1 ? '' : 's'}`);\n return parts.join(' and ');\n })()\n : `${selectedFiles.length} file${selectedFiles.length === 1 ? '' : 's'}`;\n log.success(`Selected ${countLabel}:\\n${fileList}`);\n \n return selectedFiles;\n \n } catch (error) {\n logger.error('Error during file selection', { error });\n throw new Error(`File selection failed: ${error}`);\n }\n}\n\n/**\n * Display an interactive fuzzy file selector for single file selection\n * \n * @param options - Selection options\n * @returns Selected relative file path, or null if cancelled\n */\nexport async function interactiveFileSelectSingle(\n options: FileSelectionOptions = {}\n): Promise<string | null> {\n const result = await interactiveFileSelect({\n ...options,\n message: options.message || 'Select a file'\n });\n \n if (!result || result.length === 0) {\n return null;\n }\n \n // Return the first selected file\n return result[0];\n}\n", "/**\n * File Selector with Dynamic Header\n * \n * Custom AutocompletePrompt that shows selected files in a dynamic header\n * that updates in real-time as selections change.\n */\n\nimport { AutocompletePrompt, isCancel } from '@clack/core';\nimport { search } from 'fast-fuzzy';\nimport pico from 'picocolors';\nimport type { Key } from 'node:readline';\n\n/**\n * Options for file selector with dynamic header\n */\nexport interface FileSelectorOptions {\n /** Prompt message */\n message: string;\n \n /** All available files */\n files: string[];\n \n /** Placeholder text */\n placeholder?: string;\n \n /** Maximum items to show */\n maxItems?: number;\n \n /** Fuzzy search threshold */\n fuzzyThreshold?: number;\n}\n\n/**\n * File option for autocomplete\n */\ninterface FileOption {\n value: string;\n label: string;\n}\n\n/**\n * Custom AutocompletePrompt that shows selected files above the search UI\n */\nexport class FileSelectorWithHeader extends AutocompletePrompt<FileOption> {\n private allFiles: string[];\n private fuzzyThreshold: number;\n private message: string;\n private placeholder: string;\n private maxVisibleItems: number;\n\n constructor(options: FileSelectorOptions) {\n const fileOptions: FileOption[] = options.files.map(file => ({\n value: file,\n label: file\n }));\n\n super({\n options: fileOptions,\n multiple: true,\n render() {\n return this.renderWithHeader();\n }\n } as any);\n\n this.allFiles = options.files;\n this.message = options.message;\n this.placeholder = options.placeholder || 'Type to search...';\n this.maxVisibleItems = options.maxItems || 10;\n this.fuzzyThreshold = options.fuzzyThreshold || 0.5;\n\n // Override the options to provide dynamic filtering\n this.setupFuzzyFiltering();\n\n // Disable wrap-around: stay at top when pressing up at first item\n this.setupNoOverscroll();\n }\n\n /**\n * Prevent wrap-around: stay at top when pressing up at first item (don't jump to last)\n */\n private setupNoOverscroll(): void {\n this.on('key', (_char: string | undefined, key: Key) => {\n const len = this.filteredOptions.length;\n if (len <= 1) return;\n\n if (key.name === 'up' && this.cursor === len - 1) {\n // Cursor wrapped from 0 to end; emit synthetic down to undo\n this.emit('key', undefined, { name: 'down', ctrl: false, meta: false, shift: false } as Key);\n }\n });\n }\n\n /**\n * Setup fuzzy filtering based on user input\n */\n private setupFuzzyFiltering(): void {\n // Listen to userInput changes to update filtered options\n this.on('userInput', () => {\n this.updateFilteredOptions();\n });\n }\n\n /**\n * Update filtered options based on current user input\n */\n private updateFilteredOptions(): void {\n const input = this.userInput;\n \n let filteredFiles: string[];\n \n if (!input || input.trim() === '') {\n filteredFiles = this.allFiles;\n } else {\n filteredFiles = search(input, this.allFiles, {\n threshold: this.fuzzyThreshold,\n ignoreCase: true,\n returnMatchData: false\n }) as string[];\n }\n\n // Update filteredOptions (this is a public property we can modify)\n this.filteredOptions = filteredFiles.map(file => ({\n value: file,\n label: file\n }));\n }\n\n /**\n * Main render method with dynamic header\n */\n private renderWithHeader(): string {\n // Handle final states with collapsed rendering\n if (this.state === 'cancel') {\n return this.renderCancelled();\n }\n \n if (this.state === 'submit') {\n // Treat empty selection as cancellation\n if (this.selectedValues.length === 0) {\n return this.renderCancelled();\n }\n return this.renderSubmitted();\n }\n \n // Render full interactive UI for active/initial/error states\n const sections: string[] = [];\n\n // === DYNAMIC HEADER SECTION ===\n sections.push(this.renderSelectedFilesHeader());\n\n // === PROMPT SECTION ===\n sections.push(this.renderSearchSection());\n\n // === OPTIONS LIST ===\n sections.push(this.renderOptionsList());\n\n // === FOOTER ===\n sections.push(this.renderFooter());\n\n return sections.join('\\n');\n }\n\n /**\n * Get a smart label for the current selection (e.g., \"2 dirs, 1 file\" or \"3 files\")\n */\n private getSelectionLabel(): string {\n const count = this.selectedValues.length;\n const dirs = this.selectedValues.filter(v => v.endsWith('/')).length;\n const files = count - dirs;\n \n if (dirs === 0) {\n return `${files} file${files === 1 ? '' : 's'}`;\n } else if (files === 0) {\n return `${dirs} dir${dirs === 1 ? '' : 's'}`;\n } else {\n return `${dirs} dir${dirs === 1 ? '' : 's'}, ${files} file${files === 1 ? '' : 's'}`;\n }\n }\n\n /**\n * Render the selected files header using Clack's simple log-style format\n */\n private renderSelectedFilesHeader(): string {\n const count = this.selectedValues.length;\n const lines: string[] = [];\n \n // Title line with pointer symbol (\u25C6) for consistency with prompt message\n const title = count === 0 \n ? `Selected: ${pico.dim('none (use Space to select)')}`\n : `Selected: ${pico.cyan(this.getSelectionLabel())}`;\n \n lines.push(`${pico.cyan('\u25C6')} ${title}`);\n \n // Show selected files (up to 5)\n if (count > 0) {\n const displayCount = Math.min(5, count);\n for (let i = 0; i < displayCount; i++) {\n const file = this.selectedValues[i];\n lines.push(`${pico.cyan('\u2502')} ${pico.dim('\u2713 ' + file)}`);\n }\n \n // Show \"... and X more\" if there are more\n if (count > displayCount) {\n lines.push(`${pico.cyan('\u2502')} ${pico.dim(`... and ${count - displayCount} more`)}`);\n }\n }\n \n // Separator line\n lines.push(pico.cyan('\u2502'));\n \n return lines.join('\\n');\n }\n\n /**\n * Render the search section\n */\n private renderSearchSection(): string {\n const matchCount = this.filteredOptions.length;\n const totalCount = this.allFiles.length;\n\n const stateSymbol = pico.cyan('\u25C6');\n const searchLabel = pico.dim('Search:');\n const input = this.userInput || pico.gray(this.placeholder);\n const cursor = this.state === 'active' ? pico.cyan('\u2588') : '';\n const matches = matchCount !== totalCount\n ? pico.dim(` (${matchCount} ${matchCount === 1 ? 'match' : 'matches'})`)\n : '';\n\n return `${stateSymbol} ${this.message}\\n${pico.cyan('\u2502')} ${searchLabel} ${input}${cursor}${matches}`;\n }\n\n /**\n * Render the options list with sliding window to keep cursor in view\n */\n private renderOptionsList(): string {\n const lines: string[] = [];\n const totalOptions = this.filteredOptions.length;\n const maxItems = this.maxVisibleItems;\n\n if (totalOptions === 0) {\n lines.push(`${pico.cyan('\u2502')} ${pico.gray('No matches found')}`);\n return lines.join('\\n');\n }\n\n // Sliding window: scroll so cursor stays in view\n let visibleStart = 0;\n if (this.cursor >= maxItems - 3) {\n visibleStart = Math.max(0, Math.min(this.cursor - maxItems + 3, totalOptions - maxItems));\n }\n const visibleEnd = Math.min(visibleStart + maxItems, totalOptions);\n const visibleOptions = this.filteredOptions.slice(visibleStart, visibleEnd);\n\n // Show \"more above\" indicator when scrolled down\n if (visibleStart > 0) {\n lines.push(`${pico.cyan('\u2502')} ${pico.gray(`... ${visibleStart} above`)}`);\n }\n\n for (let i = 0; i < visibleOptions.length; i++) {\n const option = visibleOptions[i];\n const isSelected = this.selectedValues.includes(option.value);\n const isCursor = visibleStart + i === this.cursor;\n\n // Checkbox\n const checkbox = isSelected ? pico.cyan('\u25FC') : pico.dim('\u25FB');\n\n // Cursor indicator\n const cursorMark = isCursor ? pico.cyan('\u25B8') : ' ';\n\n // File name\n let fileName = option.label;\n if (isCursor) {\n fileName = pico.cyan(fileName);\n } else if (isSelected) {\n fileName = pico.white(fileName);\n } else {\n fileName = pico.dim(fileName);\n }\n\n lines.push(`${pico.cyan('\u2502')} ${cursorMark} ${checkbox} ${fileName}`);\n }\n\n // Show \"more below\" indicator when there are more items\n if (visibleEnd < totalOptions) {\n const remaining = totalOptions - visibleEnd;\n lines.push(`${pico.cyan('\u2502')} ${pico.gray(`... ${remaining} more`)}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Render the footer with hints\n */\n private renderFooter(): string {\n const hints = pico.dim('Space: select \u2022 Enter: confirm \u2022 Esc: cancel');\n return `${pico.cyan('\u2514')} ${hints}`;\n }\n\n /**\n * Render the collapsed cancelled state\n */\n private renderCancelled(): string {\n const symbol = pico.red('\u25A0'); // Red square for cancelled\n const end = pico.gray('\u2514');\n \n return `${symbol} ${this.message}\\n${end} ${pico.dim('Operation cancelled')}`;\n }\n\n /**\n * Render the collapsed submitted state (for successful selection)\n */\n private renderSubmitted(): string {\n const symbol = pico.green('\u25C7'); // Green hollow diamond for success\n const bar = pico.gray('\u2502');\n \n const status = pico.dim(this.getSelectionLabel() + ' selected');\n \n return `${symbol} ${this.message}\\n${bar} ${status}`;\n }\n}\n\n/**\n * Helper function to create and run the file selector\n */\nexport async function promptFileSelector(\n options: FileSelectorOptions\n): Promise<string[] | null> {\n const selector = new FileSelectorWithHeader(options);\n const result = await selector.prompt();\n\n if (isCancel(result)) {\n return null;\n }\n\n return result as string[];\n}\n", "/**\n * File Scanner Utility\n * \n * Scans all files in a workspace directory for interactive file selection.\n * Filters out junk files and common build/dependency directories.\n */\n\nimport { relative } from 'path';\nimport { isJunk } from 'junk';\nimport { walkFiles } from './file-walker.js';\nimport { logger } from './logger.js';\n\n/**\n * Common directories to exclude from file scanning\n */\nconst DEFAULT_EXCLUDE_DIRS = new Set([\n 'node_modules',\n '.git',\n '.next',\n '.turbo',\n 'dist',\n 'build',\n 'out',\n '.cache',\n 'coverage',\n '.nyc_output',\n '.parcel-cache',\n '.webpack',\n '.vscode',\n '.idea',\n '__pycache__',\n 'target',\n 'vendor',\n]);\n\n/**\n * Options for scanning workspace files\n */\nexport interface FileScanOptions {\n /** Base directory to scan from (default: process.cwd()) */\n cwd?: string;\n \n /** Specific directory path to scan (overrides cwd if provided) */\n basePath?: string;\n \n /** Additional directory names to exclude (merged with defaults) */\n excludeDirs?: string[];\n \n /** Maximum number of files to return (default: 10000) */\n maxFiles?: number;\n \n /** Whether to follow symbolic links (default: false) */\n followSymlinks?: boolean;\n \n /** Whether to include directories in results (default: false) */\n includeDirs?: boolean;\n}\n\n/**\n * Check if a path segment is an excluded directory\n */\nfunction isExcludedDir(fullPath: string, excludeDirs: Set<string>): boolean {\n const segments = fullPath.split('/');\n \n // Check if any segment matches an excluded directory\n for (const segment of segments) {\n if (excludeDirs.has(segment)) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * Scan workspace for all non-junk files\n * \n * @param options - Scanning options\n * @returns Array of relative file paths (and optionally directory paths with '/' suffix) from cwd (or basePath if specified)\n * \n * @example\n * const files = await scanWorkspaceFiles({ cwd: '/path/to/workspace' });\n * // Returns: ['src/index.ts', 'package.json', '.openpkgs/rules/cursor.md', ...]\n * \n * @example\n * // Scan a specific directory\n * const packageFiles = await scanWorkspaceFiles({ \n * cwd: '/workspace',\n * basePath: '/workspace/.openpackage/packages/my-pkg'\n * });\n * // Returns files relative to basePath: ['file1.txt', 'subdir/file2.txt', ...]\n * \n * @example\n * // Include directories in results\n * const filesAndDirs = await scanWorkspaceFiles({ \n * cwd: '/path/to/workspace',\n * includeDirs: true\n * });\n * // Returns: ['src/', 'src/index.ts', 'src/utils/', 'src/utils/helper.ts', ...]\n */\nexport async function scanWorkspaceFiles(\n options: FileScanOptions = {}\n): Promise<string[]> {\n const {\n cwd = process.cwd(),\n basePath,\n excludeDirs = [],\n maxFiles = 10000,\n followSymlinks = false,\n includeDirs = false\n } = options;\n \n // Use basePath if provided, otherwise use cwd\n const scanDir = basePath || cwd;\n \n // Merge default and custom exclude directories\n const allExcludeDirs = new Set([\n ...DEFAULT_EXCLUDE_DIRS,\n ...excludeDirs\n ]);\n \n const files: string[] = [];\n const dirs: string[] = [];\n let fileCount = 0;\n \n try {\n // Create filter for file walker\n const filter = (path: string, isDirectory: boolean) => {\n // Get the basename for junk checking\n const segments = path.split('/');\n const basename = segments[segments.length - 1];\n \n // Filter out junk files\n if (isJunk(basename)) {\n return false;\n }\n \n // Filter out excluded directories and their contents\n if (isExcludedDir(path, allExcludeDirs)) {\n return false;\n }\n \n return true;\n };\n \n // Walk files and collect relative paths\n for await (const filePath of walkFiles(scanDir, { filter, followSymlinks, includeDirs })) {\n // Stop if we've hit the max files limit\n if (fileCount >= maxFiles) {\n logger.debug(`File scan limit reached: ${maxFiles} files`);\n break;\n }\n \n // Convert to relative path for display\n const relativePath = relative(scanDir, filePath);\n \n // Skip if relative path is empty (shouldn't happen, but safety check)\n if (!relativePath || relativePath === '.') {\n continue;\n }\n \n // Check if this is a directory (when includeDirs is enabled)\n if (includeDirs) {\n const fs = await import('fs');\n const stat = await fs.promises.stat(filePath);\n if (stat.isDirectory()) {\n // Add '/' suffix to directories for visual distinction\n dirs.push(relativePath + '/');\n } else {\n files.push(relativePath);\n }\n } else {\n files.push(relativePath);\n }\n \n fileCount++;\n }\n \n // Sort files and directories for better UX\n // Directories first, then files, both alphabetically within their group\n const allItems = [...dirs.sort(), ...files.sort()];\n \n // Apply depth-based sorting to prioritize shallow items\n allItems.sort((a, b) => {\n // Remove trailing '/' for directory depth calculation\n const aPath = a.endsWith('/') ? a.slice(0, -1) : a;\n const bPath = b.endsWith('/') ? b.slice(0, -1) : b;\n \n // Prioritize items in root directory\n const aDepth = aPath.split('/').length;\n const bDepth = bPath.split('/').length;\n \n if (aDepth !== bDepth) {\n return aDepth - bDepth;\n }\n \n // Then alphabetically\n return a.localeCompare(b);\n });\n \n logger.debug(`Scanned ${allItems.length} items in workspace`, { scanDir, includeDirs });\n \n return allItems;\n \n } catch (error) {\n logger.error('Error scanning workspace files', { error, scanDir });\n throw new Error(`Failed to scan workspace files: ${error}`);\n }\n}\n\n/**\n * Check if the current environment supports interactive prompts.\n *\n * Prefer using `ExecutionContext.interactive` when available -- this\n * function exists as a last-resort fallback for code paths that\n * don't have access to a context object.\n * \n * @returns True if stdin and stdout are TTY (terminal)\n * @deprecated Use ExecutionContext.interactive instead when possible.\n */\nexport function canPrompt(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n", "import { resolve as resolvePath, join } from 'path';\n\nimport { exists } from './fs.js';\nimport { getLocalOpenPackageDir } from './paths.js';\n\n/**\n * Options for resolving source operation arguments.\n */\nexport interface SourceOperationOptions {\n /** Command name for error messages ('add' | 'remove') */\n command: 'add' | 'remove';\n /** Whether to check workspace root path in addition to filesystem path (for remove) */\n checkWorkspaceRoot?: boolean;\n}\n\n/**\n * Resolved source operation result.\n */\nexport interface ResolvedSourceOperation {\n /** Package name (null = workspace root, string = specific package) */\n resolvedPackageName: string | null;\n /** Path to operate on */\n resolvedPath: string;\n}\n\n/**\n * Resolve source operation arguments to determine package name and operation path.\n * \n * This shared utility handles argument resolution for both add and remove commands:\n * - For add: packageName from --to option, pathArg is source path to add\n * - For remove: packageName from --from option, pathArg is target path to remove\n * \n * @param cwd - Current working directory\n * @param packageName - Package name from --to/--from option (undefined = workspace root)\n * @param pathArg - Path argument from command line\n * @param options - Command-specific options\n * @returns Resolved package name and path\n * \n * @example\n * // Add command: opkg add ./file.md --to my-package\n * const result = await resolveSourceOperationArguments(\n * cwd, 'my-package', './file.md', { command: 'add' }\n * );\n * // => { resolvedPackageName: 'my-package', resolvedPath: './file.md' }\n * \n * @example\n * // Remove command: opkg remove agents/my-agent\n * const result = await resolveSourceOperationArguments(\n * cwd, undefined, 'agents/my-agent', { command: 'remove', checkWorkspaceRoot: true }\n * );\n * // Checks both ./agents/my-agent AND .openpackage/agents/my-agent\n * // => { resolvedPackageName: null, resolvedPath: 'agents/my-agent' }\n */\nexport async function resolveSourceOperationArguments(\n cwd: string,\n packageName: string | undefined,\n pathArg: string | undefined,\n options: SourceOperationOptions\n): Promise<ResolvedSourceOperation> {\n const { command, checkWorkspaceRoot = false } = options;\n const flagName = command === 'add' ? '--to' : '--from';\n \n // Two arguments provided: explicit package name + path\n if (packageName && pathArg) {\n return { resolvedPackageName: packageName, resolvedPath: pathArg };\n }\n\n // One argument provided\n const singleArg = packageName || pathArg;\n if (!singleArg) {\n throw new Error(`Path argument is required for ${command}.`);\n }\n\n // Check if single arg is a valid path\n const absPath = resolvePath(cwd, singleArg);\n let pathExists = await exists(absPath);\n \n // For remove command, also check workspace root path\n if (!pathExists && checkWorkspaceRoot) {\n const openpackageDir = getLocalOpenPackageDir(cwd);\n const workspaceRootPath = join(openpackageDir, singleArg);\n pathExists = await exists(workspaceRootPath);\n }\n \n if (pathExists) {\n // It's a valid path \u2192 operate on workspace root\n return { resolvedPackageName: null, resolvedPath: singleArg };\n }\n\n // Path doesn't exist. For remove, pass through so the pipeline can try dependency resolution.\n // For add, this would have failed earlier. Only remove uses checkWorkspaceRoot.\n if (checkWorkspaceRoot && command === 'remove') {\n return { resolvedPackageName: null, resolvedPath: singleArg };\n }\n\n // Not a valid path \u2192 treat as package name (error will be thrown later)\n throw new Error(\n `Path '${singleArg}' not found.\\n\\n` +\n `If you meant to specify a package name, use: opkg ${command} <path> ${flagName} ${singleArg}`\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "join", "basename", "relative", "isJunk", "basename", "isJunk", "relative", "join", "join"]
7
+ }