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,221 @@
1
+ /**
2
+ * Per-source-type metadata fetchers for the wave resolver.
3
+ * Routes dependency declarations to the appropriate loader (registry, git, path)
4
+ * and returns standardized FetchResults including child dependencies.
5
+ */
6
+ import { selectInstallVersionUnified } from '../version-selection.js';
7
+ import { resolvePackageContentRoot } from '../local-source-resolution.js';
8
+ import { ensureContentRoot } from './content-root-cache.js';
9
+ import { normalizeGitUrl } from '../../../utils/git-url-parser.js';
10
+ import { resolveDeclaredPath } from '../../../utils/path-resolution.js';
11
+ import { readManifestAtPath, extractDependencies } from './manifest-reader.js';
12
+ /**
13
+ * Compute a canonical dependency ID for wave-resolver deduplication.
14
+ *
15
+ * Registry deps use name-only keys (`registry:<name>`) so that the same
16
+ * package referenced from multiple parents with different version constraints
17
+ * merges into a single node for version solving.
18
+ */
19
+ export function computeWaveId(declaration, declaredInDir) {
20
+ const depName = String(declaration.name ?? '').trim();
21
+ if (declaration.url) {
22
+ const [gitUrlRaw, embeddedRef] = declaration.url.includes('#')
23
+ ? declaration.url.split('#', 2)
24
+ : [declaration.url, undefined];
25
+ const ref = embeddedRef || declaration.ref || 'default';
26
+ const normalizedUrl = normalizeGitUrl(gitUrlRaw);
27
+ let resourcePath = declaration.path ?? '';
28
+ if (depName.startsWith('gh@')) {
29
+ const tail = depName.slice(3);
30
+ const parts = tail.split('/').filter(Boolean);
31
+ if (parts.length > 2 && !resourcePath) {
32
+ resourcePath = parts.slice(2).join('/');
33
+ }
34
+ }
35
+ const id = `git:${normalizedUrl}#${ref}:${resourcePath}`;
36
+ const displayName = depName || (resourcePath ? `git@${normalizedUrl}/${resourcePath}` : `git@${normalizedUrl}`);
37
+ return { id, displayName, sourceType: 'git' };
38
+ }
39
+ if (declaration.path) {
40
+ const { absolute } = resolveDeclaredPath(declaration.path, declaredInDir);
41
+ const id = `path:${absolute}`;
42
+ const displayName = depName || declaration.path;
43
+ return { id, displayName, sourceType: 'path' };
44
+ }
45
+ // Registry: name-only key for constraint merging
46
+ const id = `registry:${depName}`;
47
+ return { id, displayName: depName, sourceType: 'registry' };
48
+ }
49
+ /**
50
+ * Build a ResolvedSource from a dependency declaration.
51
+ * Mirrors the logic in graph-builder's resolveSourceFromDeclaration.
52
+ */
53
+ export function resolveSourceFromDeclaration(declaration, pathResolutionDir) {
54
+ if (declaration.url) {
55
+ const [gitUrl, embeddedRef] = declaration.url.includes('#')
56
+ ? declaration.url.split('#', 2)
57
+ : [declaration.url, undefined];
58
+ const ref = embeddedRef || declaration.ref;
59
+ const depName = String(declaration.name ?? '');
60
+ let resourcePath = declaration.path ?? '';
61
+ if (depName.startsWith('gh@')) {
62
+ const tail = depName.slice(3);
63
+ const parts = tail.split('/').filter(Boolean);
64
+ if (parts.length > 2 && !resourcePath) {
65
+ resourcePath = parts.slice(2).join('/');
66
+ }
67
+ }
68
+ return {
69
+ type: 'git',
70
+ gitUrl,
71
+ gitRef: ref,
72
+ resourcePath: resourcePath || undefined,
73
+ contentRoot: undefined
74
+ };
75
+ }
76
+ if (declaration.path) {
77
+ const { absolute } = resolveDeclaredPath(declaration.path, pathResolutionDir);
78
+ return { type: 'path', absolutePath: absolute, contentRoot: absolute };
79
+ }
80
+ return {
81
+ type: 'registry',
82
+ packageName: declaration.name,
83
+ resolvedVersion: declaration.version,
84
+ contentRoot: undefined
85
+ };
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Fetcher implementations
89
+ // ---------------------------------------------------------------------------
90
+ /**
91
+ * Fetches registry package metadata using local-first-with-remote-fallback
92
+ * version resolution.
93
+ */
94
+ export class RegistryFetcher {
95
+ async fetch(declaration, declaredInDir, options) {
96
+ const { id, displayName, sourceType } = computeWaveId(declaration, declaredInDir);
97
+ const source = resolveSourceFromDeclaration(declaration, declaredInDir);
98
+ const packageName = declaration.name;
99
+ const constraint = declaration.version ?? '*';
100
+ // Use unified version selection (local-first with remote fallback)
101
+ const selectionResult = await selectInstallVersionUnified({
102
+ packageName,
103
+ constraint,
104
+ mode: options.resolutionMode ?? 'default',
105
+ explicitPrereleaseIntent: false,
106
+ profile: options.profile,
107
+ apiKey: options.apiKey
108
+ });
109
+ const version = selectionResult.selectedVersion;
110
+ if (!version) {
111
+ // No version found - return minimal result without children
112
+ return {
113
+ id, displayName, name: packageName, sourceType, source,
114
+ childDependencies: []
115
+ };
116
+ }
117
+ source.resolvedVersion = version;
118
+ // Resolve content root for reading child manifest
119
+ let contentRoot;
120
+ try {
121
+ contentRoot = await resolvePackageContentRoot({
122
+ cwd: options.workspaceRoot,
123
+ packageName,
124
+ version
125
+ });
126
+ source.contentRoot = contentRoot;
127
+ }
128
+ catch {
129
+ // Content root not available locally -- pipeline will load it later
130
+ }
131
+ // Read child manifest to discover transitive dependencies
132
+ let childDeps = [];
133
+ let metadata;
134
+ if (contentRoot) {
135
+ const manifest = await readManifestAtPath(contentRoot);
136
+ if (manifest) {
137
+ metadata = manifest;
138
+ childDeps = extractDependencies(manifest, contentRoot + '/openpackage.yml', options.depth + 1, false // dev deps only at root
139
+ );
140
+ }
141
+ }
142
+ return {
143
+ id, displayName, name: packageName, version, contentRoot,
144
+ sourceType, source, metadata, childDependencies: childDeps
145
+ };
146
+ }
147
+ }
148
+ /**
149
+ * Fetches git-sourced packages using the shared content root cache.
150
+ * Handles marketplace detection (returns isMarketplace with no children).
151
+ */
152
+ export class GitFetcher {
153
+ async fetch(declaration, declaredInDir, options) {
154
+ const { id, displayName, sourceType } = computeWaveId(declaration, declaredInDir);
155
+ const source = resolveSourceFromDeclaration(declaration, declaredInDir);
156
+ // Use content root cache (handles cloning + caching)
157
+ const result = await ensureContentRoot(source, { skipCache: options.skipCache });
158
+ if (result.isMarketplace) {
159
+ return {
160
+ id, displayName, name: declaration.name, sourceType, source,
161
+ isMarketplace: true, childDependencies: [],
162
+ repoRoot: result.repoPath
163
+ };
164
+ }
165
+ const contentRoot = result.contentRoot;
166
+ source.contentRoot = contentRoot;
167
+ let childDeps = [];
168
+ let metadata;
169
+ if (contentRoot) {
170
+ const manifest = await readManifestAtPath(contentRoot);
171
+ if (manifest) {
172
+ metadata = manifest;
173
+ childDeps = extractDependencies(manifest, contentRoot + '/openpackage.yml', options.depth + 1, false);
174
+ }
175
+ }
176
+ return {
177
+ id, displayName, name: declaration.name,
178
+ version: metadata?.version,
179
+ contentRoot, repoRoot: result.repoPath,
180
+ sourceType, source, metadata,
181
+ childDependencies: childDeps
182
+ };
183
+ }
184
+ }
185
+ /**
186
+ * Fetches path-sourced packages by resolving the absolute path
187
+ * and reading the manifest directly from the filesystem.
188
+ */
189
+ export class PathFetcher {
190
+ async fetch(declaration, declaredInDir, options) {
191
+ const { id, displayName, sourceType } = computeWaveId(declaration, declaredInDir);
192
+ const source = resolveSourceFromDeclaration(declaration, declaredInDir);
193
+ const contentRoot = source.absolutePath ?? source.contentRoot;
194
+ let childDeps = [];
195
+ let metadata;
196
+ if (contentRoot) {
197
+ const manifest = await readManifestAtPath(contentRoot);
198
+ if (manifest) {
199
+ metadata = manifest;
200
+ childDeps = extractDependencies(manifest, contentRoot + '/openpackage.yml', options.depth + 1, false);
201
+ }
202
+ }
203
+ return {
204
+ id, displayName, name: declaration.name,
205
+ version: metadata?.version,
206
+ contentRoot, sourceType, source, metadata,
207
+ childDependencies: childDeps
208
+ };
209
+ }
210
+ }
211
+ /**
212
+ * Create the appropriate fetcher for a dependency declaration.
213
+ */
214
+ export function createFetcher(declaration) {
215
+ if (declaration.url)
216
+ return new GitFetcher();
217
+ if (declaration.path)
218
+ return new PathFetcher();
219
+ return new RegistryFetcher();
220
+ }
221
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../../src/core/install/wave-resolver/fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Updates openpackage.index.yml with resolved dependency information.
3
+ * Called after successful installation to record resolved versions,
4
+ * source paths, and dependency relationships.
5
+ *
6
+ * This runs after the installation pipeline (not during resolution),
7
+ * ensuring the index reflects actually-installed packages.
8
+ */
9
+ import type { WaveGraph } from './types.js';
10
+ /**
11
+ * Update openpackage.index.yml with dependency data from the wave graph.
12
+ *
13
+ * For each resolved node, updates or creates an entry recording the
14
+ * version and dependency list. File mappings are left untouched since
15
+ * those are managed by the install pipeline itself.
16
+ *
17
+ * This is a best-effort operation -- failures are logged but not thrown.
18
+ *
19
+ * @param targetDir - Workspace directory containing the index file
20
+ * @param graph - The resolved wave graph
21
+ */
22
+ export declare function updateWorkspaceIndex(targetDir: string, graph: WaveGraph): Promise<void>;
23
+ //# sourceMappingURL=index-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-updater.d.ts","sourceRoot":"","sources":["../../../../src/core/install/wave-resolver/index-updater.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CAiEf"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Updates openpackage.index.yml with resolved dependency information.
3
+ * Called after successful installation to record resolved versions,
4
+ * source paths, and dependency relationships.
5
+ *
6
+ * This runs after the installation pipeline (not during resolution),
7
+ * ensuring the index reflects actually-installed packages.
8
+ */
9
+ import { readWorkspaceIndex, writeWorkspaceIndex } from '../../../utils/workspace-index-yml.js';
10
+ import { logger } from '../../../utils/logger.js';
11
+ /**
12
+ * Update openpackage.index.yml with dependency data from the wave graph.
13
+ *
14
+ * For each resolved node, updates or creates an entry recording the
15
+ * version and dependency list. File mappings are left untouched since
16
+ * those are managed by the install pipeline itself.
17
+ *
18
+ * This is a best-effort operation -- failures are logged but not thrown.
19
+ *
20
+ * @param targetDir - Workspace directory containing the index file
21
+ * @param graph - The resolved wave graph
22
+ */
23
+ export async function updateWorkspaceIndex(targetDir, graph) {
24
+ let record;
25
+ try {
26
+ record = await readWorkspaceIndex(targetDir);
27
+ }
28
+ catch {
29
+ logger.warn('Could not read workspace index; skipping index update');
30
+ return;
31
+ }
32
+ const index = record.index;
33
+ let updatedCount = 0;
34
+ for (const node of graph.nodes.values()) {
35
+ // Skip marketplace nodes and nodes without a name
36
+ if (node.isMarketplace)
37
+ continue;
38
+ const packageName = node.source.packageName ?? node.metadata?.name ?? node.displayName;
39
+ if (!packageName)
40
+ continue;
41
+ const existing = index.packages[packageName];
42
+ // Only update if we have meaningful info to add
43
+ const version = node.resolvedVersion ?? node.metadata?.version;
44
+ const contentRoot = node.contentRoot ?? node.source.contentRoot ?? node.source.absolutePath;
45
+ if (!existing && !contentRoot)
46
+ continue;
47
+ // Build dependency list from children
48
+ const dependencies = [];
49
+ for (const childId of node.children) {
50
+ const childNode = graph.nodes.get(childId);
51
+ if (childNode) {
52
+ const childName = childNode.source.packageName ?? childNode.metadata?.name ?? childNode.displayName;
53
+ if (childName) {
54
+ dependencies.push(childName);
55
+ }
56
+ }
57
+ }
58
+ if (existing) {
59
+ // Update existing entry -- preserve file mappings
60
+ if (version)
61
+ existing.version = version;
62
+ if (dependencies.length > 0)
63
+ existing.dependencies = dependencies;
64
+ updatedCount++;
65
+ }
66
+ else if (contentRoot) {
67
+ // Create new entry -- minimal; the install pipeline adds file mappings
68
+ index.packages[packageName] = {
69
+ path: contentRoot,
70
+ version,
71
+ dependencies: dependencies.length > 0 ? dependencies : undefined,
72
+ files: {}
73
+ };
74
+ updatedCount++;
75
+ }
76
+ }
77
+ if (updatedCount > 0) {
78
+ try {
79
+ await writeWorkspaceIndex(record);
80
+ logger.info(`Updated workspace index: ${updatedCount} packages`);
81
+ }
82
+ catch (error) {
83
+ logger.warn(`Failed to write workspace index: ${error}`);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=index-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-updater.js","sourceRoot":"","sources":["../../../../src/core/install/wave-resolver/index-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Index Write Collector
3
+ *
4
+ * Collects workspace index mutations during parallel package installations
5
+ * and flushes them in a single atomic read-modify-write cycle.
6
+ *
7
+ * During parallel installs within a wave, each package records its index
8
+ * updates to the collector instead of writing to disk immediately. After
9
+ * all packages in the wave complete, `flush()` applies all mutations at once.
10
+ *
11
+ * This eliminates read-modify-write race conditions on openpackage.index.yml.
12
+ */
13
+ import type { WorkspaceIndexFileMapping } from '../../../types/workspace-index.js';
14
+ /**
15
+ * A complete package entry update (replaces or creates the package in the index).
16
+ */
17
+ export interface PackageEntryUpdate {
18
+ type: 'upsert';
19
+ packageName: string;
20
+ path: string;
21
+ version?: string;
22
+ files: Record<string, (string | WorkspaceIndexFileMapping)[]>;
23
+ dependencies?: string[];
24
+ marketplace?: {
25
+ url: string;
26
+ commitSha: string;
27
+ pluginName: string;
28
+ };
29
+ }
30
+ /**
31
+ * An additive file augmentation (merges file entries into an existing package).
32
+ * Used by the root-file augmentation in installation-executor.ts.
33
+ */
34
+ export interface FileAugmentation {
35
+ type: 'augment-files';
36
+ packageName: string;
37
+ files: Record<string, (string | WorkspaceIndexFileMapping)[]>;
38
+ }
39
+ /**
40
+ * A file mapping rename within a package's index entry.
41
+ * Used by executeNamespace() when physically relocating another package's file.
42
+ */
43
+ export interface FileMappingRename {
44
+ type: 'rename';
45
+ packageName: string;
46
+ /** The index key (source) that contains the mapping */
47
+ indexKey: string;
48
+ /** The old target path */
49
+ oldTargetPath: string;
50
+ /** The new target path (after rename) */
51
+ newTargetPath: string;
52
+ /** Full package entry snapshot (for path/version recovery if entry is missing) */
53
+ entrySnapshot?: {
54
+ path: string;
55
+ version?: string;
56
+ files: Record<string, (string | WorkspaceIndexFileMapping)[]>;
57
+ };
58
+ }
59
+ /**
60
+ * A dependency-graph update for a package.
61
+ * Used by index-updater.ts after wave resolution.
62
+ */
63
+ export interface DependencyUpdate {
64
+ type: 'dependency-update';
65
+ packageName: string;
66
+ version?: string;
67
+ contentRoot?: string;
68
+ dependencies?: string[];
69
+ }
70
+ export type IndexMutation = PackageEntryUpdate | FileAugmentation | FileMappingRename | DependencyUpdate;
71
+ export declare class IndexWriteCollector {
72
+ private mutations;
73
+ /**
74
+ * Record a full package entry upsert (creates or replaces the entry).
75
+ */
76
+ recordPackageUpdate(update: Omit<PackageEntryUpdate, 'type'>): void;
77
+ /**
78
+ * Record additive file entries for an existing package (root files, etc.).
79
+ */
80
+ recordFileAugmentation(augmentation: Omit<FileAugmentation, 'type'>): void;
81
+ /**
82
+ * Record a file mapping rename (namespace relocation).
83
+ */
84
+ recordFileMappingRename(rename: Omit<FileMappingRename, 'type'>): void;
85
+ /**
86
+ * Record a dependency graph update for a package.
87
+ */
88
+ recordDependencyUpdate(update: Omit<DependencyUpdate, 'type'>): void;
89
+ /**
90
+ * Returns true if any mutations have been recorded.
91
+ */
92
+ get hasMutations(): boolean;
93
+ /**
94
+ * Apply all collected mutations to the workspace index in a single
95
+ * read-modify-write cycle, then clear the mutation buffer.
96
+ *
97
+ * @param targetDir - Workspace directory containing the index file
98
+ */
99
+ flush(targetDir: string): Promise<void>;
100
+ }
101
+ //# sourceMappingURL=index-write-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-write-collector.d.ts","sourceRoot":"","sources":["../../../../src/core/install/wave-resolver/index-write-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAyB,MAAM,mCAAmC,CAAC;AAY1G;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;CAC/D;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;KAC/D,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,CAAC;AAMrB,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAuB;IAExC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,IAAI;IAInE;;OAEG;IACH,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,IAAI;IAI1E;;OAEG;IACH,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,IAAI;IAItE;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpE;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;;;;OAKG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgC9C"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Index Write Collector
3
+ *
4
+ * Collects workspace index mutations during parallel package installations
5
+ * and flushes them in a single atomic read-modify-write cycle.
6
+ *
7
+ * During parallel installs within a wave, each package records its index
8
+ * updates to the collector instead of writing to disk immediately. After
9
+ * all packages in the wave complete, `flush()` applies all mutations at once.
10
+ *
11
+ * This eliminates read-modify-write race conditions on openpackage.index.yml.
12
+ */
13
+ import { readWorkspaceIndex, writeWorkspaceIndex } from '../../../utils/workspace-index-yml.js';
14
+ import { sortMapping } from '../../../utils/package-index-yml.js';
15
+ import { formatPathForYaml } from '../../../utils/path-resolution.js';
16
+ import { getTargetPath } from '../../../utils/workspace-index-helpers.js';
17
+ import { normalizePathForProcessing } from '../../../utils/path-normalization.js';
18
+ import { logger } from '../../../utils/logger.js';
19
+ // ============================================================================
20
+ // Collector
21
+ // ============================================================================
22
+ export class IndexWriteCollector {
23
+ constructor() {
24
+ this.mutations = [];
25
+ }
26
+ /**
27
+ * Record a full package entry upsert (creates or replaces the entry).
28
+ */
29
+ recordPackageUpdate(update) {
30
+ this.mutations.push({ type: 'upsert', ...update });
31
+ }
32
+ /**
33
+ * Record additive file entries for an existing package (root files, etc.).
34
+ */
35
+ recordFileAugmentation(augmentation) {
36
+ this.mutations.push({ type: 'augment-files', ...augmentation });
37
+ }
38
+ /**
39
+ * Record a file mapping rename (namespace relocation).
40
+ */
41
+ recordFileMappingRename(rename) {
42
+ this.mutations.push({ type: 'rename', ...rename });
43
+ }
44
+ /**
45
+ * Record a dependency graph update for a package.
46
+ */
47
+ recordDependencyUpdate(update) {
48
+ this.mutations.push({ type: 'dependency-update', ...update });
49
+ }
50
+ /**
51
+ * Returns true if any mutations have been recorded.
52
+ */
53
+ get hasMutations() {
54
+ return this.mutations.length > 0;
55
+ }
56
+ /**
57
+ * Apply all collected mutations to the workspace index in a single
58
+ * read-modify-write cycle, then clear the mutation buffer.
59
+ *
60
+ * @param targetDir - Workspace directory containing the index file
61
+ */
62
+ async flush(targetDir) {
63
+ if (this.mutations.length === 0)
64
+ return;
65
+ let record;
66
+ try {
67
+ record = await readWorkspaceIndex(targetDir);
68
+ }
69
+ catch {
70
+ logger.warn('IndexWriteCollector: could not read workspace index; skipping flush');
71
+ this.mutations = [];
72
+ return;
73
+ }
74
+ const index = record.index;
75
+ index.packages = index.packages ?? {};
76
+ for (const mutation of this.mutations) {
77
+ try {
78
+ applyMutation(index, mutation, targetDir);
79
+ }
80
+ catch (error) {
81
+ logger.warn(`IndexWriteCollector: failed to apply mutation (${mutation.type}): ${error}`);
82
+ }
83
+ }
84
+ try {
85
+ await writeWorkspaceIndex(record);
86
+ logger.debug(`IndexWriteCollector: flushed ${this.mutations.length} mutations`);
87
+ }
88
+ catch (error) {
89
+ logger.warn(`IndexWriteCollector: failed to write workspace index: ${error}`);
90
+ }
91
+ this.mutations = [];
92
+ }
93
+ }
94
+ // ============================================================================
95
+ // Mutation application
96
+ // ============================================================================
97
+ function applyMutation(index, mutation, targetDir) {
98
+ switch (mutation.type) {
99
+ case 'upsert': {
100
+ const formattedPath = formatPathForYaml(mutation.path, targetDir);
101
+ const entry = {
102
+ ...(index.packages[mutation.packageName] ?? {}),
103
+ path: formattedPath,
104
+ files: sortMapping(mutation.files),
105
+ };
106
+ if (mutation.version)
107
+ entry.version = mutation.version;
108
+ if (mutation.dependencies && mutation.dependencies.length > 0) {
109
+ entry.dependencies = mutation.dependencies;
110
+ }
111
+ if (mutation.marketplace)
112
+ entry.marketplace = mutation.marketplace;
113
+ index.packages[mutation.packageName] = entry;
114
+ break;
115
+ }
116
+ case 'augment-files': {
117
+ const existing = index.packages[mutation.packageName];
118
+ if (!existing)
119
+ break;
120
+ const files = { ...(existing.files ?? {}) };
121
+ for (const [key, values] of Object.entries(mutation.files)) {
122
+ const current = files[key] ?? [];
123
+ // Deduplicate by target path
124
+ const byTarget = new Map();
125
+ for (const m of current) {
126
+ byTarget.set(getTargetPath(m), m);
127
+ }
128
+ for (const m of values) {
129
+ const tp = getTargetPath(m);
130
+ if (!byTarget.has(tp)) {
131
+ byTarget.set(tp, m);
132
+ }
133
+ }
134
+ files[key] = Array.from(byTarget.values());
135
+ }
136
+ existing.files = files;
137
+ break;
138
+ }
139
+ case 'rename': {
140
+ const entry = index.packages[mutation.packageName];
141
+ if (!entry) {
142
+ // Entry might not exist yet if the collector is used during a fresh install.
143
+ // Use the snapshot to create it.
144
+ if (mutation.entrySnapshot) {
145
+ const formattedPath = formatPathForYaml(mutation.entrySnapshot.path, targetDir);
146
+ index.packages[mutation.packageName] = {
147
+ path: formattedPath,
148
+ version: mutation.entrySnapshot.version,
149
+ files: sortMapping(mutation.entrySnapshot.files),
150
+ };
151
+ }
152
+ break;
153
+ }
154
+ const normalizedOld = normalizePathForProcessing(mutation.oldTargetPath);
155
+ const normalizedNew = normalizePathForProcessing(mutation.newTargetPath);
156
+ const values = entry.files[mutation.indexKey];
157
+ if (!values)
158
+ break;
159
+ const idx = values.findIndex(mapping => {
160
+ const target = getTargetPath(mapping);
161
+ return normalizePathForProcessing(target) === normalizedOld;
162
+ });
163
+ if (idx === -1)
164
+ break;
165
+ const oldMapping = values[idx];
166
+ values[idx] = typeof oldMapping === 'string'
167
+ ? normalizedNew
168
+ : { ...oldMapping, target: normalizedNew };
169
+ break;
170
+ }
171
+ case 'dependency-update': {
172
+ const existing = index.packages[mutation.packageName];
173
+ if (existing) {
174
+ if (mutation.version)
175
+ existing.version = mutation.version;
176
+ if (mutation.dependencies && mutation.dependencies.length > 0) {
177
+ existing.dependencies = mutation.dependencies;
178
+ }
179
+ }
180
+ else if (mutation.contentRoot) {
181
+ const formattedPath = formatPathForYaml(mutation.contentRoot, targetDir);
182
+ index.packages[mutation.packageName] = {
183
+ path: formattedPath,
184
+ version: mutation.version,
185
+ dependencies: mutation.dependencies && mutation.dependencies.length > 0
186
+ ? mutation.dependencies : undefined,
187
+ files: {},
188
+ };
189
+ }
190
+ break;
191
+ }
192
+ }
193
+ }
194
+ //# sourceMappingURL=index-write-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-write-collector.js","sourceRoot":"","sources":["../../../../src/core/install/wave-resolver/index-write-collector.ts"],"names":[],"mappings":"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"}