@keystrokehq/cli 0.0.0-staging-20260714051854

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 (253) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +272 -0
  3. package/dist/alias-RTYYYW3D-CLFgrowj.mjs +98 -0
  4. package/dist/alias-RTYYYW3D-CLFgrowj.mjs.map +1 -0
  5. package/dist/awk2-LA3USKJP-BbsfXVlR.mjs +2737 -0
  6. package/dist/awk2-LA3USKJP-BbsfXVlR.mjs.map +1 -0
  7. package/dist/base64-C2AIWVNC-C0WIgu5V.mjs +123 -0
  8. package/dist/base64-C2AIWVNC-C0WIgu5V.mjs.map +1 -0
  9. package/dist/basename-UB3CIYNI-BgNN3bGm.mjs +53 -0
  10. package/dist/basename-UB3CIYNI-BgNN3bGm.mjs.map +1 -0
  11. package/dist/bash-YZ33HQZQ-N6YyKtUH.mjs +118 -0
  12. package/dist/bash-YZ33HQZQ-N6YyKtUH.mjs.map +1 -0
  13. package/dist/cat-TSFMZVYS-Dz3-oHsV.mjs +63 -0
  14. package/dist/cat-TSFMZVYS-Dz3-oHsV.mjs.map +1 -0
  15. package/dist/chmod-TFEPA42X-YF02QJUv.mjs +125 -0
  16. package/dist/chmod-TFEPA42X-YF02QJUv.mjs.map +1 -0
  17. package/dist/chunk-27JIFWUR-B6ZjjMMI.mjs +100 -0
  18. package/dist/chunk-27JIFWUR-B6ZjjMMI.mjs.map +1 -0
  19. package/dist/chunk-4I3HOE5Z-BixWWVkW.mjs +719 -0
  20. package/dist/chunk-4I3HOE5Z-BixWWVkW.mjs.map +1 -0
  21. package/dist/chunk-4RUAZWKT-D60fyWAB.mjs +22543 -0
  22. package/dist/chunk-4RUAZWKT-D60fyWAB.mjs.map +1 -0
  23. package/dist/chunk-4WKZNNJK-CiwxAWRf.mjs +69 -0
  24. package/dist/chunk-4WKZNNJK-CiwxAWRf.mjs.map +1 -0
  25. package/dist/chunk-5H5SCKJM-BvfXlL01.mjs +606 -0
  26. package/dist/chunk-5H5SCKJM-BvfXlL01.mjs.map +1 -0
  27. package/dist/chunk-AQ6FYS2X-CkVetjym.mjs +37 -0
  28. package/dist/chunk-AQ6FYS2X-CkVetjym.mjs.map +1 -0
  29. package/dist/chunk-BZUGFHVS-CPWRFwK8.mjs +34 -0
  30. package/dist/chunk-BZUGFHVS-CPWRFwK8.mjs.map +1 -0
  31. package/dist/chunk-CHFEPBH4-BUdgjFtD.mjs +594 -0
  32. package/dist/chunk-CHFEPBH4-BUdgjFtD.mjs.map +1 -0
  33. package/dist/chunk-DLL7UR66-BUYgzxnR.mjs +14 -0
  34. package/dist/chunk-DLL7UR66-BUYgzxnR.mjs.map +1 -0
  35. package/dist/chunk-DiodbrVj.mjs +27 -0
  36. package/dist/chunk-EBAPSGAO-Ctfslw2R.mjs +247 -0
  37. package/dist/chunk-EBAPSGAO-Ctfslw2R.mjs.map +1 -0
  38. package/dist/chunk-FOCWZZDE-BIntqBh2.mjs +19 -0
  39. package/dist/chunk-FOCWZZDE-BIntqBh2.mjs.map +1 -0
  40. package/dist/chunk-HBVMHTO5-CJyD-QZX.mjs +10 -0
  41. package/dist/chunk-HBVMHTO5-CJyD-QZX.mjs.map +1 -0
  42. package/dist/chunk-L2UW7DWF-B3tEHhPF.mjs +14 -0
  43. package/dist/chunk-L2UW7DWF-B3tEHhPF.mjs.map +1 -0
  44. package/dist/chunk-L64BMZUV-CyR7RKok.mjs +30 -0
  45. package/dist/chunk-L64BMZUV-CyR7RKok.mjs.map +1 -0
  46. package/dist/chunk-LEKBROJD-CJMrAyu9.mjs +3113 -0
  47. package/dist/chunk-LEKBROJD-CJMrAyu9.mjs.map +1 -0
  48. package/dist/chunk-NRSASXYY-CuWyREpD.mjs +41 -0
  49. package/dist/chunk-NRSASXYY-CuWyREpD.mjs.map +1 -0
  50. package/dist/chunk-QAYAQNCG-Bl0Kbd53.mjs +63 -0
  51. package/dist/chunk-QAYAQNCG-Bl0Kbd53.mjs.map +1 -0
  52. package/dist/chunk-QIQMJJZ4-BwKdslXs.mjs +93 -0
  53. package/dist/chunk-QIQMJJZ4-BwKdslXs.mjs.map +1 -0
  54. package/dist/chunk-SAI2SPQQ-CVRoDNs9.mjs +26 -0
  55. package/dist/chunk-SAI2SPQQ-CVRoDNs9.mjs.map +1 -0
  56. package/dist/chunk-SO6R3ZKN-tTw_RMDX.mjs +140 -0
  57. package/dist/chunk-SO6R3ZKN-tTw_RMDX.mjs.map +1 -0
  58. package/dist/chunk-STHBFACM-lyj-j2a-.mjs +8 -0
  59. package/dist/chunk-STHBFACM-lyj-j2a-.mjs.map +1 -0
  60. package/dist/chunk-SX2HC7SO-Cc4Hpis1.mjs +20 -0
  61. package/dist/chunk-SX2HC7SO-Cc4Hpis1.mjs.map +1 -0
  62. package/dist/chunk-TDD4NFYE-wsWW75MX.mjs +21 -0
  63. package/dist/chunk-TDD4NFYE-wsWW75MX.mjs.map +1 -0
  64. package/dist/chunk-TN7HHBQW-CSB_R-XD.mjs +1137 -0
  65. package/dist/chunk-TN7HHBQW-CSB_R-XD.mjs.map +1 -0
  66. package/dist/chunk-VPADYNBD-BKlA28GJ.mjs +122 -0
  67. package/dist/chunk-VPADYNBD-BKlA28GJ.mjs.map +1 -0
  68. package/dist/chunk-W5DWRFSU-lCyWk0ph.mjs +11 -0
  69. package/dist/chunk-W5DWRFSU-lCyWk0ph.mjs.map +1 -0
  70. package/dist/chunk-WNH3HOQA-BCZUOjCJ.mjs +34 -0
  71. package/dist/chunk-WNH3HOQA-BCZUOjCJ.mjs.map +1 -0
  72. package/dist/chunk-XRFHFXFP-BGxzVZgK.mjs +16 -0
  73. package/dist/chunk-XRFHFXFP-BGxzVZgK.mjs.map +1 -0
  74. package/dist/chunk-YCLFEX4T-COc1AThz.mjs +77 -0
  75. package/dist/chunk-YCLFEX4T-COc1AThz.mjs.map +1 -0
  76. package/dist/clear-HKGFEOF6-CekN2x-O.mjs +28 -0
  77. package/dist/clear-HKGFEOF6-CekN2x-O.mjs.map +1 -0
  78. package/dist/column-XT6UFXNQ-DHENV9D2.mjs +143 -0
  79. package/dist/column-XT6UFXNQ-DHENV9D2.mjs.map +1 -0
  80. package/dist/comm-VV2LDX2J-ppxDJFkY.mjs +87 -0
  81. package/dist/comm-VV2LDX2J-ppxDJFkY.mjs.map +1 -0
  82. package/dist/configs/oxlintrc.json +27 -0
  83. package/dist/configs/vitest.config.mjs +42 -0
  84. package/dist/configs/vitest.setup.integration.mjs +37 -0
  85. package/dist/cp-BISAAS7A-CMWayU4n.mjs +106 -0
  86. package/dist/cp-BISAAS7A-CMWayU4n.mjs.map +1 -0
  87. package/dist/cut-OKARJCCV-Bt8b58eI.mjs +119 -0
  88. package/dist/cut-OKARJCCV-Bt8b58eI.mjs.map +1 -0
  89. package/dist/date-UUUPW43J-B7T5OTZZ.mjs +188 -0
  90. package/dist/date-UUUPW43J-B7T5OTZZ.mjs.map +1 -0
  91. package/dist/diff-MWJFIG7X-DhnPc_5r.mjs +755 -0
  92. package/dist/diff-MWJFIG7X-DhnPc_5r.mjs.map +1 -0
  93. package/dist/dirname-MPHRFUTI-Dkb3S4OX.mjs +43 -0
  94. package/dist/dirname-MPHRFUTI-Dkb3S4OX.mjs.map +1 -0
  95. package/dist/dist-BFOvwXwm.mjs +31042 -0
  96. package/dist/dist-BFOvwXwm.mjs.map +1 -0
  97. package/dist/dist-BoZPZ9Sz.mjs +8498 -0
  98. package/dist/dist-BoZPZ9Sz.mjs.map +1 -0
  99. package/dist/dist-D9y3OVoD.mjs +3 -0
  100. package/dist/dist-De18Uq1U.mjs +11680 -0
  101. package/dist/dist-De18Uq1U.mjs.map +1 -0
  102. package/dist/dist-yDNd8kGO.mjs +801 -0
  103. package/dist/dist-yDNd8kGO.mjs.map +1 -0
  104. package/dist/du-572XNP42-ClP4jXB1.mjs +176 -0
  105. package/dist/du-572XNP42-ClP4jXB1.mjs.map +1 -0
  106. package/dist/echo-NDWZZHPO-CCp_-MxA.mjs +137 -0
  107. package/dist/echo-NDWZZHPO-CCp_-MxA.mjs.map +1 -0
  108. package/dist/env-36M5BO7M-CsP_aiWr.mjs +119 -0
  109. package/dist/env-36M5BO7M-CsP_aiWr.mjs.map +1 -0
  110. package/dist/expand-JSPG6VOP-B-YUvYpu.mjs +145 -0
  111. package/dist/expand-JSPG6VOP-B-YUvYpu.mjs.map +1 -0
  112. package/dist/expr-5JAACS4X-1TBq84gG.mjs +153 -0
  113. package/dist/expr-5JAACS4X-1TBq84gG.mjs.map +1 -0
  114. package/dist/file-IPZJC3FQ-DcZNOWyY.mjs +4201 -0
  115. package/dist/file-IPZJC3FQ-DcZNOWyY.mjs.map +1 -0
  116. package/dist/find-INTH3OLC-6p47KeeT.mjs +1332 -0
  117. package/dist/find-INTH3OLC-6p47KeeT.mjs.map +1 -0
  118. package/dist/fold-4TQNYMSW-C54bHzLd.mjs +138 -0
  119. package/dist/fold-4TQNYMSW-C54bHzLd.mjs.map +1 -0
  120. package/dist/grep-V3LQVMRQ-D99Bq7Kj.mjs +335 -0
  121. package/dist/grep-V3LQVMRQ-D99Bq7Kj.mjs.map +1 -0
  122. package/dist/gzip-O5ASJAFY-CZDRROqP.mjs +592 -0
  123. package/dist/gzip-O5ASJAFY-CZDRROqP.mjs.map +1 -0
  124. package/dist/head-442HYESI-D96RMdki.mjs +36 -0
  125. package/dist/head-442HYESI-D96RMdki.mjs.map +1 -0
  126. package/dist/help-HZ6M2CKN--DK8mY2L.mjs +123 -0
  127. package/dist/help-HZ6M2CKN--DK8mY2L.mjs.map +1 -0
  128. package/dist/history-WYYKSLSZ-ACNQVupn.mjs +48 -0
  129. package/dist/history-WYYKSLSZ-ACNQVupn.mjs.map +1 -0
  130. package/dist/hostname-C4HQXXUP-CXVVFkUK.mjs +24 -0
  131. package/dist/hostname-C4HQXXUP-CXVVFkUK.mjs.map +1 -0
  132. package/dist/html-to-markdown-JW4MSQZO-DQOxFIvF.mjs +15890 -0
  133. package/dist/html-to-markdown-JW4MSQZO-DQOxFIvF.mjs.map +1 -0
  134. package/dist/index.mjs +9675 -0
  135. package/dist/index.mjs.map +1 -0
  136. package/dist/join-TBRGI3LQ-B8I9tkJ5.mjs +198 -0
  137. package/dist/join-TBRGI3LQ-B8I9tkJ5.mjs.map +1 -0
  138. package/dist/jq-4XLYLOS5-wFZYfsfJ.mjs +257 -0
  139. package/dist/jq-4XLYLOS5-wFZYfsfJ.mjs.map +1 -0
  140. package/dist/js-exec-N5KEZBH7-CoRL1IOd.mjs +333 -0
  141. package/dist/js-exec-N5KEZBH7-CoRL1IOd.mjs.map +1 -0
  142. package/dist/lib-D4GpdNNK.mjs +45 -0
  143. package/dist/lib-D4GpdNNK.mjs.map +1 -0
  144. package/dist/ln-4LGSXXGD-Dg0R9i5G.mjs +101 -0
  145. package/dist/ln-4LGSXXGD-Dg0R9i5G.mjs.map +1 -0
  146. package/dist/ls-ZJGQER7M-DLDSfI4x.mjs +1891 -0
  147. package/dist/ls-ZJGQER7M-DLDSfI4x.mjs.map +1 -0
  148. package/dist/lzma-CTMDi254.mjs +1135 -0
  149. package/dist/lzma-CTMDi254.mjs.map +1 -0
  150. package/dist/maybe-auto-update-C-HUlgKp.mjs +139 -0
  151. package/dist/maybe-auto-update-C-HUlgKp.mjs.map +1 -0
  152. package/dist/md5sum-SPU24VSG-DQc8sqXO.mjs +16 -0
  153. package/dist/md5sum-SPU24VSG-DQc8sqXO.mjs.map +1 -0
  154. package/dist/mkdir-MEPGZOB6-BjUKzhdL.mjs +58 -0
  155. package/dist/mkdir-MEPGZOB6-BjUKzhdL.mjs.map +1 -0
  156. package/dist/mv-W5BIQ646-CdSIyY-U.mjs +93 -0
  157. package/dist/mv-W5BIQ646-CdSIyY-U.mjs.map +1 -0
  158. package/dist/nl-WSDW7I4O-DmtCnyKU.mjs +208 -0
  159. package/dist/nl-WSDW7I4O-DmtCnyKU.mjs.map +1 -0
  160. package/dist/od-WOKFDJTP-DZ2nxQNJ.mjs +73 -0
  161. package/dist/od-WOKFDJTP-DZ2nxQNJ.mjs.map +1 -0
  162. package/dist/paste-7JC6S4DX-CtmM5Qy8.mjs +113 -0
  163. package/dist/paste-7JC6S4DX-CtmM5Qy8.mjs.map +1 -0
  164. package/dist/printf-TWGXF445-B7cTysaa.mjs +880 -0
  165. package/dist/printf-TWGXF445-B7cTysaa.mjs.map +1 -0
  166. package/dist/pwd-WE6EN5AV-CO8o2WQS.mjs +34 -0
  167. package/dist/pwd-WE6EN5AV-CO8o2WQS.mjs.map +1 -0
  168. package/dist/python3-POMOR4OA-CKy80mpF.mjs +299 -0
  169. package/dist/python3-POMOR4OA-CKy80mpF.mjs.map +1 -0
  170. package/dist/readlink-OPJF4DL5-Rc1Mz_Xx.mjs +76 -0
  171. package/dist/readlink-OPJF4DL5-Rc1Mz_Xx.mjs.map +1 -0
  172. package/dist/rev-5EHFX4EJ-3dd9vwHW.mjs +66 -0
  173. package/dist/rev-5EHFX4EJ-3dd9vwHW.mjs.map +1 -0
  174. package/dist/rg-S4FXYXWB-BbXVo6JX.mjs +1539 -0
  175. package/dist/rg-S4FXYXWB-BbXVo6JX.mjs.map +1 -0
  176. package/dist/rm-SSGETQVQ-Ch53Rmrr.mjs +81 -0
  177. package/dist/rm-SSGETQVQ-Ch53Rmrr.mjs.map +1 -0
  178. package/dist/rmdir-OC4ZLPYA-D3QCHlIB.mjs +132 -0
  179. package/dist/rmdir-OC4ZLPYA-D3QCHlIB.mjs.map +1 -0
  180. package/dist/run-package-manager-update-D_jU5wZe.mjs +457 -0
  181. package/dist/run-package-manager-update-D_jU5wZe.mjs.map +1 -0
  182. package/dist/sed-S5UIK574-DE1KeTk3.mjs +1722 -0
  183. package/dist/sed-S5UIK574-DE1KeTk3.mjs.map +1 -0
  184. package/dist/seq-M5EC7Q57-BHfGjQvK.mjs +85 -0
  185. package/dist/seq-M5EC7Q57-BHfGjQvK.mjs.map +1 -0
  186. package/dist/sha1sum-2PTOAFR6-DNjSNcYK.mjs +16 -0
  187. package/dist/sha1sum-2PTOAFR6-DNjSNcYK.mjs.map +1 -0
  188. package/dist/sha256sum-NS7D3IXX-BMaCKkT5.mjs +16 -0
  189. package/dist/sha256sum-NS7D3IXX-BMaCKkT5.mjs.map +1 -0
  190. package/dist/skills-bundle/_AGENTS.mcp.md +161 -0
  191. package/dist/skills-bundle/_AGENTS.md +362 -0
  192. package/dist/sleep-X22JJINO-Do5hEQQW.mjs +67 -0
  193. package/dist/sleep-X22JJINO-Do5hEQQW.mjs.map +1 -0
  194. package/dist/sort-SW2YEO5B-B7j1zw8k.mjs +320 -0
  195. package/dist/sort-SW2YEO5B-B7j1zw8k.mjs.map +1 -0
  196. package/dist/split-4KKZZXXE-h8GD4HP4.mjs +248 -0
  197. package/dist/split-4KKZZXXE-h8GD4HP4.mjs.map +1 -0
  198. package/dist/sqlite3-CGOEFJAO-DvzzghDg.mjs +2879 -0
  199. package/dist/sqlite3-CGOEFJAO-DvzzghDg.mjs.map +1 -0
  200. package/dist/stat-CD34IZ4P-B5ZOJh4J.mjs +65 -0
  201. package/dist/stat-CD34IZ4P-B5ZOJh4J.mjs.map +1 -0
  202. package/dist/strings-6WDHLGMX-DdiEdoL-.mjs +179 -0
  203. package/dist/strings-6WDHLGMX-DdiEdoL-.mjs.map +1 -0
  204. package/dist/tac-2STMMJYW-DPyeWM9R.mjs +53 -0
  205. package/dist/tac-2STMMJYW-DPyeWM9R.mjs.map +1 -0
  206. package/dist/tail-R4PCA2C4-CUfroNeu.mjs +37 -0
  207. package/dist/tail-R4PCA2C4-CUfroNeu.mjs.map +1 -0
  208. package/dist/tar-STHHZTZ6-DRf60e-G.mjs +2838 -0
  209. package/dist/tar-STHHZTZ6-DRf60e-G.mjs.map +1 -0
  210. package/dist/tee-YUZ2FKCJ-po_dfyc_.mjs +46 -0
  211. package/dist/tee-YUZ2FKCJ-po_dfyc_.mjs.map +1 -0
  212. package/dist/templates/hello-world/README.md +14 -0
  213. package/dist/templates/hello-world/keystroke.config.ts +3 -0
  214. package/dist/templates/hello-world/package.json +23 -0
  215. package/dist/templates/hello-world/src/actions/greet.ts +21 -0
  216. package/dist/templates/hello-world/src/agents/hello.int.test.ts +13 -0
  217. package/dist/templates/hello-world/src/agents/hello.ts +9 -0
  218. package/dist/templates/hello-world/src/workflows/greeting.test.ts +11 -0
  219. package/dist/templates/hello-world/src/workflows/greeting.ts +14 -0
  220. package/dist/templates/hello-world/tsconfig.json +20 -0
  221. package/dist/time-D4LNBSWX-DVWhAldK.mjs +112 -0
  222. package/dist/time-D4LNBSWX-DVWhAldK.mjs.map +1 -0
  223. package/dist/timeout-YDCRSLPQ-B_yntmXU.mjs +113 -0
  224. package/dist/timeout-YDCRSLPQ-B_yntmXU.mjs.map +1 -0
  225. package/dist/touch-UA33VN3N-oW1SBT1r.mjs +104 -0
  226. package/dist/touch-UA33VN3N-oW1SBT1r.mjs.map +1 -0
  227. package/dist/tr-36LHWFRQ-CTq3z6wq.mjs +167 -0
  228. package/dist/tr-36LHWFRQ-CTq3z6wq.mjs.map +1 -0
  229. package/dist/tree-YLD52CNT-CIozNsLQ.mjs +186 -0
  230. package/dist/tree-YLD52CNT-CIozNsLQ.mjs.map +1 -0
  231. package/dist/true-FHQXJXBE-DsJOznSp.mjs +31 -0
  232. package/dist/true-FHQXJXBE-DsJOznSp.mjs.map +1 -0
  233. package/dist/unexpand-CADSA4VO-Cq9DTcUg.mjs +155 -0
  234. package/dist/unexpand-CADSA4VO-Cq9DTcUg.mjs.map +1 -0
  235. package/dist/uniq-XSIZR6PB-D5lt-IXF.mjs +92 -0
  236. package/dist/uniq-XSIZR6PB-D5lt-IXF.mjs.map +1 -0
  237. package/dist/watch-app-DTIeKrbl-CSpsNzVG.mjs +100 -0
  238. package/dist/watch-app-DTIeKrbl-CSpsNzVG.mjs.map +1 -0
  239. package/dist/wc-LF7NU4LA-BFPabrwD.mjs +111 -0
  240. package/dist/wc-LF7NU4LA-BFPabrwD.mjs.map +1 -0
  241. package/dist/which-XEM24D5D-2LvlkpUo.mjs +62 -0
  242. package/dist/which-XEM24D5D-2LvlkpUo.mjs.map +1 -0
  243. package/dist/whoami-XMTX52VE-24Kwqrk6.mjs +24 -0
  244. package/dist/whoami-XMTX52VE-24Kwqrk6.mjs.map +1 -0
  245. package/dist/xan-Y6WF3IRG-DjKO96Pj.mjs +2832 -0
  246. package/dist/xan-Y6WF3IRG-DjKO96Pj.mjs.map +1 -0
  247. package/dist/xan-view-HDVKHFC2-DhDNVE_V.mjs +12 -0
  248. package/dist/xan-view-HDVKHFC2-DhDNVE_V.mjs.map +1 -0
  249. package/dist/xargs-MGZPH7AX-D2bIgrdg.mjs +112 -0
  250. package/dist/xargs-MGZPH7AX-D2bIgrdg.mjs.map +1 -0
  251. package/dist/yq-4QJW3EQG-XhB3aACo.mjs +8610 -0
  252. package/dist/yq-4QJW3EQG-XhB3aACo.mjs.map +1 -0
  253. package/package.json +61 -0
@@ -0,0 +1,457 @@
1
+ #!/usr/bin/env node
2
+ import { Sr as originFromPublicUrl, wt as LOCAL_PLATFORM_ORIGIN } from "./dist-BoZPZ9Sz.mjs";
3
+ import Conf from "conf";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
7
+ import { fileURLToPath } from "node:url";
8
+ import { spawnSync } from "node:child_process";
9
+ //#region src/resolve-platform-url.ts
10
+ const DEFAULT_WEB_URL = "https://keystroke.ai";
11
+ const DEFAULT_PLATFORM_URL = "https://api.keystroke.ai";
12
+ function webOriginFromUrl(webUrl) {
13
+ return originFromPublicUrl(webUrl, webUrl.replace(/\/+$/, ""));
14
+ }
15
+ /** Known web origins with a fixed platform API — undefined for custom/staging URLs. */
16
+ function knownPlatformUrlForWebUrl(webUrl) {
17
+ const webOrigin = webOriginFromUrl(webUrl);
18
+ if (webOrigin === "http://localhost:3000" || webOrigin === "http://127.0.0.1:3000") return LOCAL_PLATFORM_ORIGIN;
19
+ if (webOrigin === "https://keystroke.ai") return DEFAULT_PLATFORM_URL;
20
+ }
21
+ function resolvePlatformUrlForWebUrl(webUrl, options = {}) {
22
+ const explicit = options.platformUrl?.trim();
23
+ if (explicit) return explicit.replace(/\/+$/, "");
24
+ const known = knownPlatformUrlForWebUrl(webUrl);
25
+ if (known) return known;
26
+ return (options.fallback?.trim() || "https://api.keystroke.ai").replace(/\/+$/, "");
27
+ }
28
+ //#endregion
29
+ //#region src/config.ts
30
+ function getCliConfigDir(cwd = join(homedir(), ".keystroke")) {
31
+ return cwd;
32
+ }
33
+ function getConfigDir(config) {
34
+ return dirname(config.path);
35
+ }
36
+ function getEffectiveApiTarget(config) {
37
+ const explicit = config.get("apiTarget");
38
+ if (explicit === "local" || explicit === "platform") return explicit;
39
+ if (process.env.KEYSTROKE_API_KEY?.trim()) return "platform";
40
+ return "local";
41
+ }
42
+ function syncPlatformUrlWithWebUrl(config) {
43
+ const known = knownPlatformUrlForWebUrl(config.get("webUrl"));
44
+ if (!known) return;
45
+ if (config.get("platformUrl") !== known) config.set("platformUrl", known);
46
+ }
47
+ function createCliConfig(cwd = getCliConfigDir()) {
48
+ const config = new Conf({
49
+ projectName: "keystroke",
50
+ cwd,
51
+ schema: {
52
+ webUrl: {
53
+ type: "string",
54
+ default: DEFAULT_WEB_URL
55
+ },
56
+ platformUrl: {
57
+ type: "string",
58
+ default: DEFAULT_PLATFORM_URL
59
+ },
60
+ apiTarget: {
61
+ type: "string",
62
+ enum: ["local", "platform"]
63
+ }
64
+ }
65
+ });
66
+ syncPlatformUrlWithWebUrl(config);
67
+ return config;
68
+ }
69
+ function getWebUrl(config) {
70
+ return config.get("webUrl");
71
+ }
72
+ function getPlatformUrl(config) {
73
+ const apiKey = process.env.KEYSTROKE_API_KEY?.trim();
74
+ const fromEnv = process.env.KEYSTROKE_PLATFORM_URL?.trim();
75
+ if (apiKey && fromEnv) return fromEnv.replace(/\/+$/, "");
76
+ return resolvePlatformUrlForWebUrl(getWebUrl(config), { fallback: config.get("platformUrl") });
77
+ }
78
+ //#endregion
79
+ //#region src/project/resolve-cli-root.ts
80
+ function isCliPackage(dir) {
81
+ const packageJsonPath = join(dir, "package.json");
82
+ if (!existsSync(packageJsonPath)) return false;
83
+ return JSON.parse(readFileSync(packageJsonPath, "utf8")).name === "@keystrokehq/cli";
84
+ }
85
+ function resolveCliRoot(fromModuleUrl) {
86
+ let dir = dirname(fileURLToPath(fromModuleUrl));
87
+ while (dir !== dirname(dir)) {
88
+ if (isCliPackage(dir)) return dir;
89
+ dir = dirname(dir);
90
+ }
91
+ throw new Error("Could not resolve keystroke CLI package root");
92
+ }
93
+ //#endregion
94
+ //#region src/version.ts
95
+ function readCliVersion() {
96
+ const packageJsonPath = join(resolveCliRoot(import.meta.url), "package.json");
97
+ return JSON.parse(readFileSync(packageJsonPath, "utf8")).version ?? "0.0.0";
98
+ }
99
+ //#endregion
100
+ //#region src/update/compare-version.ts
101
+ function parseVersion(version) {
102
+ const [major = 0, minor = 0, patch = 0] = (version.trim().replace(/^v/, "").split("-")[0] ?? "").split(".").map((part) => {
103
+ const value = Number.parseInt(part, 10);
104
+ return Number.isFinite(value) ? value : 0;
105
+ });
106
+ return [
107
+ major,
108
+ minor,
109
+ patch
110
+ ];
111
+ }
112
+ function isNewerVersion(latest, current) {
113
+ const [latestMajor, latestMinor, latestPatch] = parseVersion(latest);
114
+ const [currentMajor, currentMinor, currentPatch] = parseVersion(current);
115
+ if (latestMajor !== currentMajor) return latestMajor > currentMajor;
116
+ if (latestMinor !== currentMinor) return latestMinor > currentMinor;
117
+ return latestPatch > currentPatch;
118
+ }
119
+ //#endregion
120
+ //#region src/init/package-manager.ts
121
+ const MANAGERS = [
122
+ "pnpm",
123
+ "npm",
124
+ "yarn",
125
+ "bun"
126
+ ];
127
+ function detectPackageManager() {
128
+ const userAgent = process.env.npm_config_user_agent ?? "";
129
+ for (const manager of MANAGERS) if (userAgent.startsWith(manager)) return manager;
130
+ if (process.env.PNPM_HOME) return "pnpm";
131
+ return "npm";
132
+ }
133
+ function resolvePackageManager(explicit) {
134
+ if (!explicit) return detectPackageManager();
135
+ const normalized = explicit.trim().toLowerCase();
136
+ if (!MANAGERS.includes(normalized)) throw new Error(`Unsupported package manager "${explicit}". Use npm, pnpm, yarn, or bun.`);
137
+ return normalized;
138
+ }
139
+ /** Resolve GitHub Packages auth for @keystrokehq/* when NODE_AUTH_TOKEN is unset. */
140
+ function resolveGithubPackagesToken() {
141
+ if (process.env.NODE_AUTH_TOKEN) return process.env.NODE_AUTH_TOKEN;
142
+ for (const key of ["GITHUB_TOKEN", "GH_TOKEN"]) {
143
+ const value = process.env[key];
144
+ if (value) return value;
145
+ }
146
+ const gh = spawnSync("gh", ["auth", "token"], { encoding: "utf8" });
147
+ if (gh.status === 0) {
148
+ const token = gh.stdout.trim();
149
+ if (token) return token;
150
+ }
151
+ }
152
+ function installDependencies(cwd, manager) {
153
+ const token = resolveGithubPackagesToken();
154
+ if (spawnSync(manager, ["install"], {
155
+ cwd,
156
+ stdio: "inherit",
157
+ env: token ? {
158
+ ...process.env,
159
+ NODE_AUTH_TOKEN: token
160
+ } : process.env
161
+ }).status !== 0) throw new Error(`${manager} install failed`);
162
+ }
163
+ function installPlaygroundDependencies(cwd) {
164
+ if (spawnSync("pnpm", ["install", "--ignore-workspace"], {
165
+ cwd,
166
+ stdio: "inherit",
167
+ env: process.env
168
+ }).status !== 0) throw new Error("pnpm install failed");
169
+ }
170
+ /**
171
+ * Build every workspace package so the playground's `link:` deps resolve to
172
+ * compiled `dist/`. Without this, `keystroke dev` fails with
173
+ * `ERR_MODULE_NOT_FOUND` against whichever package was never built. Turbo
174
+ * caches, so this is only slow on the first run.
175
+ */
176
+ function buildPlaygroundWorkspace(monorepoRoot) {
177
+ const { NODE_OPTIONS: _drop, ...buildEnv } = process.env;
178
+ if (spawnSync("pnpm", ["run", "build"], {
179
+ cwd: monorepoRoot,
180
+ stdio: "inherit",
181
+ env: buildEnv
182
+ }).status !== 0) throw new Error("workspace build failed (pnpm run build)");
183
+ }
184
+ //#endregion
185
+ //#region src/update/detect-cli-install.ts
186
+ function realpathSafe(path) {
187
+ try {
188
+ return realpathSync(path);
189
+ } catch {
190
+ return path;
191
+ }
192
+ }
193
+ function detectManagerFromLockfile(dir) {
194
+ if (existsSync(join(dir, "pnpm-lock.yaml"))) return "pnpm";
195
+ if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock"))) return "bun";
196
+ if (existsSync(join(dir, "yarn.lock"))) return "yarn";
197
+ if (existsSync(join(dir, "package-lock.json"))) return "npm";
198
+ }
199
+ function findLocalProjectRoot(packageRoot) {
200
+ const normalizedRoot = realpathSafe(packageRoot);
201
+ let dir = dirname(packageRoot);
202
+ while (dir !== dirname(dir)) {
203
+ const installedCliPath = join(dir, "node_modules", "@keystrokehq", "cli");
204
+ if (existsSync(join(dir, "package.json")) && realpathSafe(installedCliPath) === normalizedRoot) return dir;
205
+ dir = dirname(dir);
206
+ }
207
+ }
208
+ function globalRootForManager(manager) {
209
+ const { command, args } = {
210
+ pnpm: {
211
+ command: "pnpm",
212
+ args: ["root", "-g"]
213
+ },
214
+ npm: {
215
+ command: "npm",
216
+ args: ["root", "-g"]
217
+ },
218
+ yarn: {
219
+ command: "yarn",
220
+ args: ["global", "dir"]
221
+ },
222
+ bun: {
223
+ command: "bun",
224
+ args: ["pm", "bin"]
225
+ }
226
+ }[manager];
227
+ const result = spawnSync(command, args, { encoding: "utf8" });
228
+ if (result.status !== 0) return;
229
+ const root = result.stdout.trim();
230
+ return root ? realpathSafe(root) : void 0;
231
+ }
232
+ function detectGlobalManager(packageRoot) {
233
+ const normalizedRoot = realpathSafe(packageRoot);
234
+ if (normalizedRoot.includes(`${join("", ".pnpm")}`)) return "pnpm";
235
+ for (const manager of [
236
+ "pnpm",
237
+ "npm",
238
+ "yarn",
239
+ "bun"
240
+ ]) {
241
+ const globalRoot = globalRootForManager(manager);
242
+ if (globalRoot && normalizedRoot.startsWith(globalRoot)) return manager;
243
+ }
244
+ if (process.env.PNPM_HOME) return "pnpm";
245
+ return detectPackageManager();
246
+ }
247
+ function detectCliInstall(packageRoot) {
248
+ const normalizedRoot = realpathSafe(packageRoot);
249
+ const projectRoot = findLocalProjectRoot(normalizedRoot);
250
+ if (projectRoot) return {
251
+ kind: "local",
252
+ packageManager: detectManagerFromLockfile(projectRoot) ?? detectPackageManager(),
253
+ packageRoot: normalizedRoot,
254
+ projectRoot
255
+ };
256
+ return {
257
+ kind: "global",
258
+ packageManager: detectGlobalManager(normalizedRoot),
259
+ packageRoot: normalizedRoot
260
+ };
261
+ }
262
+ //#endregion
263
+ //#region src/update/detect-release-age-block.ts
264
+ const RELEASE_AGE_PATTERNS = [
265
+ /minimumReleaseAge/i,
266
+ /minimum-release-age/i,
267
+ /ERR_PNPM_NO_MATURE_MATCHING_VERSION/,
268
+ /ERR_PNPM_MINIMUM_RELEASE_AGE/,
269
+ /does not meet the minimumReleaseAge constraint/
270
+ ];
271
+ function isReleaseAgeBlock(output) {
272
+ return RELEASE_AGE_PATTERNS.some((pattern) => pattern.test(output));
273
+ }
274
+ function formatReleaseAgeBlockMessage(options) {
275
+ const retry = options.retryAfter !== void 0 ? ` Retry after ${options.retryAfter.toLocaleString()}.` : "";
276
+ return `@keystrokehq/cli ${options.availableVersion} is available but blocked by your minimum-release-age setting. You're on ${options.currentVersion}.${retry} Add @keystrokehq/cli to minimumReleaseAgeExclude to install immediately.`;
277
+ }
278
+ //#endregion
279
+ //#region src/update/fetch-latest-version.ts
280
+ const REGISTRY_URL = "https://registry.npmjs.org/@keystrokehq%2Fcli";
281
+ const REQUEST_TIMEOUT_MS = 3e3;
282
+ async function fetchLatestCliRelease() {
283
+ const controller = new AbortController();
284
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
285
+ try {
286
+ const response = await fetch(REGISTRY_URL, {
287
+ signal: controller.signal,
288
+ headers: { Accept: "application/json" }
289
+ });
290
+ if (!response.ok) return;
291
+ const payload = await response.json();
292
+ const version = payload["dist-tags"]?.latest?.trim();
293
+ if (!version) return;
294
+ return {
295
+ version,
296
+ publishedAt: payload.time?.[version]
297
+ };
298
+ } catch {
299
+ return;
300
+ } finally {
301
+ clearTimeout(timeout);
302
+ }
303
+ }
304
+ //#endregion
305
+ //#region src/update/read-pnpm-release-age-minutes.ts
306
+ function readPnpmMinimumReleaseAgeMinutes() {
307
+ const result = spawnSync("pnpm", [
308
+ "config",
309
+ "get",
310
+ "minimum-release-age"
311
+ ], { encoding: "utf8" });
312
+ if (result.status !== 0) return;
313
+ const value = result.stdout.trim();
314
+ if (!value || value === "undefined" || value === "0") return;
315
+ const minutes = Number.parseInt(value, 10);
316
+ return Number.isFinite(minutes) && minutes > 0 ? minutes : void 0;
317
+ }
318
+ function computeReleaseAgeRetryAfter(publishedAt, minimumReleaseAgeMinutes) {
319
+ if (!publishedAt || !minimumReleaseAgeMinutes) return;
320
+ const publishedMs = Date.parse(publishedAt);
321
+ if (!Number.isFinite(publishedMs)) return;
322
+ return new Date(publishedMs + minimumReleaseAgeMinutes * 6e4);
323
+ }
324
+ //#endregion
325
+ //#region src/update/resolve-global-pnpm-root.ts
326
+ /** pnpm global installs live in `<pnpm-home>/global/<major>/`. */
327
+ function resolveGlobalPnpmRoot(packageRoot) {
328
+ return packageRoot.replace(/\\/g, "/").match(/^(.*\/global\/\d+)\//)?.[1];
329
+ }
330
+ //#endregion
331
+ //#region src/update/build-update-command.ts
332
+ const PACKAGE_NAME = "@keystrokehq/cli@latest";
333
+ function buildUpdateCommand(install) {
334
+ const { kind, packageManager } = install;
335
+ if (kind === "global") switch (packageManager) {
336
+ case "pnpm": return {
337
+ command: "pnpm",
338
+ args: [
339
+ "add",
340
+ "-g",
341
+ PACKAGE_NAME
342
+ ],
343
+ cwd: resolveGlobalPnpmRoot(install.packageRoot)
344
+ };
345
+ case "yarn": return {
346
+ command: "yarn",
347
+ args: [
348
+ "global",
349
+ "add",
350
+ PACKAGE_NAME
351
+ ]
352
+ };
353
+ case "bun": return {
354
+ command: "bun",
355
+ args: [
356
+ "add",
357
+ "-g",
358
+ PACKAGE_NAME
359
+ ]
360
+ };
361
+ default: return {
362
+ command: "npm",
363
+ args: [
364
+ "install",
365
+ "-g",
366
+ PACKAGE_NAME
367
+ ]
368
+ };
369
+ }
370
+ const cwd = install.projectRoot;
371
+ switch (packageManager) {
372
+ case "pnpm": return {
373
+ command: "pnpm",
374
+ args: [
375
+ "add",
376
+ "-D",
377
+ PACKAGE_NAME
378
+ ],
379
+ cwd
380
+ };
381
+ case "yarn": return {
382
+ command: "yarn",
383
+ args: [
384
+ "add",
385
+ "-D",
386
+ PACKAGE_NAME
387
+ ],
388
+ cwd
389
+ };
390
+ case "bun": return {
391
+ command: "bun",
392
+ args: [
393
+ "add",
394
+ "-D",
395
+ PACKAGE_NAME
396
+ ],
397
+ cwd
398
+ };
399
+ default: return {
400
+ command: "npm",
401
+ args: [
402
+ "install",
403
+ "-D",
404
+ PACKAGE_NAME
405
+ ],
406
+ cwd
407
+ };
408
+ }
409
+ }
410
+ //#endregion
411
+ //#region src/update/run-package-manager-update.ts
412
+ function updateSpawnEnv() {
413
+ const env = { ...process.env };
414
+ const pnpmHome = env.PNPM_HOME;
415
+ if (!pnpmHome) return env;
416
+ const pathKey = process.platform === "win32" ? "Path" : "PATH";
417
+ const path = env[pathKey] ?? "";
418
+ const segments = path.split(process.platform === "win32" ? ";" : ":");
419
+ const prefix = [`${pnpmHome}/bin`, pnpmHome].filter((dir) => !segments.includes(dir));
420
+ if (prefix.length > 0) env[pathKey] = [...prefix, path].filter(Boolean).join(process.platform === "win32" ? ";" : ":");
421
+ return env;
422
+ }
423
+ function runPackageManager(command, args, cwd) {
424
+ const result = spawnSync(command, args, {
425
+ cwd,
426
+ encoding: "utf8",
427
+ env: updateSpawnEnv()
428
+ });
429
+ const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
430
+ return {
431
+ ok: result.status === 0,
432
+ output
433
+ };
434
+ }
435
+ function migratePnpmGlobal(cwd) {
436
+ return spawnSync("pnpm", ["install"], {
437
+ cwd,
438
+ encoding: "utf8",
439
+ env: {
440
+ ...updateSpawnEnv(),
441
+ CI: "true"
442
+ }
443
+ }).status === 0;
444
+ }
445
+ function runPackageManagerUpdate(install) {
446
+ const { command, args, cwd } = buildUpdateCommand(install);
447
+ const firstAttempt = runPackageManager(command, args, cwd);
448
+ if (firstAttempt.ok) return firstAttempt;
449
+ if (install.kind === "global" && install.packageManager === "pnpm" && cwd) {
450
+ if (migratePnpmGlobal(cwd)) return runPackageManager(command, args, cwd);
451
+ }
452
+ return firstAttempt;
453
+ }
454
+ //#endregion
455
+ export { getWebUrl as C, resolvePlatformUrlForWebUrl as E, getPlatformUrl as S, DEFAULT_WEB_URL as T, resolveCliRoot as _, formatReleaseAgeBlockMessage as a, getConfigDir as b, detectManagerFromLockfile as c, installDependencies as d, installPlaygroundDependencies as f, readCliVersion as g, isNewerVersion as h, fetchLatestCliRelease as i, buildPlaygroundWorkspace as l, resolvePackageManager as m, computeReleaseAgeRetryAfter as n, isReleaseAgeBlock as o, resolveGithubPackagesToken as p, readPnpmMinimumReleaseAgeMinutes as r, detectCliInstall as s, runPackageManagerUpdate as t, detectPackageManager as u, createCliConfig as v, DEFAULT_PLATFORM_URL as w, getEffectiveApiTarget as x, getCliConfigDir as y };
456
+
457
+ //# sourceMappingURL=run-package-manager-update-D_jU5wZe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-package-manager-update-D_jU5wZe.mjs","names":[],"sources":["../src/resolve-platform-url.ts","../src/config.ts","../src/project/resolve-cli-root.ts","../src/version.ts","../src/update/compare-version.ts","../src/init/package-manager.ts","../src/update/detect-cli-install.ts","../src/update/detect-release-age-block.ts","../src/update/fetch-latest-version.ts","../src/update/read-pnpm-release-age-minutes.ts","../src/update/resolve-global-pnpm-root.ts","../src/update/build-update-command.ts","../src/update/run-package-manager-update.ts"],"sourcesContent":["import { LOCAL_PLATFORM_ORIGIN, originFromPublicUrl } from \"@keystrokehq/shared\";\n\nexport const DEFAULT_WEB_URL = \"https://keystroke.ai\";\nexport const DEFAULT_PLATFORM_URL = \"https://api.keystroke.ai\";\nexport const LOCAL_WEB_URL = \"http://localhost:3000\";\n\nexport type ResolvePlatformUrlOptions = {\n platformUrl?: string;\n /** Used when webUrl does not match a known deployment. */\n fallback?: string;\n};\n\nfunction webOriginFromUrl(webUrl: string): string {\n return originFromPublicUrl(webUrl, webUrl.replace(/\\/+$/, \"\"));\n}\n\n/** Known web origins with a fixed platform API — undefined for custom/staging URLs. */\nexport function knownPlatformUrlForWebUrl(webUrl: string): string | undefined {\n const webOrigin = webOriginFromUrl(webUrl);\n\n if (webOrigin === LOCAL_WEB_URL || webOrigin === \"http://127.0.0.1:3000\") {\n return LOCAL_PLATFORM_ORIGIN;\n }\n\n if (webOrigin === DEFAULT_WEB_URL) {\n return DEFAULT_PLATFORM_URL;\n }\n\n return undefined;\n}\n\nexport function resolvePlatformUrlForWebUrl(\n webUrl: string,\n options: ResolvePlatformUrlOptions = {},\n): string {\n const explicit = options.platformUrl?.trim();\n if (explicit) {\n return explicit.replace(/\\/+$/, \"\");\n }\n\n const known = knownPlatformUrlForWebUrl(webUrl);\n if (known) {\n return known;\n }\n\n const fallback = options.fallback?.trim() || DEFAULT_PLATFORM_URL;\n return fallback.replace(/\\/+$/, \"\");\n}\n","import Conf from \"conf\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n DEFAULT_PLATFORM_URL,\n DEFAULT_WEB_URL,\n knownPlatformUrlForWebUrl,\n resolvePlatformUrlForWebUrl,\n} from \"./resolve-platform-url\";\n\nexport type ApiTargetMode = \"local\" | \"platform\";\n\nexport type CliConfig = {\n webUrl: string;\n platformUrl: string;\n apiTarget?: ApiTargetMode;\n};\n\nexport function getCliConfigDir(cwd = join(homedir(), \".keystroke\")): string {\n return cwd;\n}\n\nexport function getConfigDir(config: Conf<CliConfig>): string {\n return dirname(config.path);\n}\n\nexport function getEffectiveApiTarget(config: Conf<CliConfig>): ApiTargetMode {\n const explicit = config.get(\"apiTarget\");\n if (explicit === \"local\" || explicit === \"platform\") {\n return explicit;\n }\n\n if (process.env.KEYSTROKE_API_KEY?.trim()) {\n return \"platform\";\n }\n\n return \"local\";\n}\n\nfunction syncPlatformUrlWithWebUrl(config: Conf<CliConfig>): void {\n const webUrl = config.get(\"webUrl\");\n const known = knownPlatformUrlForWebUrl(webUrl);\n if (!known) {\n return;\n }\n\n const stored = config.get(\"platformUrl\");\n if (stored !== known) {\n config.set(\"platformUrl\", known);\n }\n}\n\nexport function createCliConfig(cwd = getCliConfigDir()): Conf<CliConfig> {\n const config = new Conf<CliConfig>({\n projectName: \"keystroke\",\n cwd,\n schema: {\n webUrl: {\n type: \"string\",\n default: DEFAULT_WEB_URL,\n },\n platformUrl: {\n type: \"string\",\n default: DEFAULT_PLATFORM_URL,\n },\n apiTarget: {\n type: \"string\",\n enum: [\"local\", \"platform\"],\n },\n },\n });\n\n syncPlatformUrlWithWebUrl(config);\n return config;\n}\n\nexport function getWebUrl(config: Conf<CliConfig>): string {\n return config.get(\"webUrl\");\n}\n\nexport function getPlatformUrl(config: Conf<CliConfig>): string {\n const apiKey = process.env.KEYSTROKE_API_KEY?.trim();\n const fromEnv = process.env.KEYSTROKE_PLATFORM_URL?.trim();\n if (apiKey && fromEnv) {\n return fromEnv.replace(/\\/+$/, \"\");\n }\n return resolvePlatformUrlForWebUrl(getWebUrl(config), {\n fallback: config.get(\"platformUrl\"),\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction isCliPackage(dir: string): boolean {\n const packageJsonPath = join(dir, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return false;\n }\n\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { name?: string };\n return pkg.name === \"@keystrokehq/cli\";\n}\n\nexport function resolveCliRoot(fromModuleUrl: string): string {\n let dir = dirname(fileURLToPath(fromModuleUrl));\n\n while (dir !== dirname(dir)) {\n if (isCliPackage(dir)) {\n return dir;\n }\n\n dir = dirname(dir);\n }\n\n throw new Error(\"Could not resolve keystroke CLI package root\");\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveCliRoot } from \"./project/resolve-cli-root\";\n\nexport function readCliVersion(): string {\n const packageJsonPath = join(resolveCliRoot(import.meta.url), \"package.json\");\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as { version?: string };\n return pkg.version ?? \"0.0.0\";\n}\n","function parseVersion(version: string): [number, number, number] {\n const normalized = version.trim().replace(/^v/, \"\").split(\"-\")[0] ?? \"\";\n const [major = 0, minor = 0, patch = 0] = normalized.split(\".\").map((part) => {\n const value = Number.parseInt(part, 10);\n return Number.isFinite(value) ? value : 0;\n });\n\n return [major, minor, patch];\n}\n\nexport function isNewerVersion(latest: string, current: string): boolean {\n const [latestMajor, latestMinor, latestPatch] = parseVersion(latest);\n const [currentMajor, currentMinor, currentPatch] = parseVersion(current);\n\n if (latestMajor !== currentMajor) {\n return latestMajor > currentMajor;\n }\n\n if (latestMinor !== currentMinor) {\n return latestMinor > currentMinor;\n }\n\n return latestPatch > currentPatch;\n}\n","import { spawnSync } from \"node:child_process\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nconst MANAGERS: PackageManager[] = [\"pnpm\", \"npm\", \"yarn\", \"bun\"];\n\nexport function detectPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n\n for (const manager of MANAGERS) {\n if (userAgent.startsWith(manager)) {\n return manager;\n }\n }\n\n if (process.env.PNPM_HOME) {\n return \"pnpm\";\n }\n\n return \"npm\";\n}\n\nexport function resolvePackageManager(explicit?: string): PackageManager {\n if (!explicit) {\n return detectPackageManager();\n }\n\n const normalized = explicit.trim().toLowerCase();\n if (!MANAGERS.includes(normalized as PackageManager)) {\n throw new Error(`Unsupported package manager \"${explicit}\". Use npm, pnpm, yarn, or bun.`);\n }\n\n return normalized as PackageManager;\n}\n\n/** Resolve GitHub Packages auth for @keystrokehq/* when NODE_AUTH_TOKEN is unset. */\nexport function resolveGithubPackagesToken(): string | undefined {\n if (process.env.NODE_AUTH_TOKEN) {\n return process.env.NODE_AUTH_TOKEN;\n }\n\n for (const key of [\"GITHUB_TOKEN\", \"GH_TOKEN\"] as const) {\n const value = process.env[key];\n if (value) {\n return value;\n }\n }\n\n const gh = spawnSync(\"gh\", [\"auth\", \"token\"], { encoding: \"utf8\" });\n if (gh.status === 0) {\n const token = gh.stdout.trim();\n if (token) {\n return token;\n }\n }\n\n return undefined;\n}\n\nexport function installDependencies(cwd: string, manager: PackageManager): void {\n const token = resolveGithubPackagesToken();\n const env = token ? { ...process.env, NODE_AUTH_TOKEN: token } : process.env;\n\n const result = spawnSync(manager, [\"install\"], {\n cwd,\n stdio: \"inherit\",\n env,\n });\n\n if (result.status !== 0) {\n throw new Error(`${manager} install failed`);\n }\n}\n\nexport function installPlaygroundDependencies(cwd: string): void {\n const result = spawnSync(\"pnpm\", [\"install\", \"--ignore-workspace\"], {\n cwd,\n stdio: \"inherit\",\n env: process.env,\n });\n\n if (result.status !== 0) {\n throw new Error(\"pnpm install failed\");\n }\n}\n\n/**\n * Build every workspace package so the playground's `link:` deps resolve to\n * compiled `dist/`. Without this, `keystroke dev` fails with\n * `ERR_MODULE_NOT_FOUND` against whichever package was never built. Turbo\n * caches, so this is only slow on the first run.\n */\nexport function buildPlaygroundWorkspace(monorepoRoot: string): void {\n // Build with a clean Node env: the `keystroke-dev` wrapper sets\n // NODE_OPTIONS=--conditions=development, which would make tsdown/turbo resolve\n // their own deps to src/ and fail. Dropping NODE_OPTIONS builds to dist/ normally.\n const { NODE_OPTIONS: _drop, ...buildEnv } = process.env;\n const result = spawnSync(\"pnpm\", [\"run\", \"build\"], {\n cwd: monorepoRoot,\n stdio: \"inherit\",\n env: buildEnv,\n });\n\n if (result.status !== 0) {\n throw new Error(\"workspace build failed (pnpm run build)\");\n }\n}\n","import { existsSync, realpathSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\nimport { dirname, join } from \"node:path\";\n\nimport { detectPackageManager, type PackageManager } from \"../init/package-manager\";\n\nexport type CliInstallKind = \"global\" | \"local\";\n\nexport type CliInstallInfo = {\n kind: CliInstallKind;\n packageManager: PackageManager;\n packageRoot: string;\n projectRoot?: string;\n};\n\nfunction realpathSafe(path: string): string {\n try {\n return realpathSync(path);\n } catch {\n return path;\n }\n}\n\nexport function detectManagerFromLockfile(dir: string): PackageManager | undefined {\n if (existsSync(join(dir, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n\n if (existsSync(join(dir, \"bun.lockb\")) || existsSync(join(dir, \"bun.lock\"))) {\n return \"bun\";\n }\n\n if (existsSync(join(dir, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n if (existsSync(join(dir, \"package-lock.json\"))) {\n return \"npm\";\n }\n\n return undefined;\n}\n\nfunction findLocalProjectRoot(packageRoot: string): string | undefined {\n const normalizedRoot = realpathSafe(packageRoot);\n let dir = dirname(packageRoot);\n\n while (dir !== dirname(dir)) {\n const installedCliPath = join(dir, \"node_modules\", \"@keystrokehq\", \"cli\");\n if (\n existsSync(join(dir, \"package.json\")) &&\n realpathSafe(installedCliPath) === normalizedRoot\n ) {\n return dir;\n }\n\n dir = dirname(dir);\n }\n\n return undefined;\n}\n\nfunction globalRootForManager(manager: PackageManager): string | undefined {\n const commands: Record<PackageManager, { command: string; args: string[] }> = {\n pnpm: { command: \"pnpm\", args: [\"root\", \"-g\"] },\n npm: { command: \"npm\", args: [\"root\", \"-g\"] },\n yarn: { command: \"yarn\", args: [\"global\", \"dir\"] },\n bun: { command: \"bun\", args: [\"pm\", \"bin\"] },\n };\n\n const { command, args } = commands[manager];\n const result = spawnSync(command, args, { encoding: \"utf8\" });\n\n if (result.status !== 0) {\n return undefined;\n }\n\n const root = result.stdout.trim();\n return root ? realpathSafe(root) : undefined;\n}\n\nfunction detectGlobalManager(packageRoot: string): PackageManager {\n const normalizedRoot = realpathSafe(packageRoot);\n\n if (normalizedRoot.includes(`${join(\"\", \".pnpm\")}`)) {\n return \"pnpm\";\n }\n\n for (const manager of [\"pnpm\", \"npm\", \"yarn\", \"bun\"] as const) {\n const globalRoot = globalRootForManager(manager);\n if (globalRoot && normalizedRoot.startsWith(globalRoot)) {\n return manager;\n }\n }\n\n if (process.env.PNPM_HOME) {\n return \"pnpm\";\n }\n\n return detectPackageManager();\n}\n\nexport function detectCliInstall(packageRoot: string): CliInstallInfo | undefined {\n const normalizedRoot = realpathSafe(packageRoot);\n const projectRoot = findLocalProjectRoot(normalizedRoot);\n\n if (projectRoot) {\n const packageManager = detectManagerFromLockfile(projectRoot) ?? detectPackageManager();\n\n return {\n kind: \"local\",\n packageManager,\n packageRoot: normalizedRoot,\n projectRoot,\n };\n }\n\n return {\n kind: \"global\",\n packageManager: detectGlobalManager(normalizedRoot),\n packageRoot: normalizedRoot,\n };\n}\n","const RELEASE_AGE_PATTERNS = [\n /minimumReleaseAge/i,\n /minimum-release-age/i,\n /ERR_PNPM_NO_MATURE_MATCHING_VERSION/,\n /ERR_PNPM_MINIMUM_RELEASE_AGE/,\n /does not meet the minimumReleaseAge constraint/,\n];\n\nexport function isReleaseAgeBlock(output: string): boolean {\n return RELEASE_AGE_PATTERNS.some((pattern) => pattern.test(output));\n}\n\nexport function formatReleaseAgeBlockMessage(options: {\n currentVersion: string;\n availableVersion: string;\n retryAfter?: Date;\n}): string {\n const retry =\n options.retryAfter !== undefined ? ` Retry after ${options.retryAfter.toLocaleString()}.` : \"\";\n\n return (\n `@keystrokehq/cli ${options.availableVersion} is available but blocked by your ` +\n `minimum-release-age setting. You're on ${options.currentVersion}.${retry} ` +\n `Add @keystrokehq/cli to minimumReleaseAgeExclude to install immediately.`\n );\n}\n","const REGISTRY_URL = \"https://registry.npmjs.org/@keystrokehq%2Fcli\";\nconst REQUEST_TIMEOUT_MS = 3_000;\n\ntype RegistryPackage = {\n \"dist-tags\"?: {\n latest?: string;\n };\n time?: Record<string, string>;\n};\n\nexport type CliRegistryRelease = {\n version: string;\n publishedAt?: string;\n};\n\nexport async function fetchLatestCliRelease(): Promise<CliRegistryRelease | undefined> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const response = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n return undefined;\n }\n\n const payload = (await response.json()) as RegistryPackage;\n const version = payload[\"dist-tags\"]?.latest?.trim();\n if (!version) {\n return undefined;\n }\n\n return {\n version,\n publishedAt: payload.time?.[version],\n };\n } catch {\n return undefined;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function fetchLatestCliVersion(): Promise<string | undefined> {\n const release = await fetchLatestCliRelease();\n return release?.version;\n}\n","import { spawnSync } from \"node:child_process\";\n\nexport function readPnpmMinimumReleaseAgeMinutes(): number | undefined {\n const result = spawnSync(\"pnpm\", [\"config\", \"get\", \"minimum-release-age\"], {\n encoding: \"utf8\",\n });\n\n if (result.status !== 0) {\n return undefined;\n }\n\n const value = result.stdout.trim();\n if (!value || value === \"undefined\" || value === \"0\") {\n return undefined;\n }\n\n const minutes = Number.parseInt(value, 10);\n return Number.isFinite(minutes) && minutes > 0 ? minutes : undefined;\n}\n\nexport function computeReleaseAgeRetryAfter(\n publishedAt: string | undefined,\n minimumReleaseAgeMinutes: number | undefined,\n): Date | undefined {\n if (!publishedAt || !minimumReleaseAgeMinutes) {\n return undefined;\n }\n\n const publishedMs = Date.parse(publishedAt);\n if (!Number.isFinite(publishedMs)) {\n return undefined;\n }\n\n return new Date(publishedMs + minimumReleaseAgeMinutes * 60_000);\n}\n","/** pnpm global installs live in `<pnpm-home>/global/<major>/`. */\nexport function resolveGlobalPnpmRoot(packageRoot: string): string | undefined {\n const normalized = packageRoot.replace(/\\\\/g, \"/\");\n const match = normalized.match(/^(.*\\/global\\/\\d+)\\//);\n return match?.[1];\n}\n","import type { CliInstallInfo } from \"./detect-cli-install\";\nimport { resolveGlobalPnpmRoot } from \"./resolve-global-pnpm-root\";\n\nconst PACKAGE_NAME = \"@keystrokehq/cli@latest\";\n\nexport function buildUpdateCommand(install: CliInstallInfo): {\n command: string;\n args: string[];\n cwd?: string;\n} {\n const { kind, packageManager } = install;\n\n if (kind === \"global\") {\n switch (packageManager) {\n case \"pnpm\":\n return {\n command: \"pnpm\",\n args: [\"add\", \"-g\", PACKAGE_NAME],\n cwd: resolveGlobalPnpmRoot(install.packageRoot),\n };\n case \"yarn\":\n return { command: \"yarn\", args: [\"global\", \"add\", PACKAGE_NAME] };\n case \"bun\":\n return { command: \"bun\", args: [\"add\", \"-g\", PACKAGE_NAME] };\n case \"npm\":\n default:\n return { command: \"npm\", args: [\"install\", \"-g\", PACKAGE_NAME] };\n }\n }\n\n const cwd = install.projectRoot;\n switch (packageManager) {\n case \"pnpm\":\n return { command: \"pnpm\", args: [\"add\", \"-D\", PACKAGE_NAME], cwd };\n case \"yarn\":\n return { command: \"yarn\", args: [\"add\", \"-D\", PACKAGE_NAME], cwd };\n case \"bun\":\n return { command: \"bun\", args: [\"add\", \"-D\", PACKAGE_NAME], cwd };\n case \"npm\":\n default:\n return { command: \"npm\", args: [\"install\", \"-D\", PACKAGE_NAME], cwd };\n }\n}\n","import { spawnSync } from \"node:child_process\";\n\nimport { buildUpdateCommand } from \"./build-update-command\";\nimport type { CliInstallInfo } from \"./detect-cli-install\";\n\nexport function updateSpawnEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n const pnpmHome = env.PNPM_HOME;\n\n if (!pnpmHome) {\n return env;\n }\n\n const pathKey = process.platform === \"win32\" ? \"Path\" : \"PATH\";\n const path = env[pathKey] ?? \"\";\n const segments = path.split(process.platform === \"win32\" ? \";\" : \":\");\n const binDir = `${pnpmHome}/bin`;\n const prefix = [binDir, pnpmHome].filter((dir) => !segments.includes(dir));\n\n if (prefix.length > 0) {\n env[pathKey] = [...prefix, path].filter(Boolean).join(process.platform === \"win32\" ? \";\" : \":\");\n }\n\n return env;\n}\n\nexport type PackageManagerRunResult = {\n ok: boolean;\n output: string;\n};\n\nfunction runPackageManager(command: string, args: string[], cwd?: string): PackageManagerRunResult {\n const result = spawnSync(command, args, {\n cwd,\n encoding: \"utf8\",\n env: updateSpawnEnv(),\n });\n\n const output = `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`;\n\n return {\n ok: result.status === 0,\n output,\n };\n}\n\nfunction migratePnpmGlobal(cwd: string): boolean {\n const result = spawnSync(\"pnpm\", [\"install\"], {\n cwd,\n encoding: \"utf8\",\n env: {\n ...updateSpawnEnv(),\n CI: \"true\",\n },\n });\n\n return result.status === 0;\n}\n\nexport function runPackageManagerUpdate(install: CliInstallInfo): PackageManagerRunResult {\n const { command, args, cwd } = buildUpdateCommand(install);\n const firstAttempt = runPackageManager(command, args, cwd);\n\n if (firstAttempt.ok) {\n return firstAttempt;\n }\n\n if (install.kind === \"global\" && install.packageManager === \"pnpm\" && cwd) {\n if (migratePnpmGlobal(cwd)) {\n return runPackageManager(command, args, cwd);\n }\n }\n\n return firstAttempt;\n}\n"],"mappings":"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"}