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,1121 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ applyMapPipeline,
4
+ createMapContext,
5
+ defaultTransformRegistry,
6
+ parseMarkdownDocument,
7
+ serializeMarkdownDocument,
8
+ splitMapPipeline,
9
+ validateMapPipeline
10
+ } from "./chunk-IXOEIRDT.js";
11
+ import {
12
+ CLOSE_MARKER,
13
+ CLOSE_MARKER_REGEX,
14
+ buildOpenMarker,
15
+ buildOpenMarkerRegex,
16
+ extractAllKeys
17
+ } from "./chunk-QURLGVA4.js";
18
+ import {
19
+ stripPlatformSuffixFromFilename
20
+ } from "./chunk-4X2EJHJN.js";
21
+ import {
22
+ composeMarkdown,
23
+ deepEqualYaml,
24
+ deepMerge,
25
+ extractInlinePlatformOverrides,
26
+ splitFrontmatter
27
+ } from "./chunk-VQ2KY6CK.js";
28
+ import {
29
+ resolveSwitchExpression,
30
+ smartEquals,
31
+ smartNotEquals,
32
+ validateSwitchExpression
33
+ } from "./chunk-N43IXOND.js";
34
+ import {
35
+ FILE_PATTERNS
36
+ } from "./chunk-IHVZ5AUJ.js";
37
+ import {
38
+ ensureDir,
39
+ exists,
40
+ readTextFile,
41
+ writeTextFile
42
+ } from "./chunk-S47F4OG4.js";
43
+ import {
44
+ logger
45
+ } from "./chunk-5EFWGD33.js";
46
+
47
+ // ../core/src/utils/hash-utils.ts
48
+ import { xxhash3 } from "hash-wasm";
49
+ async function calculateFileHash(content) {
50
+ try {
51
+ return await xxhash3(content);
52
+ } catch (error) {
53
+ return logger.warn(`Failed to calculate hash for content: ${error}`), `${content.length}-${content.charAt(0)}-${content.charAt(content.length - 1)}`;
54
+ }
55
+ }
56
+
57
+ // ../core/src/core/flows/flow-executor.ts
58
+ import { promises as fs2 } from "fs";
59
+ import fsSync from "fs";
60
+ import path2 from "path";
61
+ import yaml from "js-yaml";
62
+ import * as TOML from "smol-toml";
63
+ import { parse as parseJsonc } from "jsonc-parser";
64
+ import { JSONPath } from "jsonpath-plus";
65
+
66
+ // ../core/src/utils/root-file-merger.ts
67
+ function mergePackageContentIntoRootFile(existingContent, packageName, newContent) {
68
+ if (!packageName)
69
+ throw new Error("Package name is required for merging");
70
+ let openMarker = buildOpenMarker(packageName), closeMarker = CLOSE_MARKER, openRe = buildOpenMarkerRegex(packageName), closeRe = CLOSE_MARKER_REGEX, openMatch = openRe.exec(existingContent);
71
+ if (!openMatch) {
72
+ let separator = existingContent.trim() ? `
73
+
74
+ ` : "";
75
+ return existingContent.trim() + separator + openMarker + `
76
+ ` + newContent.trim() + `
77
+ ` + closeMarker + `
78
+ `;
79
+ }
80
+ let beforeSection = existingContent.substring(0, openMatch.index), afterMarkerIndex = openMatch.index + openMatch[0].length, restContent = existingContent.substring(afterMarkerIndex), closeMatch = closeRe.exec(restContent);
81
+ if (!closeMatch) {
82
+ let separator = existingContent.trim() ? `
83
+
84
+ ` : "";
85
+ return existingContent.trim() + separator + openMarker + `
86
+ ` + newContent.trim() + `
87
+ ` + closeMarker + `
88
+ `;
89
+ }
90
+ let existingSectionBody = restContent.substring(0, closeMatch.index).trim(), afterCloseMarkerIndex = closeMatch.index + closeMatch[0].length, afterSection = restContent.substring(afterCloseMarkerIndex), hasCorrectMarker = openMatch[0] === openMarker, hasCorrectContent = existingSectionBody === newContent.trim();
91
+ return hasCorrectMarker && hasCorrectContent && !0 ? existingContent : beforeSection + openMarker + `
92
+ ` + newContent.trim() + `
93
+ ` + closeMarker + afterSection;
94
+ }
95
+
96
+ // ../core/src/core/glob-target-mapping.ts
97
+ import { extname } from "path";
98
+ function normalizeSlashPath(input) {
99
+ return input.replace(/\\/g, "/");
100
+ }
101
+ function splitSegments(input) {
102
+ return normalizeSlashPath(input).split("/").filter(Boolean);
103
+ }
104
+ function stripOverlappingDestBaseFromSource(destBase, sourceRelFromPackage) {
105
+ let destSegments = splitSegments(destBase), sourceSegments = splitSegments(sourceRelFromPackage), maxOverlap = Math.min(destSegments.length, sourceSegments.length), overlapLen = 0;
106
+ for (let k = maxOverlap; k >= 1; k--) {
107
+ let destSuffix = destSegments.slice(-k).join("/"), sourcePrefix = sourceSegments.slice(0, k).join("/");
108
+ if (destSuffix === sourcePrefix) {
109
+ overlapLen = k;
110
+ break;
111
+ }
112
+ }
113
+ return sourceSegments.slice(overlapLen).join("/");
114
+ }
115
+ function extractTargetExtensionFromRecursiveSuffix(toSuffix) {
116
+ return normalizeSlashPath(toSuffix).match(/(\.[^/]+)$/)?.[1] ?? null;
117
+ }
118
+ function resolveRecursiveGlobTargetRelativePath(sourceRelFromPackage, fromPattern, toPattern) {
119
+ let toParts = normalizeSlashPath(toPattern).split("**"), toBase = toParts[0].replace(/\/$/, ""), toSuffix = toParts[1] || "", relativeSubpath = sourceRelFromPackage;
120
+ if (fromPattern.includes("**")) {
121
+ let fromParts = normalizeSlashPath(fromPattern).split("**"), fromBase = fromParts[0].replace(/\/$/, ""), fromSuffix = fromParts[1] || "";
122
+ if (fromBase) {
123
+ let normalizedSource = normalizeSlashPath(sourceRelFromPackage);
124
+ relativeSubpath = normalizedSource.startsWith(fromBase + "/") ? normalizedSource.slice(fromBase.length + 1) : normalizedSource;
125
+ }
126
+ if (fromSuffix && toSuffix) {
127
+ let fromExt = fromSuffix.replace(/^\/?\*+/, ""), toExt = toSuffix.replace(/^\/?\*+/, "");
128
+ fromExt && toExt && fromExt !== toExt && (relativeSubpath = relativeSubpath.replace(
129
+ new RegExp(fromExt.replace(".", "\\.") + "$"),
130
+ toExt
131
+ ));
132
+ }
133
+ } else {
134
+ relativeSubpath = toBase ? stripOverlappingDestBaseFromSource(toBase, sourceRelFromPackage) : normalizeSlashPath(sourceRelFromPackage);
135
+ let toExt = extractTargetExtensionFromRecursiveSuffix(toSuffix);
136
+ if (toExt && toExt.startsWith(".")) {
137
+ let currentExt = extname(relativeSubpath);
138
+ currentExt && currentExt !== toExt && (relativeSubpath = relativeSubpath.slice(0, -currentExt.length) + toExt);
139
+ }
140
+ }
141
+ return relativeSubpath = stripPlatformSuffixFromFilename(relativeSubpath), normalizeSlashPath(toBase ? `${toBase}/${relativeSubpath}` : relativeSubpath);
142
+ }
143
+
144
+ // ../core/src/core/platform-yaml-merge.ts
145
+ function mergeInlinePlatformOverride(universalContent, targetPlatform, cwd) {
146
+ try {
147
+ let trimmed = universalContent.trim();
148
+ if (!trimmed.endsWith(FILE_PATTERNS.MD_FILES) && !trimmed.startsWith("---"))
149
+ return universalContent;
150
+ let { frontmatter, body, rawFrontmatter } = splitFrontmatter(universalContent), { common, overridesByPlatform } = extractInlinePlatformOverrides(frontmatter, cwd), override = overridesByPlatform.get(targetPlatform) ?? {}, mergedData = deepMerge(common, override);
151
+ return rawFrontmatter !== void 0 && deepEqualYaml(frontmatter, mergedData) || rawFrontmatter === void 0 && Object.keys(mergedData).length === 0 ? universalContent : composeMarkdown(mergedData, body);
152
+ } catch {
153
+ return universalContent;
154
+ }
155
+ }
156
+
157
+ // ../core/src/core/flows/flow-key-mapper.ts
158
+ function getNestedValue(obj, path3) {
159
+ if (!path3)
160
+ return obj;
161
+ let keys = path3.split("."), current = obj;
162
+ for (let key of keys)
163
+ if (current && typeof current == "object" && key in current)
164
+ current = current[key];
165
+ else
166
+ return;
167
+ return current;
168
+ }
169
+ function setNestedValue(obj, path3, value) {
170
+ if (!path3)
171
+ return;
172
+ let keys = path3.split("."), current = obj;
173
+ for (let i = 0; i < keys.length - 1; i++) {
174
+ let key = keys[i];
175
+ (!(key in current) || typeof current[key] != "object") && (current[key] = {}), current = current[key];
176
+ }
177
+ let finalKey = keys[keys.length - 1];
178
+ current[finalKey] = value;
179
+ }
180
+ function deleteNestedValue(obj, path3) {
181
+ if (!path3)
182
+ return;
183
+ let keys = path3.split("."), current = obj;
184
+ for (let i = 0; i < keys.length - 1; i++) {
185
+ let key = keys[i];
186
+ if (!(key in current) || typeof current[key] != "object")
187
+ return;
188
+ current = current[key];
189
+ }
190
+ let finalKey = keys[keys.length - 1];
191
+ delete current[finalKey];
192
+ }
193
+
194
+ // ../core/src/core/flows/source-resolver.ts
195
+ import { promises as fs } from "fs";
196
+ import path from "path";
197
+ import { minimatch } from "minimatch";
198
+ var SourcePatternResolver = class {
199
+ /**
200
+ * Resolve source pattern(s) to file paths
201
+ *
202
+ * For single patterns: returns all matching files
203
+ * For array patterns: returns files from first matching pattern only (priority order)
204
+ *
205
+ * @param pattern - Single pattern or array of patterns with priority
206
+ * @param options - Resolution options
207
+ * @returns Resolution result with paths and warnings
208
+ */
209
+ async resolve(pattern, options) {
210
+ return Array.isArray(pattern) ? this.resolveWithPriority(pattern, options) : {
211
+ paths: await this.resolveSinglePattern(pattern, options.baseDir),
212
+ warnings: []
213
+ };
214
+ }
215
+ /**
216
+ * Resolve array of patterns with priority (first match wins)
217
+ *
218
+ * Iterates through patterns in order, returning files from first matching pattern.
219
+ * Logs warnings if lower-priority patterns also match.
220
+ *
221
+ * @param patterns - Array of patterns in priority order
222
+ * @param options - Resolution options
223
+ * @returns Resolution result
224
+ */
225
+ async resolveWithPriority(patterns, options) {
226
+ if (patterns.length === 0)
227
+ return { paths: [], warnings: ["Empty pattern array provided"] };
228
+ let warnings = [], skippedPatterns = [];
229
+ for (let i = 0; i < patterns.length; i++) {
230
+ let currentPattern = patterns[i], matches = await this.resolveSinglePattern(currentPattern, options.baseDir);
231
+ if (matches.length > 0) {
232
+ for (let j = i + 1; j < patterns.length; j++) {
233
+ let lowerPriorityPattern = patterns[j], lowerMatches = await this.resolveSinglePattern(
234
+ lowerPriorityPattern,
235
+ options.baseDir
236
+ );
237
+ if (lowerMatches.length > 0) {
238
+ let warning = `Pattern "${currentPattern}" matched (priority ${i + 1}). Ignoring lower-priority pattern "${lowerPriorityPattern}" (priority ${j + 1}) which also matched ${lowerMatches.length} file(s).`;
239
+ warnings.push(warning), skippedPatterns.push(lowerPriorityPattern), options.logWarnings !== !1 && logger.debug(warning);
240
+ }
241
+ }
242
+ return {
243
+ paths: matches,
244
+ warnings,
245
+ matchedPattern: currentPattern,
246
+ skippedPatterns: skippedPatterns.length > 0 ? skippedPatterns : void 0
247
+ };
248
+ }
249
+ }
250
+ return {
251
+ paths: [],
252
+ warnings: [`No files matched any of the ${patterns.length} pattern(s): ${patterns.join(", ")}`]
253
+ };
254
+ }
255
+ /**
256
+ * Resolve a single pattern to file paths
257
+ *
258
+ * Handles both glob patterns and literal file paths.
259
+ *
260
+ * @param pattern - File pattern (may contain globs)
261
+ * @param baseDir - Base directory for resolution
262
+ * @returns Array of resolved file paths
263
+ */
264
+ async resolveSinglePattern(pattern, baseDir) {
265
+ if (this.isGlobPattern(pattern))
266
+ return this.resolveGlobPattern(pattern, baseDir);
267
+ let resolved = path.join(baseDir, pattern);
268
+ return await exists(resolved) ? [resolved] : [];
269
+ }
270
+ /**
271
+ * Check if pattern contains glob wildcards
272
+ *
273
+ * @param pattern - Pattern to check
274
+ * @returns True if pattern contains glob syntax
275
+ */
276
+ isGlobPattern(pattern) {
277
+ return pattern.includes("*") || pattern.includes("?") || pattern.includes("[");
278
+ }
279
+ /**
280
+ * Resolve glob pattern to matching files
281
+ *
282
+ * @param pattern - Glob pattern
283
+ * @param baseDir - Base directory
284
+ * @returns Array of matching file paths
285
+ */
286
+ async resolveGlobPattern(pattern, baseDir) {
287
+ let matches = [], parts = pattern.split("/"), globPart = parts.findIndex((p) => this.isGlobPattern(p));
288
+ if (globPart === -1)
289
+ return [path.join(baseDir, pattern)];
290
+ let dirPath = path.join(baseDir, ...parts.slice(0, globPart)), filePattern = parts.slice(globPart).join("/");
291
+ return await exists(dirPath) ? (await this.findMatchingFiles(dirPath, filePattern, baseDir, matches), matches) : [];
292
+ }
293
+ /**
294
+ * Recursively find files matching glob pattern
295
+ *
296
+ * Supports ** for recursive directory matching.
297
+ *
298
+ * @param dir - Current directory
299
+ * @param pattern - Pattern to match
300
+ * @param baseDir - Base directory for relative paths
301
+ * @param matches - Array to accumulate matches
302
+ */
303
+ async findMatchingFiles(dir, pattern, baseDir, matches) {
304
+ try {
305
+ let entries = await fs.readdir(dir, { withFileTypes: !0 });
306
+ for (let entry of entries) {
307
+ let fullPath = path.join(dir, entry.name), relativePath = path.relative(baseDir, fullPath);
308
+ entry.isDirectory() ? pattern.startsWith("**") || pattern.includes("/**/") ? await this.findMatchingFiles(fullPath, pattern, baseDir, matches) : pattern.includes("/") && await this.findMatchingFiles(fullPath, pattern, baseDir, matches) : entry.isFile() && minimatch(relativePath, pattern, { dot: !1 }) && matches.push(fullPath);
309
+ }
310
+ } catch (error) {
311
+ logger.debug(`Error reading directory ${dir}: ${error}`);
312
+ }
313
+ }
314
+ };
315
+
316
+ // ../core/src/core/flows/flow-executor.ts
317
+ var DefaultFlowExecutor = class {
318
+ constructor(transformRegistry) {
319
+ this.transformRegistry = transformRegistry || defaultTransformRegistry, this.sourceResolver = new SourcePatternResolver();
320
+ }
321
+ /**
322
+ * Execute a single flow (now supports glob patterns and switch expressions)
323
+ */
324
+ async executeFlow(flow, context) {
325
+ let startTime = Date.now();
326
+ try {
327
+ let resolvedFrom = flow.from;
328
+ if (this.isSwitchExpression(flow.from))
329
+ try {
330
+ resolvedFrom = resolveSwitchExpression(flow.from, context);
331
+ } catch (error) {
332
+ return {
333
+ source: "<switch expression>",
334
+ target: this.normalizeToPattern(flow.to),
335
+ success: !1,
336
+ transformed: !1,
337
+ error: error instanceof Error ? error : new Error(String(error)),
338
+ executionTime: Date.now() - startTime
339
+ };
340
+ }
341
+ let resolvedTo = flow.to;
342
+ if (this.isSwitchExpression(flow.to))
343
+ try {
344
+ resolvedTo = resolveSwitchExpression(flow.to, context);
345
+ } catch (error) {
346
+ return {
347
+ source: this.normalizeFromPattern(resolvedFrom),
348
+ target: "<switch expression>",
349
+ success: !1,
350
+ transformed: !1,
351
+ error: error instanceof Error ? error : new Error(String(error)),
352
+ executionTime: Date.now() - startTime
353
+ };
354
+ }
355
+ if (typeof resolvedTo != "string") {
356
+ let results2 = await this.executeMultiTarget({ ...flow, from: resolvedFrom, to: resolvedTo }, context);
357
+ return this.aggregateResults(results2, startTime);
358
+ }
359
+ let validation = this.validateFlow({ ...flow, from: resolvedFrom, to: resolvedTo });
360
+ if (!validation.valid)
361
+ return {
362
+ source: this.normalizeFromPattern(resolvedFrom),
363
+ target: resolvedTo,
364
+ success: !1,
365
+ transformed: !1,
366
+ error: new Error(`Invalid flow: ${validation.errors.map((e) => e.message).join(", ")}`),
367
+ executionTime: Date.now() - startTime
368
+ };
369
+ if (flow.when && !this.evaluateCondition(flow.when, context)) {
370
+ let normalized = this.normalizeFromPattern(resolvedFrom);
371
+ return logger.debug(`Flow skipped due to condition: ${normalized} -> ${resolvedTo}`), {
372
+ source: normalized,
373
+ target: resolvedTo,
374
+ success: !0,
375
+ transformed: !1,
376
+ warnings: ["Flow skipped due to condition"],
377
+ executionTime: Date.now() - startTime
378
+ };
379
+ }
380
+ let resolution = await this.resolveSourcePattern(resolvedFrom, context), sourcePaths = resolution.paths, resolutionWarnings = resolution.warnings;
381
+ if (sourcePaths.length === 0)
382
+ return {
383
+ source: this.normalizeFromPattern(resolvedFrom),
384
+ target: resolvedTo,
385
+ success: !0,
386
+ transformed: !1,
387
+ warnings: resolutionWarnings.length > 0 ? resolutionWarnings : ["No files matched pattern"],
388
+ executionTime: Date.now() - startTime
389
+ };
390
+ let results = [], firstFromPattern = this.getFirstPattern(resolvedFrom);
391
+ for (let sourcePath of sourcePaths) {
392
+ let targetPath = this.resolveTargetFromGlob(sourcePath, firstFromPattern, resolvedTo, context), result = await this.executePipeline(flow, sourcePath, targetPath, context);
393
+ results.push({
394
+ ...result,
395
+ executionTime: Date.now() - startTime
396
+ });
397
+ }
398
+ return resolutionWarnings.length > 0 && results.length > 0 && (results[0].warnings = [
399
+ ...results[0].warnings || [],
400
+ ...resolutionWarnings
401
+ ]), results.length === 1 ? results[0] : this.aggregateResults(results, startTime);
402
+ } catch (error) {
403
+ return {
404
+ source: this.isSwitchExpression(flow.from) ? "<switch>" : this.normalizeFromPattern(flow.from),
405
+ target: this.normalizeToPattern(flow.to),
406
+ success: !1,
407
+ transformed: !1,
408
+ error: error instanceof Error ? error : new Error(String(error)),
409
+ executionTime: Date.now() - startTime
410
+ };
411
+ }
412
+ }
413
+ /**
414
+ * Execute multiple flows
415
+ */
416
+ async executeFlows(flows, context) {
417
+ let results = [];
418
+ for (let flow of flows) {
419
+ let result = await this.executeFlow(flow, context);
420
+ results.push(result);
421
+ }
422
+ return results;
423
+ }
424
+ /**
425
+ * Execute a multi-target flow
426
+ */
427
+ async executeMultiTarget(flow, context) {
428
+ if (typeof flow.to == "string")
429
+ throw new Error("Flow is not a multi-target flow");
430
+ let multiTarget = flow.to, normalizedFrom = this.normalizeFromPattern(flow.from), resolution = await this.resolveSourcePattern(flow.from, context), sourcePaths = resolution.paths;
431
+ if (sourcePaths.length === 0)
432
+ return Object.keys(multiTarget).map((target) => ({
433
+ source: normalizedFrom,
434
+ target,
435
+ success: !0,
436
+ transformed: !1,
437
+ warnings: resolution.warnings.length > 0 ? resolution.warnings : ["No files matched pattern"]
438
+ }));
439
+ let allResults = [], firstFromPattern = this.getFirstPattern(flow.from);
440
+ for (let sourcePath of sourcePaths) {
441
+ let sourceContent = await this.loadSourceFile(sourcePath, context);
442
+ for (let [targetPath, targetFlow] of Object.entries(multiTarget)) {
443
+ let startTime = Date.now();
444
+ try {
445
+ let mergedFlow = {
446
+ ...flow,
447
+ ...targetFlow,
448
+ from: flow.from,
449
+ to: targetPath
450
+ };
451
+ if (mergedFlow.when && !this.evaluateCondition(mergedFlow.when, context)) {
452
+ logger.debug(`Multi-target flow skipped due to condition: ${normalizedFrom} -> ${targetPath}`), allResults.push({
453
+ source: normalizedFrom,
454
+ target: targetPath,
455
+ success: !0,
456
+ transformed: !1,
457
+ warnings: ["Flow skipped due to condition"],
458
+ executionTime: Date.now() - startTime
459
+ });
460
+ continue;
461
+ }
462
+ let resolvedTargetPath = this.resolveTargetFromGlob(sourcePath, firstFromPattern, targetPath, context), result = await this.executePipelineWithContent(
463
+ mergedFlow,
464
+ sourceContent,
465
+ sourcePath,
466
+ resolvedTargetPath,
467
+ context
468
+ );
469
+ allResults.push({
470
+ ...result,
471
+ executionTime: Date.now() - startTime
472
+ });
473
+ } catch (error) {
474
+ allResults.push({
475
+ source: normalizedFrom,
476
+ target: targetPath,
477
+ success: !1,
478
+ transformed: !1,
479
+ error: error instanceof Error ? error : new Error(String(error)),
480
+ executionTime: Date.now() - startTime
481
+ });
482
+ }
483
+ }
484
+ }
485
+ return allResults;
486
+ }
487
+ /**
488
+ * Validate a flow configuration
489
+ */
490
+ validateFlow(flow) {
491
+ let errors = [];
492
+ if (flow.from || errors.push({ message: 'Flow missing required field "from"', code: "MISSING_FROM" }), flow.to || errors.push({ message: 'Flow missing required field "to"', code: "MISSING_TO" }), flow.to && this.isSwitchExpression(flow.to)) {
493
+ let switchValidation = validateSwitchExpression(flow.to);
494
+ if (!switchValidation.valid)
495
+ for (let error of switchValidation.errors)
496
+ errors.push({
497
+ message: error,
498
+ code: "INVALID_SWITCH_EXPRESSION"
499
+ });
500
+ }
501
+ if (flow.pick && flow.omit && errors.push({ message: 'Flow cannot have both "pick" and "omit"', code: "CONFLICTING_FILTERS" }), flow.merge && !["deep", "shallow", "replace", "composite"].includes(flow.merge) && errors.push({
502
+ message: `Invalid merge strategy: ${flow.merge}. Must be one of: deep, shallow, replace, composite`,
503
+ code: "INVALID_MERGE"
504
+ }), flow.path)
505
+ try {
506
+ JSONPath({ path: flow.path, json: {} });
507
+ } catch {
508
+ errors.push({
509
+ message: `Invalid JSONPath expression: ${flow.path}`,
510
+ code: "INVALID_JSONPATH"
511
+ });
512
+ }
513
+ if (flow.map) {
514
+ let mapPipelineValidation = validateMapPipeline(flow.map);
515
+ if (!mapPipelineValidation.valid)
516
+ for (let error of mapPipelineValidation.errors)
517
+ errors.push({
518
+ message: error,
519
+ code: "INVALID_MAP_PIPELINE"
520
+ });
521
+ }
522
+ return {
523
+ valid: errors.length === 0,
524
+ errors,
525
+ warnings: []
526
+ };
527
+ }
528
+ /**
529
+ * Check if a value is a switch expression
530
+ */
531
+ isSwitchExpression(value) {
532
+ return typeof value == "object" && value !== null && "$switch" in value;
533
+ }
534
+ /**
535
+ * Execute the transformation pipeline
536
+ */
537
+ async executePipeline(flow, sourcePath, targetPath, context) {
538
+ if (!this.needsParsing(flow, sourcePath, targetPath, context))
539
+ return await this.executePassThroughCopy(flow, sourcePath, targetPath, context);
540
+ let sourceContent = await this.loadSourceFile(sourcePath, context);
541
+ return this.executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context);
542
+ }
543
+ /**
544
+ * Execute pipeline with pre-loaded content (for multi-target flows)
545
+ */
546
+ async executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context) {
547
+ let warnings = [], conflicts = [], data = sourceContent.data, transformed = !1;
548
+ try {
549
+ flow.path && (data = this.extractJSONPath(data, flow.path), transformed = !0), flow.pick ? (data = this.pickKeys(data, flow.pick), transformed = !0) : flow.omit && (data = this.omitKeys(data, flow.omit), transformed = !0);
550
+ let contributedKeys, schemaOps = [], pipeOps = [];
551
+ if (flow.map) {
552
+ let split = splitMapPipeline(flow.map);
553
+ if (schemaOps = split.schemaOps, pipeOps = split.pipeOps, schemaOps.length > 0) {
554
+ let mapContext = createMapContext({
555
+ filename: path2.basename(sourcePath, path2.extname(sourcePath)),
556
+ dirname: path2.basename(path2.dirname(sourcePath)),
557
+ path: path2.relative(context.packageRoot, sourcePath),
558
+ ext: path2.extname(sourcePath)
559
+ });
560
+ data && typeof data == "object" && "frontmatter" in data ? data.frontmatter = applyMapPipeline(
561
+ data.frontmatter,
562
+ schemaOps,
563
+ mapContext,
564
+ this.transformRegistry
565
+ ) : data = applyMapPipeline(
566
+ data,
567
+ schemaOps,
568
+ mapContext,
569
+ this.transformRegistry
570
+ ), transformed = !0;
571
+ }
572
+ }
573
+ if (!!flow.merge && flow.merge !== "replace" && flow.merge !== "composite" && typeof data == "object" && data !== null) {
574
+ let dataToExtract = data && "frontmatter" in data ? data.frontmatter : data;
575
+ typeof dataToExtract == "object" && dataToExtract !== null && (contributedKeys = extractAllKeys(dataToExtract));
576
+ }
577
+ let targetExists = await exists(targetPath);
578
+ if (flow.embed && (data = this.embedContent(data, flow.embed), transformed = !0), targetExists) {
579
+ let targetContent = await this.loadSourceFile(targetPath, context);
580
+ if (flow.merge === "composite") {
581
+ let sourceRaw = sourceContent.raw, targetRaw = targetContent.raw;
582
+ data = mergePackageContentIntoRootFile(targetRaw, context.packageName, sourceRaw), transformed = !0;
583
+ } else {
584
+ let mergeResult = this.mergeContent(
585
+ data,
586
+ targetContent.data,
587
+ flow.merge || "replace",
588
+ context
589
+ );
590
+ data = mergeResult.data, conflicts.push(...mergeResult.conflicts), mergeResult.conflicts.length > 0 && (transformed = !0);
591
+ }
592
+ }
593
+ if (pipeOps.length > 0) {
594
+ let mapContext = createMapContext({
595
+ filename: path2.basename(sourcePath, path2.extname(sourcePath)),
596
+ dirname: path2.basename(path2.dirname(sourcePath)),
597
+ path: path2.relative(context.packageRoot, sourcePath),
598
+ ext: path2.extname(sourcePath)
599
+ });
600
+ data && typeof data == "object" && "frontmatter" in data ? data.frontmatter = applyMapPipeline(
601
+ data.frontmatter,
602
+ pipeOps,
603
+ mapContext,
604
+ this.transformRegistry
605
+ ) : data = applyMapPipeline(
606
+ data,
607
+ pipeOps,
608
+ mapContext,
609
+ this.transformRegistry
610
+ ), transformed = !0;
611
+ }
612
+ return context.dryRun || await this.writeTargetFile(targetPath, data, sourceContent.format), {
613
+ source: sourcePath,
614
+ target: targetPath,
615
+ success: !0,
616
+ transformed,
617
+ keys: contributedKeys,
618
+ merge: flow.merge,
619
+ warnings: warnings.length > 0 ? warnings : void 0,
620
+ conflicts: conflicts.length > 0 ? conflicts : void 0,
621
+ pipeline: this.getPipeline(flow)
622
+ };
623
+ } catch (error) {
624
+ return {
625
+ source: sourcePath,
626
+ target: targetPath,
627
+ success: !1,
628
+ transformed,
629
+ error: error instanceof Error ? error : new Error(String(error)),
630
+ warnings: warnings.length > 0 ? warnings : void 0
631
+ };
632
+ }
633
+ }
634
+ /**
635
+ * Load and parse source file
636
+ */
637
+ async loadSourceFile(filePath, context) {
638
+ let raw = await readTextFile(filePath), format = this.detectFormat(filePath, raw);
639
+ return (format === "markdown" || format === "md") && context?.platform && context?.direction === "install" && (raw = mergeInlinePlatformOverride(raw, context.platform, context.workspaceRoot)), { data: this.parseSourceContent(raw, format), format, raw };
640
+ }
641
+ /**
642
+ * Write transformed content to target file
643
+ */
644
+ async writeTargetFile(filePath, content, sourceFormat) {
645
+ await ensureDir(path2.dirname(filePath));
646
+ let targetFormat = this.detectFormat(filePath, ""), serialized = this.serializeTargetContent(content, targetFormat);
647
+ await writeTextFile(filePath, serialized);
648
+ }
649
+ /**
650
+ * Determine if parsing is needed for this flow
651
+ * Returns false for simple pass-through copies with no transformations
652
+ */
653
+ needsParsing(flow, sourcePath, targetPath, context) {
654
+ if (flow.map || flow.pick || flow.omit || flow.path || flow.embed || flow.merge && (flow.merge === "deep" || flow.merge === "shallow"))
655
+ return !0;
656
+ let sourceExt = path2.extname(sourcePath).toLowerCase(), targetExt = path2.extname(targetPath).toLowerCase();
657
+ return !!(sourceExt !== targetExt && [".json", ".jsonc", ".yaml", ".yml", ".toml"].includes(sourceExt) || (sourceExt === ".md" || sourceExt === ".mdc" || sourceExt === ".markdown") && context.platform && context.direction === "install");
658
+ }
659
+ /**
660
+ * Execute a pass-through copy without parsing
661
+ * Used for simple file copies with no transformations
662
+ */
663
+ async executePassThroughCopy(flow, sourcePath, targetPath, context) {
664
+ let warnings = [];
665
+ try {
666
+ if (await exists(targetPath) && flow.merge && flow.merge !== "replace") {
667
+ logger.warn(`Pass-through copy attempted with merge strategy '${flow.merge}' - falling back to parsed pipeline`);
668
+ let sourceContent = await this.loadSourceFile(sourcePath, context);
669
+ return this.executePipelineWithContent(flow, sourceContent, sourcePath, targetPath, context);
670
+ }
671
+ if (!context.dryRun) {
672
+ await ensureDir(path2.dirname(targetPath));
673
+ let content = await fs2.readFile(sourcePath);
674
+ await fs2.writeFile(targetPath, content);
675
+ }
676
+ return {
677
+ source: sourcePath,
678
+ target: targetPath,
679
+ success: !0,
680
+ transformed: !1,
681
+ warnings: warnings.length > 0 ? warnings : void 0
682
+ };
683
+ } catch (error) {
684
+ return {
685
+ source: sourcePath,
686
+ target: targetPath,
687
+ success: !1,
688
+ transformed: !1,
689
+ error: error instanceof Error ? error : new Error(String(error)),
690
+ warnings: warnings.length > 0 ? warnings : void 0
691
+ };
692
+ }
693
+ }
694
+ /**
695
+ * Parse source content based on format
696
+ */
697
+ parseSourceContent(content, format) {
698
+ if (!content.trim())
699
+ switch (format) {
700
+ case "json":
701
+ case "jsonc":
702
+ case "yaml":
703
+ case "yml":
704
+ case "toml":
705
+ return {};
706
+ case "markdown":
707
+ case "md":
708
+ return { body: "" };
709
+ case "text":
710
+ case "txt":
711
+ default:
712
+ return content;
713
+ }
714
+ try {
715
+ switch (format) {
716
+ case "json":
717
+ case "jsonc":
718
+ let cleaned = content;
719
+ if (format === "jsonc") {
720
+ let parsed = parseJsonc(cleaned);
721
+ if (parsed === void 0)
722
+ throw new Error("jsonc-parser returned undefined");
723
+ return parsed;
724
+ }
725
+ return JSON.parse(cleaned);
726
+ case "yaml":
727
+ case "yml":
728
+ return yaml.load(content);
729
+ case "toml":
730
+ try {
731
+ return TOML.parse(content);
732
+ } catch (error) {
733
+ throw new Error(`TOML parse error: ${error instanceof Error ? error.message : String(error)}`);
734
+ }
735
+ case "markdown":
736
+ case "md":
737
+ return this.parseMarkdown(content);
738
+ case "text":
739
+ case "txt":
740
+ default:
741
+ return content;
742
+ }
743
+ } catch (error) {
744
+ throw new Error(`Failed to parse ${format} content: ${error instanceof Error ? error.message : String(error)}`);
745
+ }
746
+ }
747
+ /**
748
+ * Serialize content to target format
749
+ */
750
+ serializeTargetContent(content, format) {
751
+ try {
752
+ switch (format) {
753
+ case "json":
754
+ case "jsonc":
755
+ return JSON.stringify(content, null, 2);
756
+ case "yaml":
757
+ case "yml":
758
+ return yaml.dump(content, { indent: 2, flowLevel: -1, lineWidth: -1 });
759
+ case "toml":
760
+ if (typeof content == "string")
761
+ return content;
762
+ try {
763
+ let toml = TOML.stringify(content);
764
+ return content && typeof content == "object" && content.mcp_servers && (toml = this.applyCodexTomlFormatting(toml)), toml;
765
+ } catch (error) {
766
+ throw new Error(`TOML stringify error: ${error instanceof Error ? error.message : String(error)}`);
767
+ }
768
+ case "markdown":
769
+ case "md":
770
+ return this.serializeMarkdown(content);
771
+ case "text":
772
+ case "txt":
773
+ default:
774
+ return typeof content == "string" ? content : JSON.stringify(content, null, 2);
775
+ }
776
+ } catch (error) {
777
+ throw new Error(`Failed to serialize ${format} content: ${error instanceof Error ? error.message : String(error)}`);
778
+ }
779
+ }
780
+ /**
781
+ * Detect format from file extension or content
782
+ */
783
+ detectFormat(filePath, content) {
784
+ let ext = path2.extname(filePath).toLowerCase(), extMap = {
785
+ ".json": "json",
786
+ ".jsonc": "jsonc",
787
+ ".yaml": "yaml",
788
+ ".yml": "yml",
789
+ ".toml": "toml",
790
+ ".md": "markdown",
791
+ ".mdc": "markdown",
792
+ ".markdown": "markdown",
793
+ ".txt": "text"
794
+ };
795
+ return extMap[ext] ? extMap[ext] : content.trim().startsWith("{") || content.trim().startsWith("[") ? content.includes("//") || content.includes("/*") ? "jsonc" : "json" : content.includes(`---
796
+ `) || content.includes(`
797
+ ---
798
+ `) ? "markdown" : "text";
799
+ }
800
+ /**
801
+ * Extract data using JSONPath
802
+ */
803
+ extractJSONPath(data, jsonPath) {
804
+ try {
805
+ let result = JSONPath({ path: jsonPath, json: data });
806
+ return result.length === 1 ? result[0] : result;
807
+ } catch (error) {
808
+ throw new Error(`JSONPath extraction failed: ${error instanceof Error ? error.message : String(error)}`);
809
+ }
810
+ }
811
+ /**
812
+ * Pick specified keys
813
+ */
814
+ pickKeys(data, keys) {
815
+ if (typeof data != "object" || data === null)
816
+ return data;
817
+ let result = Array.isArray(data) ? [] : {};
818
+ for (let key of keys)
819
+ key.includes(".") ? this.setNestedValue(result, key, this.getNestedValue(data, key)) : key in data && (result[key] = data[key]);
820
+ return result;
821
+ }
822
+ /**
823
+ * Omit specified keys
824
+ */
825
+ omitKeys(data, keys) {
826
+ if (typeof data != "object" || data === null)
827
+ return data;
828
+ let result = Array.isArray(data) ? [...data] : { ...data };
829
+ for (let key of keys)
830
+ key.includes(".") ? this.deleteNestedValue(result, key) : delete result[key];
831
+ return result;
832
+ }
833
+ /**
834
+ * Apply pipe transforms
835
+ */
836
+ async applyPipeTransforms(data, transforms, context) {
837
+ let result = data;
838
+ for (let transformSpec of transforms)
839
+ try {
840
+ let { name, options } = this.parseTransformSpec(transformSpec);
841
+ logger.debug(`Applying transform: ${name}`, options), result = this.transformRegistry.execute(name, result, options);
842
+ } catch (error) {
843
+ throw new Error(`Transform '${transformSpec}' failed: ${error instanceof Error ? error.message : String(error)}`);
844
+ }
845
+ return result;
846
+ }
847
+ /**
848
+ * Parse transform specification
849
+ * Examples: "trim", "number", "pick-keys(keys=[a,b,c])"
850
+ */
851
+ parseTransformSpec(spec) {
852
+ let match = spec.match(/^([a-z-]+)(?:\((.+)\))?$/);
853
+ if (!match)
854
+ throw new Error(`Invalid transform specification: ${spec}`);
855
+ let [, name, optionsStr] = match;
856
+ if (!optionsStr)
857
+ return { name };
858
+ let options = {}, pairs = optionsStr.split(",").map((s) => s.trim());
859
+ for (let pair of pairs) {
860
+ let [key, value] = pair.split("=").map((s) => s.trim());
861
+ value.startsWith("[") && value.endsWith("]") ? options[key] = value.slice(1, -1).split(",").map((s) => s.trim()) : value === "true" || value === "false" ? options[key] = value === "true" : isNaN(Number(value)) ? options[key] = value : options[key] = Number(value);
862
+ }
863
+ return { name, options };
864
+ }
865
+ /**
866
+ * Embed content under a key
867
+ */
868
+ embedContent(data, key) {
869
+ return { [key]: data };
870
+ }
871
+ /**
872
+ * Merge content with priority-based conflict resolution
873
+ */
874
+ mergeContent(source, target, strategy, context) {
875
+ let conflicts = [], merged;
876
+ switch (strategy) {
877
+ case "replace":
878
+ merged = source;
879
+ break;
880
+ case "shallow":
881
+ merged = { ...target, ...source };
882
+ break;
883
+ case "deep":
884
+ merged = this.deepMerge(target, source, conflicts, context);
885
+ break;
886
+ case "composite":
887
+ merged = source;
888
+ break;
889
+ default:
890
+ merged = source;
891
+ }
892
+ return { data: merged, conflicts };
893
+ }
894
+ /**
895
+ * Deep merge two objects
896
+ */
897
+ deepMerge(target, source, conflicts, context, keyPath = "") {
898
+ if (typeof source != "object" || source === null || typeof target != "object" || target === null)
899
+ return source;
900
+ if (Array.isArray(source) && Array.isArray(target))
901
+ return [...target, ...source];
902
+ let result = { ...target };
903
+ for (let key of Object.keys(source)) {
904
+ let currentPath = keyPath ? `${keyPath}.${key}` : key;
905
+ key in target ? typeof source[key] == "object" && typeof target[key] == "object" ? result[key] = this.deepMerge(target[key], source[key], conflicts, context, currentPath) : source[key] !== target[key] && (conflicts.push({
906
+ path: currentPath,
907
+ winner: context.packageName,
908
+ losers: ["existing"],
909
+ type: "value",
910
+ resolution: "last-writer-wins"
911
+ }), result[key] = source[key]) : result[key] = source[key];
912
+ }
913
+ return result;
914
+ }
915
+ /**
916
+ * Evaluate condition
917
+ */
918
+ evaluateCondition(condition, context) {
919
+ if (condition.and)
920
+ return condition.and.every((c) => this.evaluateCondition(c, context));
921
+ if (condition.or)
922
+ return condition.or.some((c) => this.evaluateCondition(c, context));
923
+ if (condition.not)
924
+ return !this.evaluateCondition(condition.not, context);
925
+ if (condition.$eq) {
926
+ let [left, right] = condition.$eq, leftVal = this.resolveValue(left, context), rightVal = this.resolveValue(right, context);
927
+ return smartEquals(leftVal, rightVal);
928
+ }
929
+ if (condition.$ne) {
930
+ let [left, right] = condition.$ne, leftVal = this.resolveValue(left, context), rightVal = this.resolveValue(right, context);
931
+ return smartNotEquals(leftVal, rightVal);
932
+ }
933
+ if (condition.exists) {
934
+ let testPath = path2.join(context.workspaceRoot, condition.exists);
935
+ return fsSync.existsSync(testPath);
936
+ }
937
+ return condition.platform ? context.platform === condition.platform : !0;
938
+ }
939
+ /**
940
+ * Resolve a value, handling $$variable references
941
+ */
942
+ resolveValue(value, context) {
943
+ if (value.startsWith("$$")) {
944
+ let varName = value.slice(2);
945
+ return context.variables[varName];
946
+ }
947
+ return value;
948
+ }
949
+ /**
950
+ * Resolve pattern with glob support and priority-based array matching
951
+ * Returns resolved file paths (glob patterns return multiple files)
952
+ */
953
+ async resolveSourcePattern(pattern, context) {
954
+ if (this.isSwitchExpression(pattern))
955
+ throw new Error("Cannot resolve SwitchExpression - expression must be resolved first");
956
+ let narrowedPattern = pattern, result = await this.sourceResolver.resolve(narrowedPattern, {
957
+ baseDir: context.packageRoot,
958
+ logWarnings: !0
959
+ });
960
+ return {
961
+ paths: result.paths,
962
+ warnings: result.warnings
963
+ };
964
+ }
965
+ /**
966
+ * Resolve target path from source path and patterns
967
+ * Handles single-level (*) and recursive (**) globs
968
+ * Strips platform suffixes from filenames (e.g. read-specs.claude.md -> read-specs.md)
969
+ */
970
+ resolveTargetFromGlob(sourcePath, fromPattern, toPattern, context) {
971
+ let relativePath = path2.relative(context.packageRoot, sourcePath);
972
+ if (toPattern.includes("*")) {
973
+ if (toPattern.includes("**")) {
974
+ let targetRel = resolveRecursiveGlobTargetRelativePath(
975
+ relativePath,
976
+ fromPattern,
977
+ toPattern
978
+ );
979
+ return path2.join(context.workspaceRoot, targetRel);
980
+ }
981
+ let sourceFileName = path2.basename(sourcePath), sourceExt = path2.extname(sourcePath), sourceBase = path2.basename(sourcePath, sourceExt), toParts = toPattern.split("*"), toPrefix = toParts[0], toSuffix = toParts[1] || "", targetExt = toSuffix.startsWith(".") ? toSuffix : sourceExt + toSuffix, targetFileName = sourceBase + targetExt, strippedTargetFileName = stripPlatformSuffixFromFilename(targetFileName), resolvedTo = toPrefix + strippedTargetFileName;
982
+ return path2.join(context.workspaceRoot, resolvedTo);
983
+ }
984
+ return path2.join(context.workspaceRoot, toPattern);
985
+ }
986
+ /**
987
+ * Get pipeline description
988
+ */
989
+ getPipeline(flow) {
990
+ let pipeline = ["load"];
991
+ return flow.path && pipeline.push("extract"), flow.pick && pipeline.push("pick"), flow.omit && pipeline.push("omit"), flow.map && pipeline.push("map"), flow.embed && pipeline.push("embed"), flow.merge && pipeline.push(`merge:${flow.merge}`), pipeline.push("write"), pipeline;
992
+ }
993
+ /**
994
+ * Normalize from pattern for display in results
995
+ * Converts array to comma-separated string
996
+ */
997
+ normalizeFromPattern(pattern) {
998
+ if (this.isSwitchExpression(pattern))
999
+ return "<switch>";
1000
+ let narrowedPattern = pattern;
1001
+ return Array.isArray(narrowedPattern) ? narrowedPattern.join(", ") : narrowedPattern;
1002
+ }
1003
+ /**
1004
+ * Normalize to pattern for display in results
1005
+ * Handles string, multi-target, and switch expressions
1006
+ */
1007
+ normalizeToPattern(pattern) {
1008
+ return typeof pattern == "string" ? pattern : this.isSwitchExpression(pattern) ? "<switch>" : Object.keys(pattern).join(", ");
1009
+ }
1010
+ /**
1011
+ * Get the first pattern from a pattern or array of patterns
1012
+ * Used for path resolution when multiple sources are specified
1013
+ */
1014
+ getFirstPattern(pattern) {
1015
+ if (this.isSwitchExpression(pattern))
1016
+ throw new Error("Cannot get first pattern from SwitchExpression - expression must be resolved first");
1017
+ let narrowedPattern = pattern;
1018
+ return Array.isArray(narrowedPattern) ? narrowedPattern[0] : narrowedPattern;
1019
+ }
1020
+ /**
1021
+ * Aggregate multi-target results
1022
+ */
1023
+ aggregateResults(results, startTime) {
1024
+ let successful = results.filter((r) => r.success), failed = results.filter((r) => !r.success);
1025
+ return failed.length > 0 ? {
1026
+ source: results[0]?.source || "",
1027
+ target: results.map((r) => r.target).join(", "),
1028
+ success: !1,
1029
+ transformed: results.some((r) => r.transformed),
1030
+ error: failed[0]?.error,
1031
+ warnings: results.flatMap((r) => r.warnings || []),
1032
+ executionTime: Date.now() - startTime
1033
+ } : {
1034
+ source: results[0]?.source || "",
1035
+ target: results.flatMap((r) => typeof r.target == "string" ? [r.target] : r.target),
1036
+ success: !0,
1037
+ transformed: results.some((r) => r.transformed),
1038
+ warnings: results.flatMap((r) => r.warnings || []),
1039
+ conflicts: results.flatMap((r) => r.conflicts || []),
1040
+ executionTime: Date.now() - startTime
1041
+ };
1042
+ }
1043
+ /**
1044
+ * Parse markdown with frontmatter
1045
+ */
1046
+ parseMarkdown(content) {
1047
+ return parseMarkdownDocument(content);
1048
+ }
1049
+ /**
1050
+ * Serialize markdown with frontmatter
1051
+ */
1052
+ serializeMarkdown(content) {
1053
+ return serializeMarkdownDocument(content);
1054
+ }
1055
+ /**
1056
+ * Strip JSON comments
1057
+ */
1058
+ stripJSONComments(content) {
1059
+ let result = content.replace(/\/\/.*$/gm, "");
1060
+ return result = result.replace(/\/\*[\s\S]*?\*\//g, ""), result;
1061
+ }
1062
+ /**
1063
+ * Get nested value using dot notation (delegates to key mapper)
1064
+ */
1065
+ getNestedValue(obj, path3) {
1066
+ return getNestedValue(obj, path3);
1067
+ }
1068
+ /**
1069
+ * Set nested value using dot notation (delegates to key mapper)
1070
+ */
1071
+ setNestedValue(obj, path3, value) {
1072
+ setNestedValue(obj, path3, value);
1073
+ }
1074
+ /**
1075
+ * Delete nested value using dot notation (delegates to key mapper)
1076
+ */
1077
+ deleteNestedValue(obj, path3) {
1078
+ deleteNestedValue(obj, path3);
1079
+ }
1080
+ /**
1081
+ * Apply Codex-specific TOML formatting
1082
+ * Converts nested table sections to inline format for http_headers and env_http_headers
1083
+ */
1084
+ applyCodexTomlFormatting(toml) {
1085
+ let inlineKeys = ["http_headers", "env_http_headers"], result = toml;
1086
+ for (let key of inlineKeys) {
1087
+ let pattern = new RegExp(
1088
+ `\\[([\\w-]+(?:\\.[\\w-]+|\\."[^"]+")*)?\\.${key}\\]\\s*\\n([\\s\\S]*?)(?=\\n\\[|\\n*$)`,
1089
+ "g"
1090
+ );
1091
+ result = result.replace(pattern, (match, parentPath, content) => {
1092
+ let pairs = [], lines = content.trim().split(`
1093
+ `);
1094
+ for (let line of lines) {
1095
+ let trimmed = line.trim();
1096
+ if (!trimmed || trimmed.startsWith("#")) continue;
1097
+ let kvMatch = trimmed.match(/^([\w-]+)\s*=\s*(.+)$/);
1098
+ if (kvMatch) {
1099
+ let [, k, v] = kvMatch;
1100
+ pairs.push(`"${k}" = ${v}`);
1101
+ }
1102
+ }
1103
+ if (pairs.length === 0) return match;
1104
+ let inlineTable = `{ ${pairs.join(", ")} }`;
1105
+ return `${key} = ${inlineTable}`;
1106
+ });
1107
+ }
1108
+ return result;
1109
+ }
1110
+ };
1111
+ function createFlowExecutor() {
1112
+ return new DefaultFlowExecutor();
1113
+ }
1114
+
1115
+ export {
1116
+ calculateFileHash,
1117
+ mergePackageContentIntoRootFile,
1118
+ resolveRecursiveGlobTargetRelativePath,
1119
+ createFlowExecutor
1120
+ };
1121
+ //# sourceMappingURL=chunk-WT4VVCXM.js.map