@jdi-code/claude-code 1.0.3 → 1.2.0

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 (539) hide show
  1. package/README.md +104 -369
  2. package/dist/{chunk-4t7n5hfg.js → chunk-0318ehfm.js} +8 -8
  3. package/dist/chunk-050fe4m3.js +68 -0
  4. package/dist/chunk-06v69x0b.js +127 -0
  5. package/dist/chunk-07069jq1.js +30 -0
  6. package/dist/chunk-0c9xpqm8.js +106 -0
  7. package/dist/chunk-0hxxwcs1.js +107 -0
  8. package/dist/chunk-0nsb3kxz.js +440 -0
  9. package/dist/{chunk-1cbn5kxf.js → chunk-0rpb2bdp.js} +3 -2
  10. package/dist/{chunk-vykgfhrb.js → chunk-0svbkpfn.js} +5 -5
  11. package/dist/chunk-0vg07894.js +121 -0
  12. package/dist/{chunk-e4vsvf0r.js → chunk-0zefjhrg.js} +4 -4
  13. package/dist/chunk-0zfmj5y2.js +106 -0
  14. package/dist/{chunk-czkshaff.js → chunk-107p04a0.js} +13 -11
  15. package/dist/{chunk-z4dm354d.js → chunk-13f30tg0.js} +1 -1
  16. package/dist/{chunk-44fpr6jq.js → chunk-168xb8v1.js} +4 -2
  17. package/dist/{chunk-0w63x62y.js → chunk-181q7ysj.js} +79 -63
  18. package/dist/{chunk-6mapphaq.js → chunk-18jc5efa.js} +8 -8
  19. package/dist/chunk-19j7nkpy.js +133 -0
  20. package/dist/chunk-1c2qp0ks.js +33068 -0
  21. package/dist/{chunk-0e1xsncc.js → chunk-1cwdhk7a.js} +1 -1
  22. package/dist/{chunk-7m2nd8da.js → chunk-1erfksyp.js} +6 -9
  23. package/dist/{chunk-rs45skes.js → chunk-1h1tc4mw.js} +13 -10
  24. package/dist/{chunk-91rcbmch.js → chunk-1rngm3yy.js} +155 -184
  25. package/dist/{chunk-3gqdqmzb.js → chunk-1vthytca.js} +16 -12
  26. package/dist/{chunk-xe6z85xc.js → chunk-1xbs4yb6.js} +19 -16
  27. package/dist/chunk-1xj1yz5n.js +109 -0
  28. package/dist/chunk-21mfpnva.js +85 -0
  29. package/dist/chunk-2361j94t.js +1811 -0
  30. package/dist/chunk-238g70xa.js +1 -1
  31. package/dist/chunk-250f5ce1.js +108 -0
  32. package/dist/{chunk-8yx1trkj.js → chunk-29r4exv2.js} +105 -211
  33. package/dist/chunk-2a8yf5ct.js +72 -0
  34. package/dist/{chunk-h3fqb66h.js → chunk-2bnerkhs.js} +110 -135
  35. package/dist/{chunk-0nt9md2b.js → chunk-2cctz9ww.js} +101 -8
  36. package/dist/chunk-2fwze72g.js +24 -0
  37. package/dist/{chunk-h3qa8f5w.js → chunk-2jvpw0q1.js} +229 -363
  38. package/dist/{chunk-9wm5e9e9.js → chunk-2mj88mnr.js} +42 -31
  39. package/dist/chunk-2q0schcc.js +133 -0
  40. package/dist/{chunk-r66hz8j6.js → chunk-2qp2hc02.js} +14 -12
  41. package/dist/chunk-2t0xa4dt.js +145 -0
  42. package/dist/chunk-2tzxsnha.js +360 -0
  43. package/dist/chunk-2v8cya3p.js +54 -0
  44. package/dist/chunk-2w00z1ct.js +105 -0
  45. package/dist/{chunk-2md1yavs.js → chunk-2wpfdv2t.js} +43 -32
  46. package/dist/chunk-2xcr3eqt.js +65 -0
  47. package/dist/chunk-30bpz5m2.js +34 -0
  48. package/dist/{chunk-hrzerbfw.js → chunk-36b2q5fg.js} +14 -14
  49. package/dist/{chunk-edg1yhec.js → chunk-3aady5e2.js} +2 -2
  50. package/dist/chunk-3ewzhjyb.js +207 -0
  51. package/dist/{chunk-z47tm067.js → chunk-3kpptrnz.js} +54 -47
  52. package/dist/{chunk-yd3av9a3.js → chunk-3na967x3.js} +2 -2
  53. package/dist/chunk-3nk79af8.js +8 -0
  54. package/dist/{chunk-z0cm9r7f.js → chunk-3r66czp1.js} +10 -10
  55. package/dist/{chunk-rnjbczcy.js → chunk-3y3qasy6.js} +13 -11
  56. package/dist/{chunk-nxsh6de2.js → chunk-404qm8xt.js} +16 -12
  57. package/dist/{chunk-mhqthgdg.js → chunk-41grdp0q.js} +5 -5
  58. package/dist/chunk-4cp6193g.js +9076 -0
  59. package/dist/chunk-4g18phg9.js +2535 -0
  60. package/dist/{chunk-6n2qgm9v.js → chunk-4hv90qcz.js} +1 -1
  61. package/dist/chunk-4jkfzf6g.js +81 -0
  62. package/dist/{chunk-5frcqxsv.js → chunk-4m6k7588.js} +127117 -138842
  63. package/dist/chunk-4nspekjp.js +69 -0
  64. package/dist/chunk-4x29t96w.js +119 -0
  65. package/dist/{chunk-40b8p5em.js → chunk-585cb3h6.js} +14 -12
  66. package/dist/{chunk-5dbar61y.js → chunk-59qz55py.js} +77 -61
  67. package/dist/chunk-5bta6qne.js +1030 -0
  68. package/dist/chunk-5dmczs66.js +123 -0
  69. package/dist/{chunk-9e2kqv5g.js → chunk-5pevjsyw.js} +3 -10
  70. package/dist/{chunk-5ndexvh1.js → chunk-5py41v61.js} +10226 -16961
  71. package/dist/{chunk-d5e75scx.js → chunk-5q2gm8dt.js} +5 -5
  72. package/dist/{chunk-893mewv4.js → chunk-5rpyh7nn.js} +1 -1
  73. package/dist/{chunk-hx2tr4ep.js → chunk-5z28bqne.js} +34 -475
  74. package/dist/chunk-5zzwydag.js +1170 -0
  75. package/dist/{chunk-4tyxyfsv.js → chunk-61gm3j90.js} +2 -2
  76. package/dist/chunk-64c1avct.js +13 -0
  77. package/dist/chunk-64hks9ax.js +456 -0
  78. package/dist/{chunk-bw9a5v0b.js → chunk-64m7ax9d.js} +4 -4
  79. package/dist/{chunk-cha1tdry.js → chunk-66hjztcb.js} +1 -1
  80. package/dist/{chunk-q25bjaev.js → chunk-677as3nh.js} +2 -2
  81. package/dist/chunk-69v14ada.js +76 -0
  82. package/dist/chunk-6eahnbxj.js +101 -0
  83. package/dist/chunk-6eg4c33n.js +196 -0
  84. package/dist/chunk-6fjfwj7q.js +214 -0
  85. package/dist/{chunk-70qb5sds.js → chunk-6kwwke3r.js} +2 -2
  86. package/dist/chunk-6m0pc6py.js +311 -0
  87. package/dist/chunk-6mpw9h55.js +1071 -0
  88. package/dist/{chunk-v1mgv1et.js → chunk-6p4cyhb3.js} +4 -3
  89. package/dist/chunk-6r1dx518.js +111 -0
  90. package/dist/{chunk-1n1xqxv5.js → chunk-713bh4cd.js} +1072 -1736
  91. package/dist/{chunk-nstbdz07.js → chunk-7246q965.js} +85 -69
  92. package/dist/{chunk-w6q6a1qj.js → chunk-74mdk2e7.js} +564 -864
  93. package/dist/{chunk-77czbpcq.js → chunk-76pa90ge.js} +104 -90
  94. package/dist/chunk-77nkh0x1.js +82 -0
  95. package/dist/chunk-7bsbnzpm.js +65 -0
  96. package/dist/chunk-7r3v46aq.js +167 -0
  97. package/dist/chunk-7vf8s593.js +235 -0
  98. package/dist/chunk-7x6ng8fp.js +64 -0
  99. package/dist/chunk-7xy990yb.js +81 -0
  100. package/dist/chunk-7xyswgjh.js +8 -0
  101. package/dist/chunk-80p18mf8.js +228 -0
  102. package/dist/{chunk-dv1wfr85.js → chunk-8225arm6.js} +5 -4
  103. package/dist/{chunk-vdbes184.js → chunk-82rh5hpz.js} +70 -10
  104. package/dist/chunk-84nf3k34.js +73 -0
  105. package/dist/chunk-85v0yx5b.js +106 -0
  106. package/dist/{chunk-x5j50p5x.js → chunk-86f4vq6n.js} +5 -5
  107. package/dist/{chunk-e5ga3s0y.js → chunk-86vec0h6.js} +148 -421
  108. package/dist/chunk-8az1n4zt.js +110 -0
  109. package/dist/{chunk-ctw5jwcd.js → chunk-8bwqtasa.js} +10 -10
  110. package/dist/chunk-8c9jtmsm.js +100 -0
  111. package/dist/{chunk-fqc5mcw7.js → chunk-8ca80ew2.js} +9 -9
  112. package/dist/chunk-8g5pe1gr.js +37 -0
  113. package/dist/{chunk-g0j0t6qk.js → chunk-8g747a8x.js} +1 -1
  114. package/dist/{chunk-3vzs2gbq.js → chunk-8gxztyqd.js} +4 -4
  115. package/dist/{chunk-45kxdsp8.js → chunk-8h6sdj66.js} +13 -10
  116. package/dist/{chunk-s8amjdwf.js → chunk-8ht15c7w.js} +7 -7
  117. package/dist/{chunk-ywxd4qw4.js → chunk-8mm8b6dd.js} +2 -5
  118. package/dist/{chunk-sdj9b9wh.js → chunk-8pn8tvgg.js} +9 -154
  119. package/dist/{chunk-pxrffn0w.js → chunk-8vnxjgz9.js} +11 -5
  120. package/dist/chunk-9525p9tg.js +401 -0
  121. package/dist/{chunk-y47cg3kz.js → chunk-9a0rsdre.js} +17 -13
  122. package/dist/chunk-9a2pa53f.js +308 -0
  123. package/dist/chunk-9es2dav7.js +507 -0
  124. package/dist/chunk-9pq45ycx.js +217 -0
  125. package/dist/chunk-9qwkw406.js +121 -0
  126. package/dist/chunk-9rf1x0z9.js +109 -0
  127. package/dist/{chunk-ghmbr193.js → chunk-9rvqx05m.js} +9 -9
  128. package/dist/{chunk-dchkdhzs.js → chunk-9sd3tz3p.js} +91 -75
  129. package/dist/chunk-9x5zgy22.js +12 -0
  130. package/dist/{chunk-q6b51yc5.js → chunk-9z4vq44b.js} +3 -3
  131. package/dist/chunk-a136cvvz.js +27 -0
  132. package/dist/{chunk-8hq5kk3y.js → chunk-a4twdmhf.js} +3 -2
  133. package/dist/{chunk-d18z9pna.js → chunk-a7rhvq9b.js} +2 -2
  134. package/dist/{chunk-pmjqdasm.js → chunk-a8jbqb9f.js} +2313 -4199
  135. package/dist/chunk-a9xhsth1.js +1068 -0
  136. package/dist/{chunk-kd63fbhw.js → chunk-achjqrhd.js} +81 -65
  137. package/dist/{chunk-67kbbt9h.js → chunk-af2vfhm4.js} +42 -31
  138. package/dist/{chunk-js8rvgs1.js → chunk-ahn9tgz7.js} +3 -3
  139. package/dist/chunk-ajets2e9.js +103 -0
  140. package/dist/chunk-akxywws0.js +79 -0
  141. package/dist/{chunk-meefz2g4.js → chunk-aqvgkvsq.js} +7 -7
  142. package/dist/{chunk-r6b58y3x.js → chunk-ase86y73.js} +1 -3
  143. package/dist/{chunk-hjhc4cpt.js → chunk-awb4vc41.js} +2 -2
  144. package/dist/{chunk-1jrcb7cs.js → chunk-b0mt3wzx.js} +37 -82
  145. package/dist/chunk-b4zy6y92.js +105 -0
  146. package/dist/{chunk-ax83mpvw.js → chunk-b65yxs9e.js} +26 -26
  147. package/dist/{chunk-wzx6mmft.js → chunk-b7b39zx2.js} +120 -118
  148. package/dist/{chunk-8bedvdm1.js → chunk-b81hd3m6.js} +1 -1
  149. package/dist/chunk-bbr7mwpv.js +117 -0
  150. package/dist/{chunk-1a61g8t2.js → chunk-bdzqt6gy.js} +83 -64
  151. package/dist/chunk-bkm0zms8.js +110 -0
  152. package/dist/{chunk-0vvej174.js → chunk-bs8r4665.js} +5 -5
  153. package/dist/{chunk-xvc4gp3x.js → chunk-bszdmr4k.js} +24 -24
  154. package/dist/{chunk-8ngxagxq.js → chunk-bt64sq5y.js} +4 -3
  155. package/dist/chunk-bvcpr8qa.js +909 -0
  156. package/dist/chunk-bx811wk6.js +118 -0
  157. package/dist/{chunk-3be7ka25.js → chunk-bxcfz5gy.js} +1 -1
  158. package/dist/{chunk-77g09znh.js → chunk-byv2p9hn.js} +22 -16
  159. package/dist/{chunk-wbkahkdc.js → chunk-c03am3es.js} +8 -6
  160. package/dist/chunk-c1x69s30.js +116 -0
  161. package/dist/chunk-c5vkve4j.js +68 -0
  162. package/dist/chunk-c6sjhj89.js +1284 -0
  163. package/dist/chunk-cb0wxajw.js +142 -0
  164. package/dist/{chunk-vyc0rjyx.js → chunk-cbrt5vsb.js} +1 -1
  165. package/dist/{chunk-4kxr1pwz.js → chunk-cgmy7r62.js} +30 -17
  166. package/dist/chunk-chsyvavm.js +3435 -0
  167. package/dist/{chunk-z72st5c8.js → chunk-cmsknj6n.js} +4774 -3386
  168. package/dist/{chunk-cdz5yb0r.js → chunk-crmjpsqe.js} +13 -2
  169. package/dist/chunk-cs039fnj.js +123 -0
  170. package/dist/{chunk-e7393td6.js → chunk-cznf6k4g.js} +13 -9
  171. package/dist/{chunk-fw49pe3p.js → chunk-cztjpxq4.js} +6 -6
  172. package/dist/{chunk-n8sjmqba.js → chunk-d0n93ge4.js} +141 -100
  173. package/dist/{chunk-spde0bf5.js → chunk-d14ygn80.js} +3 -3
  174. package/dist/chunk-d4mdda98.js +94 -0
  175. package/dist/chunk-d5qggsbm.js +137 -0
  176. package/dist/{chunk-55wgxwa9.js → chunk-d7886r6a.js} +6928 -6935
  177. package/dist/{chunk-eh8h36nt.js → chunk-d9gxtzmz.js} +42 -31
  178. package/dist/{chunk-xk66xrkk.js → chunk-da312cj9.js} +54 -72
  179. package/dist/{chunk-j287ctwr.js → chunk-df19zqjj.js} +77 -61
  180. package/dist/chunk-dm3n2qgd.js +24 -0
  181. package/dist/{chunk-m21hvkn4.js → chunk-dncgrfdt.js} +2 -2
  182. package/dist/{chunk-0nz8sqg4.js → chunk-dq3rw4b5.js} +1294 -873
  183. package/dist/{chunk-ey03t39w.js → chunk-dw1f4b7e.js} +257 -194
  184. package/dist/chunk-dx1jrvdz.js +339 -0
  185. package/dist/{chunk-0ragr30c.js → chunk-dxeadbxq.js} +12 -12
  186. package/dist/{chunk-gdp8wgnd.js → chunk-e8b9gcwf.js} +88 -72
  187. package/dist/chunk-e9k5a3cy.js +409 -0
  188. package/dist/chunk-e9mer45h.js +64 -0
  189. package/dist/{chunk-5qbwrz8m.js → chunk-ea2f7wt3.js} +13 -13
  190. package/dist/chunk-eak7m65m.js +1182 -0
  191. package/dist/chunk-ebhgmeyk.js +245 -0
  192. package/dist/chunk-eg93k7ac.js +117 -0
  193. package/dist/{chunk-jgv78tv0.js → chunk-ej1yvp43.js} +8 -8
  194. package/dist/chunk-ekr8pwpv.js +1408 -0
  195. package/dist/{chunk-m4edbpcz.js → chunk-epg124e3.js} +117 -143
  196. package/dist/chunk-eyqnj23w.js +5368 -0
  197. package/dist/chunk-f2bvkxbw.js +267 -0
  198. package/dist/chunk-f537x96t.js +295 -0
  199. package/dist/chunk-f6wdmebb.js +108 -0
  200. package/dist/chunk-feyzykye.js +10 -0
  201. package/dist/{chunk-ep47dy22.js → chunk-fj3ywwqv.js} +7 -7
  202. package/dist/{chunk-9gttd1xq.js → chunk-fjv7p1kc.js} +4 -4
  203. package/dist/{chunk-1rnkpxy4.js → chunk-fpe5nywt.js} +10 -115
  204. package/dist/chunk-fvpgrg19.js +434 -0
  205. package/dist/{chunk-9xmsmn93.js → chunk-fvqrkmtn.js} +5 -5
  206. package/dist/{chunk-6g62sjpf.js → chunk-fz0ch109.js} +4 -3
  207. package/dist/{chunk-5xz7ts0k.js → chunk-g0vh71q6.js} +188 -339
  208. package/dist/chunk-g1gtvtv8.js +384 -0
  209. package/dist/chunk-g5g9wm20.js +66 -0
  210. package/dist/{chunk-v399mzxk.js → chunk-g63tgj4f.js} +2 -2
  211. package/dist/{chunk-kkkneeg1.js → chunk-gay98970.js} +21 -16
  212. package/dist/chunk-gey7mwcw.js +36 -0
  213. package/dist/{chunk-w5ctjgmx.js → chunk-gtyh1yd1.js} +2 -2
  214. package/dist/{chunk-tjaqa99q.js → chunk-gx8016vp.js} +3 -3
  215. package/dist/{chunk-f2mhrmww.js → chunk-h0rbjg6x.js} +1 -8
  216. package/dist/{chunk-7z8j9qfn.js → chunk-h1mr3371.js} +3 -3
  217. package/dist/chunk-h2yxyeq4.js +132 -0
  218. package/dist/{chunk-qqfa0dqg.js → chunk-h4b85amj.js} +20 -32
  219. package/dist/chunk-h707k8xq.js +64 -0
  220. package/dist/{chunk-3z6rf0m3.js → chunk-h7rcjx8d.js} +5 -5
  221. package/dist/chunk-hch5yeq8.js +121 -0
  222. package/dist/{chunk-4anyx5bv.js → chunk-hd4azb7x.js} +5 -5
  223. package/dist/chunk-hjnbg9qw.js +32 -0
  224. package/dist/{chunk-e2yv57c2.js → chunk-hk9mmkba.js} +8 -8
  225. package/dist/{chunk-f1rrxxcf.js → chunk-hs9w0p45.js} +7 -131
  226. package/dist/{chunk-9f7xza5r.js → chunk-htaan7k0.js} +11 -11
  227. package/dist/chunk-htg84hvs.js +300 -0
  228. package/dist/chunk-hvyr6p4r.js +433 -0
  229. package/dist/chunk-j0r5vkvw.js +267 -0
  230. package/dist/{chunk-9gbamk79.js → chunk-j5bth84e.js} +5 -1
  231. package/dist/{chunk-vratq94g.js → chunk-j9gxwbe3.js} +1 -1
  232. package/dist/{chunk-3r24h7t6.js → chunk-jaaxk89e.js} +1 -1
  233. package/dist/chunk-je7jake4.js +3584 -0
  234. package/dist/chunk-jeqhpyxr.js +126 -0
  235. package/dist/chunk-jngf0nar.js +135 -0
  236. package/dist/chunk-jqjbc5ef.js +795 -0
  237. package/dist/{chunk-xf4wsjdm.js → chunk-jwrmmv7j.js} +9 -7
  238. package/dist/{chunk-j9wpkwjj.js → chunk-jwyzy83k.js} +6 -6
  239. package/dist/chunk-jz8v9sn3.js +228 -0
  240. package/dist/{chunk-bqfnp99q.js → chunk-k3s4yk22.js} +1 -1
  241. package/dist/chunk-k5c09bzv.js +443 -0
  242. package/dist/chunk-kbktwsms.js +372 -0
  243. package/dist/chunk-ke0hn0xr.js +260 -0
  244. package/dist/chunk-kehe7a71.js +41 -0
  245. package/dist/{chunk-1xkekb9y.js → chunk-kfd89dsd.js} +5 -3
  246. package/dist/chunk-ktjjb0k9.js +104 -0
  247. package/dist/{chunk-b74ht3xj.js → chunk-kxgcshx1.js} +78 -62
  248. package/dist/chunk-kz2fpejx.js +651 -0
  249. package/dist/{chunk-zvbpaaa1.js → chunk-kz3ctzg3.js} +110 -115
  250. package/dist/{chunk-72p24c9k.js → chunk-m268mm4c.js} +127 -188
  251. package/dist/{chunk-jafes477.js → chunk-m2bcpk8j.js} +4 -3
  252. package/dist/{chunk-4qv4z794.js → chunk-m32mdkts.js} +42 -31
  253. package/dist/chunk-m74w3187.js +164 -0
  254. package/dist/chunk-m7s7j422.js +166 -0
  255. package/dist/chunk-majhpxx5.js +594 -0
  256. package/dist/{chunk-q6av622g.js → chunk-mdk3xgya.js} +17 -13
  257. package/dist/{chunk-8bw3ft0x.js → chunk-mfcbez9a.js} +4 -4
  258. package/dist/{chunk-df6bwb4a.js → chunk-mj6w3ttg.js} +2 -2
  259. package/dist/{chunk-drrw55jr.js → chunk-mk6kj3q2.js} +1336 -2840
  260. package/dist/{chunk-vqr58rfh.js → chunk-mky388t4.js} +27 -67
  261. package/dist/chunk-mn61mk4v.js +351 -0
  262. package/dist/chunk-mx28h61f.js +1147 -0
  263. package/dist/chunk-my57sgky.js +883 -0
  264. package/dist/{chunk-k48thqgp.js → chunk-myk8saf6.js} +95 -190
  265. package/dist/chunk-n2zdmx4g.js +66 -0
  266. package/dist/{chunk-720qpv6d.js → chunk-n833arxq.js} +79 -63
  267. package/dist/{chunk-w2z5pqd3.js → chunk-n9ktjngj.js} +6 -6
  268. package/dist/{chunk-2tw2ve8h.js → chunk-nb2ntesh.js} +14 -10
  269. package/dist/{chunk-y18mc4m4.js → chunk-nbqv8ref.js} +10 -10
  270. package/dist/{chunk-74v9z7z4.js → chunk-nd4rncgd.js} +3 -13
  271. package/dist/chunk-nda50ze4.js +341 -0
  272. package/dist/{chunk-gb2q3nvc.js → chunk-nea2sah6.js} +5 -5
  273. package/dist/{chunk-t36rb2a8.js → chunk-nefsxetf.js} +294 -500
  274. package/dist/chunk-netzwgv1.js +154 -0
  275. package/dist/chunk-nfk9e540.js +107 -0
  276. package/dist/{chunk-xszk7n10.js → chunk-nh3cd07f.js} +1 -1
  277. package/dist/chunk-njq2hmjy.js +270 -0
  278. package/dist/chunk-nn5j7h8a.js +156 -0
  279. package/dist/{chunk-6fjab2dp.js → chunk-nrvkwzmq.js} +2 -2
  280. package/dist/chunk-nsextsmp.js +360 -0
  281. package/dist/{chunk-amhzxqj4.js → chunk-nt90fta7.js} +5 -5
  282. package/dist/{chunk-qbx1rq4f.js → chunk-p6sqbnqb.js} +193 -327
  283. package/dist/chunk-p8c23zr7.js +61 -0
  284. package/dist/chunk-p8enbwjk.js +183 -0
  285. package/dist/chunk-p8yggvgf.js +436 -0
  286. package/dist/{chunk-96awg5tc.js → chunk-pcfhe19b.js} +80 -17
  287. package/dist/{chunk-sfq65q9w.js → chunk-pgv9sa3a.js} +10 -14
  288. package/dist/chunk-ppwjyveh.js +8 -0
  289. package/dist/chunk-ppxvfp6m.js +424 -0
  290. package/dist/{chunk-zsfxha74.js → chunk-pshjyzq4.js} +8 -7
  291. package/dist/{chunk-35x3tjnr.js → chunk-pwr83fyy.js} +14 -8
  292. package/dist/chunk-q1976kze.js +473 -0
  293. package/dist/chunk-q387p8pp.js +943 -0
  294. package/dist/{chunk-b6av9ny9.js → chunk-q3ffkhnp.js} +132 -20
  295. package/dist/{chunk-w7wgpqcp.js → chunk-q50q8mc5.js} +7 -7
  296. package/dist/{chunk-e5pntxye.js → chunk-q7tpyeb3.js} +6 -4
  297. package/dist/{chunk-7ymfj7m3.js → chunk-q82r31er.js} +1 -1
  298. package/dist/chunk-qajrkk97.js +298 -0
  299. package/dist/chunk-qdazcrd7.js +362 -0
  300. package/dist/chunk-qhwvhgty.js +61 -0
  301. package/dist/{chunk-455a8z6g.js → chunk-qqk0kvsw.js} +138 -98
  302. package/dist/chunk-qqya1xyt.js +513 -0
  303. package/dist/{chunk-mzdwvbb0.js → chunk-qs6wypj1.js} +2 -2
  304. package/dist/chunk-qtahf5s5.js +113 -0
  305. package/dist/{chunk-tj79kfmn.js → chunk-qv9phqbv.js} +7 -7
  306. package/dist/{chunk-r5k04v8g.js → chunk-qyygv221.js} +13 -9
  307. package/dist/{chunk-zfc67eqj.js → chunk-r34f6vwc.js} +4 -4
  308. package/dist/{chunk-nerv0jvx.js → chunk-r59rgjxq.js} +1 -1
  309. package/dist/{chunk-7sb5axvf.js → chunk-r7j395t6.js} +2 -2
  310. package/dist/chunk-rb31sqzm.js +106 -0
  311. package/dist/{chunk-twsxz9ph.js → chunk-rbwy1qmm.js} +42 -31
  312. package/dist/{chunk-99t8enmg.js → chunk-re3crc6t.js} +10 -7
  313. package/dist/chunk-rhw4ayb1.js +6851 -0
  314. package/dist/{chunk-h6wtwdk0.js → chunk-rm31ynek.js} +8 -8
  315. package/dist/{chunk-eqrh0yjm.js → chunk-rr4e4axp.js} +2 -2
  316. package/dist/{chunk-neh2frnn.js → chunk-rs8304k5.js} +6 -6
  317. package/dist/{chunk-gax0fcbx.js → chunk-s1s8qfdh.js} +5 -5
  318. package/dist/{chunk-src9fqj8.js → chunk-s2483y2h.js} +3 -3
  319. package/dist/chunk-s2nhzjmt.js +113 -0
  320. package/dist/{chunk-7jma9mhn.js → chunk-sfhws681.js} +77 -61
  321. package/dist/{chunk-e3g8q4cn.js → chunk-sg66v252.js} +10 -8
  322. package/dist/{chunk-vp25xhav.js → chunk-szyt0xvf.js} +69 -78
  323. package/dist/{chunk-v7455ztd.js → chunk-t7j91et3.js} +86 -67
  324. package/dist/{chunk-mt25echc.js → chunk-tezak8rx.js} +1 -1
  325. package/dist/chunk-tf1p9trz.js +190 -0
  326. package/dist/{chunk-05gxvwvf.js → chunk-tm82sqkr.js} +96 -79
  327. package/dist/chunk-tpjetyb0.js +106 -0
  328. package/dist/chunk-trxvrrac.js +149 -0
  329. package/dist/chunk-tv9pcdnz.js +51 -0
  330. package/dist/{chunk-e5tfw9f7.js → chunk-twh7pzm8.js} +248 -307
  331. package/dist/{chunk-1x2wb3tc.js → chunk-txfvkh0w.js} +8 -8
  332. package/dist/chunk-var1et7e.js +66 -0
  333. package/dist/{chunk-se7v9emp.js → chunk-vbhvx4ma.js} +12 -10
  334. package/dist/{chunk-hqmz36b3.js → chunk-vf612n57.js} +21 -101
  335. package/dist/{chunk-3sdp7ds7.js → chunk-vfcty2ga.js} +10 -10
  336. package/dist/chunk-vhhyv8z8.js +147 -0
  337. package/dist/{chunk-48z7dgy1.js → chunk-vjcxs86z.js} +3 -3
  338. package/dist/{chunk-k5bpc8d5.js → chunk-vmnf3h9c.js} +43 -32
  339. package/dist/{chunk-fpjeh2em.js → chunk-vr7wmmyn.js} +17 -13
  340. package/dist/{chunk-9ewmqkgb.js → chunk-vxp2mhqy.js} +8 -8
  341. package/dist/{chunk-d238zp4m.js → chunk-w4gwnrwa.js} +2 -2
  342. package/dist/{chunk-jhsywyw8.js → chunk-wahkzh83.js} +9 -9
  343. package/dist/chunk-wdd4en5q.js +117 -0
  344. package/dist/{chunk-gm2m2yba.js → chunk-wgfnd174.js} +43 -32
  345. package/dist/chunk-wk1jw4dm.js +139 -0
  346. package/dist/chunk-wnpjc8hg.js +1018 -0
  347. package/dist/chunk-wv1t041q.js +151 -0
  348. package/dist/chunk-wvtmrmaj.js +130 -0
  349. package/dist/chunk-wyavftcj.js +103 -0
  350. package/dist/{chunk-4589pec2.js → chunk-x2dp18yj.js} +18 -46
  351. package/dist/{chunk-fj4hkg6k.js → chunk-x474ybns.js} +79 -110
  352. package/dist/chunk-x67cvhb8.js +134 -0
  353. package/dist/chunk-x6r4v44b.js +8 -0
  354. package/dist/{chunk-s0xfxkys.js → chunk-xk9pxqqx.js} +6 -6
  355. package/dist/{chunk-m06q12hg.js → chunk-xkt36p6r.js} +1 -1
  356. package/dist/{chunk-g653q217.js → chunk-xnav6j8h.js} +62 -374
  357. package/dist/chunk-xrjb0zyc.js +146 -0
  358. package/dist/chunk-xv3era3s.js +8 -0
  359. package/dist/{chunk-p7g7pf3f.js → chunk-y3r7v9pq.js} +4 -4
  360. package/dist/{chunk-3sagmdbp.js → chunk-y4szkj7r.js} +80 -64
  361. package/dist/{chunk-7d2700y8.js → chunk-y8syxjw1.js} +24 -54
  362. package/dist/chunk-y98z50mm.js +158 -0
  363. package/dist/chunk-ycrfxq10.js +123 -0
  364. package/dist/{chunk-8440dz44.js → chunk-yfjzdc0q.js} +9 -9
  365. package/dist/{chunk-cejskpky.js → chunk-ygf7pmmr.js} +145 -153
  366. package/dist/chunk-yha3z3ab.js +259 -0
  367. package/dist/chunk-ym5r3jnk.js +2007 -0
  368. package/dist/{chunk-28r6z9br.js → chunk-ys2gtqb0.js} +1 -3
  369. package/dist/{chunk-rzgtgtaf.js → chunk-ytg2n0dd.js} +7 -7
  370. package/dist/{chunk-q5hb65kq.js → chunk-ytzw9kw1.js} +78 -62
  371. package/dist/chunk-yzx3mhfd.js +110 -0
  372. package/dist/chunk-z1bs6d7k.js +24 -0
  373. package/dist/{chunk-6h9zcxaa.js → chunk-z1mvcq39.js} +4 -4
  374. package/dist/{chunk-gbq6jz9a.js → chunk-z3qhctbk.js} +134 -170
  375. package/dist/chunk-z9jn3442.js +146 -0
  376. package/dist/{chunk-5q7c8vt9.js → chunk-zbsz51qa.js} +41 -32
  377. package/dist/{chunk-n1erf6kh.js → chunk-ze6zvkg6.js} +5 -5
  378. package/dist/{chunk-t0rgmccj.js → chunk-zejm280k.js} +1 -1
  379. package/dist/{chunk-gfkppe34.js → chunk-zf47p99b.js} +10 -10
  380. package/dist/{chunk-53nbpp47.js → chunk-zhtrjznv.js} +557 -1502
  381. package/dist/{chunk-das977za.js → chunk-zq6tz1zv.js} +61 -100
  382. package/dist/chunk-zrw9gm80.js +264 -0
  383. package/dist/chunk-zseb1639.js +37 -0
  384. package/dist/{chunk-spqaamnc.js → chunk-zsgha506.js} +2 -2
  385. package/dist/chunk-zst7b4sp.js +2840 -0
  386. package/dist/{chunk-0xn1zr3e.js → chunk-zxkzzpgd.js} +145 -121
  387. package/dist/{chunk-g3t0act8.js → chunk-zzm33q8x.js} +1 -1
  388. package/dist/cli.js +20 -117
  389. package/dist/download-ripgrep.js +24821 -0
  390. package/dist/vendor/audio-capture/arm64-darwin/audio-capture.node +0 -0
  391. package/dist/vendor/audio-capture/arm64-linux/audio-capture.node +0 -0
  392. package/dist/vendor/audio-capture/arm64-win32/audio-capture.node +0 -0
  393. package/dist/vendor/audio-capture/x64-darwin/audio-capture.node +0 -0
  394. package/dist/vendor/audio-capture/x64-linux/audio-capture.node +0 -0
  395. package/dist/vendor/audio-capture/x64-win32/audio-capture.node +0 -0
  396. package/package.json +22 -14
  397. package/scripts/download-ripgrep.ts +335 -0
  398. package/scripts/postinstall.cjs +319 -0
  399. package/dist/chunk-0gemty6d.js +0 -70
  400. package/dist/chunk-0pjw8y9z.js +0 -2833
  401. package/dist/chunk-1c8z1b5v.js +0 -16
  402. package/dist/chunk-1ebedmba.js +0 -90
  403. package/dist/chunk-1rvz0433.js +0 -722
  404. package/dist/chunk-1wfb8e3m.js +0 -107
  405. package/dist/chunk-2qjywwq4.js +0 -3445
  406. package/dist/chunk-2y659zbj.js +0 -103
  407. package/dist/chunk-41md7gny.js +0 -91
  408. package/dist/chunk-45m062tx.js +0 -2058
  409. package/dist/chunk-4br37gsw.js +0 -107
  410. package/dist/chunk-4nfrc6sq.js +0 -2431
  411. package/dist/chunk-4pdedeb4.js +0 -2644
  412. package/dist/chunk-4wzyhqbt.js +0 -444
  413. package/dist/chunk-4zsw4fhp.js +0 -67
  414. package/dist/chunk-52wv09zw.js +0 -102
  415. package/dist/chunk-55sfqnz4.js +0 -1921
  416. package/dist/chunk-5cd9cptq.js +0 -110
  417. package/dist/chunk-5dbk24zg.js +0 -890
  418. package/dist/chunk-5tfppbkq.js +0 -55
  419. package/dist/chunk-60xyrp86.js +0 -117
  420. package/dist/chunk-6deqb0mc.js +0 -376
  421. package/dist/chunk-6kpbgc5w.js +0 -23
  422. package/dist/chunk-6ndpfxcn.js +0 -222
  423. package/dist/chunk-7nvpa5ex.js +0 -123
  424. package/dist/chunk-7va8tw32.js +0 -128
  425. package/dist/chunk-7z3tkgec.js +0 -66
  426. package/dist/chunk-8e8set87.js +0 -281
  427. package/dist/chunk-8fg1egbv.js +0 -107
  428. package/dist/chunk-8thd6sgk.js +0 -106
  429. package/dist/chunk-8ytkb7k9.js +0 -84
  430. package/dist/chunk-9s5nkgsg.js +0 -699
  431. package/dist/chunk-9wce9hrc.js +0 -1015
  432. package/dist/chunk-9y91z69v.js +0 -44
  433. package/dist/chunk-ae76ded0.js +0 -30
  434. package/dist/chunk-b0eez8w0.js +0 -169
  435. package/dist/chunk-b57sb1dw.js +0 -642
  436. package/dist/chunk-bg3mt9bm.js +0 -28
  437. package/dist/chunk-bhdt6k7w.js +0 -15
  438. package/dist/chunk-bm1qb16p.js +0 -17
  439. package/dist/chunk-bsbmmfyt.js +0 -17
  440. package/dist/chunk-c7q12yes.js +0 -269
  441. package/dist/chunk-cv6y320h.js +0 -299
  442. package/dist/chunk-cvy3vntc.js +0 -65
  443. package/dist/chunk-cy2hswr1.js +0 -15
  444. package/dist/chunk-d5d398m4.js +0 -184
  445. package/dist/chunk-d7q4zp2z.js +0 -89
  446. package/dist/chunk-dnk519qv.js +0 -94
  447. package/dist/chunk-dqqde43e.js +0 -93
  448. package/dist/chunk-dy4ayw0p.js +0 -522
  449. package/dist/chunk-e4ak3jfc.js +0 -1154
  450. package/dist/chunk-e64spn53.js +0 -283
  451. package/dist/chunk-e8pk14j0.js +0 -527
  452. package/dist/chunk-eashsrsv.js +0 -88
  453. package/dist/chunk-eb90vwvr.js +0 -152
  454. package/dist/chunk-ese2g7hc.js +0 -92
  455. package/dist/chunk-et4jnyb5.js +0 -713
  456. package/dist/chunk-fdy0651p.js +0 -212
  457. package/dist/chunk-frsyts9j.js +0 -1170
  458. package/dist/chunk-ft2jssz4.js +0 -424
  459. package/dist/chunk-g41hzcy2.js +0 -101
  460. package/dist/chunk-g8dr8vvj.js +0 -111
  461. package/dist/chunk-gj71pd83.js +0 -5395
  462. package/dist/chunk-gjdwtdch.js +0 -154
  463. package/dist/chunk-gyj242zr.js +0 -20
  464. package/dist/chunk-hr719wjg.js +0 -144
  465. package/dist/chunk-hs8ph4p8.js +0 -8
  466. package/dist/chunk-j7gpr82p.js +0 -105
  467. package/dist/chunk-jczedp5x.js +0 -91
  468. package/dist/chunk-jd0t67a6.js +0 -259
  469. package/dist/chunk-jgyp3mzg.js +0 -1318
  470. package/dist/chunk-jq1kp9yy.js +0 -90
  471. package/dist/chunk-jskhn7bz.js +0 -71
  472. package/dist/chunk-k5aas9d3.js +0 -6108
  473. package/dist/chunk-k8jcy7mj.js +0 -48
  474. package/dist/chunk-ka22ccvm.js +0 -1581
  475. package/dist/chunk-ka6jav10.js +0 -91
  476. package/dist/chunk-kq6j096k.js +0 -538
  477. package/dist/chunk-kqd0e3xj.js +0 -463
  478. package/dist/chunk-kqjrsah4.js +0 -85
  479. package/dist/chunk-m390jta5.js +0 -114
  480. package/dist/chunk-m44a9yfj.js +0 -90
  481. package/dist/chunk-m5c8ng6v.js +0 -328
  482. package/dist/chunk-meag7bbe.js +0 -89
  483. package/dist/chunk-mnsrmwn8.js +0 -604
  484. package/dist/chunk-mzj4mtye.js +0 -115
  485. package/dist/chunk-mzy911jq.js +0 -128
  486. package/dist/chunk-n0fwapk6.js +0 -347
  487. package/dist/chunk-nt0mgsh6.js +0 -496
  488. package/dist/chunk-nwcfrws3.js +0 -273
  489. package/dist/chunk-pa2xksyb.js +0 -57
  490. package/dist/chunk-pnhs96g8.js +0 -140
  491. package/dist/chunk-ps4c75j7.js +0 -105
  492. package/dist/chunk-q0yg73za.js +0 -490
  493. package/dist/chunk-q5by3da6.js +0 -8
  494. package/dist/chunk-qbmhde47.js +0 -92
  495. package/dist/chunk-qp3dw7b4.js +0 -100
  496. package/dist/chunk-qt0b9x2w.js +0 -42
  497. package/dist/chunk-qxe98jgk.js +0 -584
  498. package/dist/chunk-r7n42k56.js +0 -756
  499. package/dist/chunk-radsjrmv.js +0 -55
  500. package/dist/chunk-rckj9gd1.js +0 -55
  501. package/dist/chunk-rn4kqfvd.js +0 -99
  502. package/dist/chunk-rngmdt2v.js +0 -97
  503. package/dist/chunk-rs5e0520.js +0 -87
  504. package/dist/chunk-s274nv8k.js +0 -8
  505. package/dist/chunk-s7t2e2tw.js +0 -1493
  506. package/dist/chunk-sbbt0ct3.js +0 -90
  507. package/dist/chunk-t0mnk0qp.js +0 -105
  508. package/dist/chunk-t1qmy36p.js +0 -94
  509. package/dist/chunk-tdy66rf9.js +0 -116
  510. package/dist/chunk-tf40vqky.js +0 -70
  511. package/dist/chunk-tmcxeatp.js +0 -116
  512. package/dist/chunk-v3gm2day.js +0 -8
  513. package/dist/chunk-v496te8v.js +0 -192
  514. package/dist/chunk-vd2hwk8d.js +0 -61
  515. package/dist/chunk-vdsmt7v0.js +0 -998
  516. package/dist/chunk-vf3qxte3.js +0 -93
  517. package/dist/chunk-vfqe1jqj.js +0 -643
  518. package/dist/chunk-vk3270s6.js +0 -119
  519. package/dist/chunk-vsr9mbnq.js +0 -195
  520. package/dist/chunk-w18zryr9.js +0 -348
  521. package/dist/chunk-wdxcgk6m.js +0 -196
  522. package/dist/chunk-wef07p3j.js +0 -131
  523. package/dist/chunk-wf4q1xj3.js +0 -62
  524. package/dist/chunk-wjq4zq3t.js +0 -162
  525. package/dist/chunk-wp4hc4n7.js +0 -133
  526. package/dist/chunk-x0rjttct.js +0 -420
  527. package/dist/chunk-xdw5dv00.js +0 -8
  528. package/dist/chunk-xm8fv5c9.js +0 -469
  529. package/dist/chunk-xq5ztz4g.js +0 -130
  530. package/dist/chunk-xvcdtezw.js +0 -401
  531. package/dist/chunk-y7njq3z3.js +0 -1866
  532. package/dist/chunk-ycxwftfh.js +0 -97
  533. package/dist/chunk-yn38f69a.js +0 -105
  534. package/dist/chunk-yp5kc8hq.js +0 -372
  535. package/dist/chunk-z09n2krq.js +0 -752
  536. package/dist/chunk-zerg8qwf.js +0 -96
  537. package/dist/{chunk-p452k1xp.js → chunk-57s5mr32.js} +9 -9
  538. package/dist/{chunk-27xc1csx.js → chunk-dggvswz1.js} +3 -3
  539. package/dist/{chunk-zxzwfa0b.js → chunk-pbyq1tm3.js} +3 -3
@@ -0,0 +1,2535 @@
1
+ // @bun
2
+ import {
3
+ ConfigurableShortcutHint,
4
+ OAuthService,
5
+ Select,
6
+ SelectMulti,
7
+ Spinner,
8
+ TextInput,
9
+ init_ConfigurableShortcutHint,
10
+ init_CustomSelect,
11
+ init_SelectMulti,
12
+ init_Spinner,
13
+ init_TextInput,
14
+ init_oauth,
15
+ init_useTerminalSize,
16
+ useTerminalSize
17
+ } from "./chunk-4m6k7588.js";
18
+ import"./chunk-nea2sah6.js";
19
+ import"./chunk-rs8304k5.js";
20
+ import"./chunk-1c2qp0ks.js";
21
+ import"./chunk-9z4vq44b.js";
22
+ import"./chunk-zejm280k.js";
23
+ import"./chunk-4nspekjp.js";
24
+ import"./chunk-var1et7e.js";
25
+ import"./chunk-ehtwnxpg.js";
26
+ import"./chunk-akxywws0.js";
27
+ import"./chunk-zf47p99b.js";
28
+ import"./chunk-bxcfz5gy.js";
29
+ import"./chunk-1xbs4yb6.js";
30
+ import"./chunk-2gzv8nrw.js";
31
+ import"./chunk-8h6sdj66.js";
32
+ import"./chunk-cgfdkzhb.js";
33
+ import"./chunk-6eg4c33n.js";
34
+ import {
35
+ init_useExitOnCtrlCDWithKeybindings,
36
+ useExitOnCtrlCDWithKeybindings
37
+ } from "./chunk-2cctz9ww.js";
38
+ import"./chunk-j5bth84e.js";
39
+ import"./chunk-d0n93ge4.js";
40
+ import"./chunk-5pevjsyw.js";
41
+ import {
42
+ init_useKeybinding,
43
+ useKeybinding,
44
+ useKeybindings
45
+ } from "./chunk-xnav6j8h.js";
46
+ import"./chunk-ps49ymvj.js";
47
+ import"./chunk-zk2wsm7d.js";
48
+ import"./chunk-2t0xa4dt.js";
49
+ import"./chunk-pwr83fyy.js";
50
+ import"./chunk-hjnbg9qw.js";
51
+ import"./chunk-zsgha506.js";
52
+ import"./chunk-4jm600zv.js";
53
+ import {
54
+ init_browser,
55
+ openBrowser
56
+ } from "./chunk-xkt36p6r.js";
57
+ import"./chunk-585cb3h6.js";
58
+ import"./chunk-xk9pxqqx.js";
59
+ import"./chunk-mx28h61f.js";
60
+ import"./chunk-bx811wk6.js";
61
+ import"./chunk-8vnxjgz9.js";
62
+ import"./chunk-2v8cya3p.js";
63
+ import"./chunk-eyqnj23w.js";
64
+ import"./chunk-chsyvavm.js";
65
+ import"./chunk-6mpw9h55.js";
66
+ import {
67
+ getAnthropicApiKey,
68
+ init_auth,
69
+ init_config1 as init_config,
70
+ init_stringUtils,
71
+ isAnthropicAuthEnabled,
72
+ plural,
73
+ saveGlobalConfig,
74
+ saveOAuthTokensIfNeeded
75
+ } from "./chunk-zhtrjznv.js";
76
+ import"./chunk-sg66v252.js";
77
+ import"./chunk-8bwqtasa.js";
78
+ import"./chunk-j9gxwbe3.js";
79
+ import"./chunk-cztjpxq4.js";
80
+ import"./chunk-1cwdhk7a.js";
81
+ import"./chunk-64c1avct.js";
82
+ import"./chunk-8g5pe1gr.js";
83
+ import"./chunk-gx8016vp.js";
84
+ import"./chunk-4cp6193g.js";
85
+ import"./chunk-8g747a8x.js";
86
+ import"./chunk-d7886r6a.js";
87
+ import"./chunk-f5ma3nh5.js";
88
+ import"./chunk-qz2x630m.js";
89
+ import"./chunk-r7j395t6.js";
90
+ import"./chunk-tv9pcdnz.js";
91
+ import"./chunk-3c25bcsw.js";
92
+ import"./chunk-n9ktjngj.js";
93
+ import"./chunk-q82r31er.js";
94
+ import"./chunk-p2816w9z.js";
95
+ import"./chunk-v9smspw2.js";
96
+ import"./chunk-v1kzp02e.js";
97
+ import"./chunk-64hks9ax.js";
98
+ import"./chunk-crmjpsqe.js";
99
+ import {
100
+ Byline,
101
+ Dialog,
102
+ KeyboardShortcutHint,
103
+ Link,
104
+ ThemedBox_default,
105
+ ThemedText,
106
+ color,
107
+ init_src,
108
+ setClipboard,
109
+ useTheme
110
+ } from "./chunk-cmsknj6n.js";
111
+ import {
112
+ require_jsx_dev_runtime,
113
+ require_react
114
+ } from "./chunk-g338npwr.js";
115
+ import {
116
+ init_analytics,
117
+ logEvent
118
+ } from "./chunk-h0rbjg6x.js";
119
+ import"./chunk-0vkfrmqm.js";
120
+ import"./chunk-0xjaqda8.js";
121
+ import"./chunk-h1mr3371.js";
122
+ import {
123
+ getGithubRepo,
124
+ init_git
125
+ } from "./chunk-36b2q5fg.js";
126
+ import"./chunk-a7rhvq9b.js";
127
+ import"./chunk-qnfx3qtx.js";
128
+ import {
129
+ execFileNoThrow,
130
+ init_execFileNoThrow
131
+ } from "./chunk-m74w3187.js";
132
+ import"./chunk-b81hd3m6.js";
133
+ import {
134
+ init_log,
135
+ logError
136
+ } from "./chunk-y3r7v9pq.js";
137
+ import"./chunk-8tnsngw2.js";
138
+ import"./chunk-awb4vc41.js";
139
+ import"./chunk-cbrt5vsb.js";
140
+ import {
141
+ execa,
142
+ init_execa
143
+ } from "./chunk-5z28bqne.js";
144
+ import {
145
+ figures_default,
146
+ init_figures
147
+ } from "./chunk-qajrkk97.js";
148
+ import"./chunk-404qm8xt.js";
149
+ import"./chunk-fbv4apne.js";
150
+ import"./chunk-jaaxk89e.js";
151
+ import"./chunk-h4b85amj.js";
152
+ import"./chunk-07069jq1.js";
153
+ import"./chunk-vf612n57.js";
154
+ import"./chunk-d4mdda98.js";
155
+ import"./chunk-7wm5s02e.js";
156
+ import"./chunk-4g3v8y12.js";
157
+ import"./chunk-7739pg2c.js";
158
+ import"./chunk-nh3cd07f.js";
159
+ import"./chunk-8pn8tvgg.js";
160
+ import"./chunk-netzwgv1.js";
161
+ import {
162
+ __esm,
163
+ __toESM
164
+ } from "./chunk-qp2qdcda.js";
165
+
166
+ // src/components/WorkflowMultiselectDialog.tsx
167
+ function renderInputGuide(exitState) {
168
+ if (exitState.pending) {
169
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
170
+ children: [
171
+ "Press ",
172
+ exitState.keyName,
173
+ " again to exit"
174
+ ]
175
+ }, undefined, true, undefined, this);
176
+ }
177
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Byline, {
178
+ children: [
179
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(KeyboardShortcutHint, {
180
+ shortcut: "\u2191\u2193",
181
+ action: "navigate"
182
+ }, undefined, false, undefined, this),
183
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(KeyboardShortcutHint, {
184
+ shortcut: "Space",
185
+ action: "toggle"
186
+ }, undefined, false, undefined, this),
187
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(KeyboardShortcutHint, {
188
+ shortcut: "Enter",
189
+ action: "confirm"
190
+ }, undefined, false, undefined, this),
191
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ConfigurableShortcutHint, {
192
+ action: "confirm:no",
193
+ context: "Confirmation",
194
+ fallback: "Esc",
195
+ description: "cancel"
196
+ }, undefined, false, undefined, this)
197
+ ]
198
+ }, undefined, true, undefined, this);
199
+ }
200
+ function WorkflowMultiselectDialog({
201
+ onSubmit,
202
+ defaultSelections
203
+ }) {
204
+ const [showError, setShowError] = import_react.useState(false);
205
+ const handleSubmit = import_react.useCallback((selectedValues) => {
206
+ if (selectedValues.length === 0) {
207
+ setShowError(true);
208
+ return;
209
+ }
210
+ setShowError(false);
211
+ onSubmit(selectedValues);
212
+ }, [onSubmit]);
213
+ const handleChange = import_react.useCallback(() => {
214
+ setShowError(false);
215
+ }, []);
216
+ const handleCancel = import_react.useCallback(() => {
217
+ setShowError(true);
218
+ }, []);
219
+ return /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Dialog, {
220
+ title: "Select GitHub workflows to install",
221
+ subtitle: "We'll create a workflow file in your repository for each one you select.",
222
+ onCancel: handleCancel,
223
+ inputGuide: renderInputGuide,
224
+ children: [
225
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
226
+ children: /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
227
+ dimColor: true,
228
+ children: [
229
+ "More workflow examples (issue triage, CI fixes, etc.) at:",
230
+ " ",
231
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(Link, {
232
+ url: "https://github.com/anthropics/claude-code-action/blob/main/examples/",
233
+ children: "https://github.com/anthropics/claude-code-action/blob/main/examples/"
234
+ }, undefined, false, undefined, this)
235
+ ]
236
+ }, undefined, true, undefined, this)
237
+ }, undefined, false, undefined, this),
238
+ /* @__PURE__ */ jsx_dev_runtime.jsxDEV(SelectMulti, {
239
+ options: WORKFLOWS.map((workflow) => ({
240
+ label: workflow.label,
241
+ value: workflow.value
242
+ })),
243
+ defaultValue: defaultSelections,
244
+ onSubmit: handleSubmit,
245
+ onChange: handleChange,
246
+ onCancel: handleCancel,
247
+ hideIndexes: true
248
+ }, undefined, false, undefined, this),
249
+ showError && /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedBox_default, {
250
+ children: /* @__PURE__ */ jsx_dev_runtime.jsxDEV(ThemedText, {
251
+ color: "error",
252
+ children: "You must select at least one workflow to continue"
253
+ }, undefined, false, undefined, this)
254
+ }, undefined, false, undefined, this)
255
+ ]
256
+ }, undefined, true, undefined, this);
257
+ }
258
+ var import_react, jsx_dev_runtime, WORKFLOWS;
259
+ var init_WorkflowMultiselectDialog = __esm(() => {
260
+ init_src();
261
+ init_ConfigurableShortcutHint();
262
+ init_SelectMulti();
263
+ import_react = __toESM(require_react(), 1);
264
+ jsx_dev_runtime = __toESM(require_jsx_dev_runtime(), 1);
265
+ WORKFLOWS = [
266
+ {
267
+ value: "claude",
268
+ label: "@Claude Code - Tag @claude in issues and PR comments"
269
+ },
270
+ {
271
+ value: "claude-review",
272
+ label: "Claude Code Review - Automated code review on new PRs"
273
+ }
274
+ ];
275
+ });
276
+
277
+ // src/constants/github-app.ts
278
+ var PR_TITLE = "Add Claude Code GitHub Workflow", GITHUB_ACTION_SETUP_DOCS_URL = "https://github.com/anthropics/claude-code-action/blob/main/docs/setup.md", WORKFLOW_CONTENT = `name: Claude Code
279
+
280
+ on:
281
+ issue_comment:
282
+ types: [created]
283
+ pull_request_review_comment:
284
+ types: [created]
285
+ issues:
286
+ types: [opened, assigned]
287
+ pull_request_review:
288
+ types: [submitted]
289
+
290
+ jobs:
291
+ claude:
292
+ if: |
293
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
294
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
295
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
296
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
297
+ runs-on: ubuntu-latest
298
+ permissions:
299
+ contents: read
300
+ pull-requests: read
301
+ issues: read
302
+ id-token: write
303
+ actions: read # Required for Claude to read CI results on PRs
304
+ steps:
305
+ - name: Checkout repository
306
+ uses: actions/checkout@v4
307
+ with:
308
+ fetch-depth: 1
309
+
310
+ - name: Run Claude Code
311
+ id: claude
312
+ uses: anthropics/claude-code-action@v1
313
+ with:
314
+ anthropic_api_key: \${{ secrets.ANTHROPIC_API_KEY }}
315
+
316
+ # This is an optional setting that allows Claude to read CI results on PRs
317
+ additional_permissions: |
318
+ actions: read
319
+
320
+ # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
321
+ # prompt: 'Update the pull request description to include a summary of changes.'
322
+
323
+ # Optional: Add claude_args to customize behavior and configuration
324
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
325
+ # or https://code.claude.com/docs/en/cli-reference for available options
326
+ # claude_args: '--allowed-tools Bash(gh pr:*)'
327
+
328
+ `, PR_BODY = `## \uD83E\uDD16 Installing Claude Code GitHub App
329
+
330
+ This PR adds a GitHub Actions workflow that enables Claude Code integration in our repository.
331
+
332
+ ### What is Claude Code?
333
+
334
+ [Claude Code](https://claude.com/claude-code) is an AI coding agent that can help with:
335
+ - Bug fixes and improvements
336
+ - Documentation updates
337
+ - Implementing new features
338
+ - Code reviews and suggestions
339
+ - Writing tests
340
+ - And more!
341
+
342
+ ### How it works
343
+
344
+ Once this PR is merged, we'll be able to interact with Claude by mentioning @claude in a pull request or issue comment.
345
+ Once the workflow is triggered, Claude will analyze the comment and surrounding context, and execute on the request in a GitHub action.
346
+
347
+ ### Important Notes
348
+
349
+ - **This workflow won't take effect until this PR is merged**
350
+ - **@claude mentions won't work until after the merge is complete**
351
+ - The workflow runs automatically whenever Claude is mentioned in PR or issue comments
352
+ - Claude gets access to the entire PR or issue context including files, diffs, and previous comments
353
+
354
+ ### Security
355
+
356
+ - Our Anthropic API key is securely stored as a GitHub Actions secret
357
+ - Only users with write access to the repository can trigger the workflow
358
+ - All Claude runs are stored in the GitHub Actions run history
359
+ - Claude's default tools are limited to reading/writing files and interacting with our repo by creating comments, branches, and commits.
360
+ - We can add more allowed tools by adding them to the workflow file like:
361
+
362
+ \`\`\`
363
+ allowed_tools: Bash(npm install),Bash(npm run build),Bash(npm run lint),Bash(npm run test)
364
+ \`\`\`
365
+
366
+ There's more information in the [Claude Code action repo](https://github.com/anthropics/claude-code-action).
367
+
368
+ After merging this PR, let's try mentioning @claude in a comment on any PR to get started!`, CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT = `name: Claude Code Review
369
+
370
+ on:
371
+ pull_request:
372
+ types: [opened, synchronize, ready_for_review, reopened]
373
+ # Optional: Only run on specific file changes
374
+ # paths:
375
+ # - "src/**/*.ts"
376
+ # - "src/**/*.tsx"
377
+ # - "src/**/*.js"
378
+ # - "src/**/*.jsx"
379
+
380
+ jobs:
381
+ claude-review:
382
+ # Optional: Filter by PR author
383
+ # if: |
384
+ # github.event.pull_request.user.login == 'external-contributor' ||
385
+ # github.event.pull_request.user.login == 'new-developer' ||
386
+ # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
387
+
388
+ runs-on: ubuntu-latest
389
+ permissions:
390
+ contents: read
391
+ pull-requests: read
392
+ issues: read
393
+ id-token: write
394
+
395
+ steps:
396
+ - name: Checkout repository
397
+ uses: actions/checkout@v4
398
+ with:
399
+ fetch-depth: 1
400
+
401
+ - name: Run Claude Code Review
402
+ id: claude-review
403
+ uses: anthropics/claude-code-action@v1
404
+ with:
405
+ anthropic_api_key: \${{ secrets.ANTHROPIC_API_KEY }}
406
+ plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
407
+ plugins: 'code-review@claude-code-plugins'
408
+ prompt: '/code-review:code-review \${{ github.repository }}/pull/\${{ github.event.pull_request.number }}'
409
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
410
+ # or https://code.claude.com/docs/en/cli-reference for available options
411
+
412
+ `;
413
+ var init_github_app = () => {};
414
+
415
+ // src/commands/install-github-app/ApiKeyStep.tsx
416
+ function ApiKeyStep({
417
+ existingApiKey,
418
+ apiKeyOrOAuthToken,
419
+ onApiKeyChange,
420
+ onSubmit,
421
+ onToggleUseExistingKey,
422
+ onCreateOAuthToken,
423
+ selectedOption = existingApiKey ? "existing" : onCreateOAuthToken ? "oauth" : "new",
424
+ onSelectOption
425
+ }) {
426
+ const [cursorOffset, setCursorOffset] = import_react2.useState(0);
427
+ const terminalSize = useTerminalSize();
428
+ const [theme] = useTheme();
429
+ const handlePrevious = import_react2.useCallback(() => {
430
+ if (selectedOption === "new" && onCreateOAuthToken) {
431
+ onSelectOption?.("oauth");
432
+ } else if (selectedOption === "oauth" && existingApiKey) {
433
+ onSelectOption?.("existing");
434
+ onToggleUseExistingKey(true);
435
+ }
436
+ }, [
437
+ selectedOption,
438
+ onCreateOAuthToken,
439
+ existingApiKey,
440
+ onSelectOption,
441
+ onToggleUseExistingKey
442
+ ]);
443
+ const handleNext = import_react2.useCallback(() => {
444
+ if (selectedOption === "existing") {
445
+ onSelectOption?.(onCreateOAuthToken ? "oauth" : "new");
446
+ onToggleUseExistingKey(false);
447
+ } else if (selectedOption === "oauth") {
448
+ onSelectOption?.("new");
449
+ }
450
+ }, [
451
+ selectedOption,
452
+ onCreateOAuthToken,
453
+ onSelectOption,
454
+ onToggleUseExistingKey
455
+ ]);
456
+ const handleConfirm = import_react2.useCallback(() => {
457
+ if (selectedOption === "oauth" && onCreateOAuthToken) {
458
+ onCreateOAuthToken();
459
+ } else {
460
+ onSubmit();
461
+ }
462
+ }, [selectedOption, onCreateOAuthToken, onSubmit]);
463
+ const isTextInputVisible = selectedOption === "new";
464
+ useKeybindings({
465
+ "confirm:previous": handlePrevious,
466
+ "confirm:next": handleNext,
467
+ "confirm:yes": handleConfirm
468
+ }, { context: "Confirmation", isActive: !isTextInputVisible });
469
+ useKeybindings({
470
+ "confirm:previous": handlePrevious,
471
+ "confirm:next": handleNext
472
+ }, { context: "Confirmation", isActive: isTextInputVisible });
473
+ return /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(jsx_dev_runtime2.Fragment, {
474
+ children: [
475
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
476
+ flexDirection: "column",
477
+ borderStyle: "round",
478
+ paddingX: 1,
479
+ children: [
480
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
481
+ flexDirection: "column",
482
+ marginBottom: 1,
483
+ children: [
484
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
485
+ bold: true,
486
+ children: "Install GitHub App"
487
+ }, undefined, false, undefined, this),
488
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
489
+ dimColor: true,
490
+ children: "Choose API key"
491
+ }, undefined, false, undefined, this)
492
+ ]
493
+ }, undefined, true, undefined, this),
494
+ existingApiKey && /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
495
+ marginBottom: 1,
496
+ children: /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
497
+ children: [
498
+ selectedOption === "existing" ? color("success", theme)("> ") : " ",
499
+ "Use your existing Claude Code API key"
500
+ ]
501
+ }, undefined, true, undefined, this)
502
+ }, undefined, false, undefined, this),
503
+ onCreateOAuthToken && /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
504
+ marginBottom: 1,
505
+ children: /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
506
+ children: [
507
+ selectedOption === "oauth" ? color("success", theme)("> ") : " ",
508
+ "Create a long-lived token with your Claude subscription"
509
+ ]
510
+ }, undefined, true, undefined, this)
511
+ }, undefined, false, undefined, this),
512
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
513
+ marginBottom: 1,
514
+ children: /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
515
+ children: [
516
+ selectedOption === "new" ? color("success", theme)("> ") : " ",
517
+ "Enter a new API key"
518
+ ]
519
+ }, undefined, true, undefined, this)
520
+ }, undefined, false, undefined, this),
521
+ selectedOption === "new" && /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(TextInput, {
522
+ value: apiKeyOrOAuthToken,
523
+ onChange: onApiKeyChange,
524
+ onSubmit,
525
+ onPaste: onApiKeyChange,
526
+ focus: true,
527
+ placeholder: "sk-ant\u2026 (Create a new key at https://platform.claude.com/settings/keys)",
528
+ mask: "*",
529
+ columns: terminalSize.columns,
530
+ cursorOffset,
531
+ onChangeCursorOffset: setCursorOffset,
532
+ showCursor: true
533
+ }, undefined, false, undefined, this)
534
+ ]
535
+ }, undefined, true, undefined, this),
536
+ /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedBox_default, {
537
+ marginLeft: 3,
538
+ children: /* @__PURE__ */ jsx_dev_runtime2.jsxDEV(ThemedText, {
539
+ dimColor: true,
540
+ children: "\u2191/\u2193 to select \xB7 Enter to continue"
541
+ }, undefined, false, undefined, this)
542
+ }, undefined, false, undefined, this)
543
+ ]
544
+ }, undefined, true, undefined, this);
545
+ }
546
+ var import_react2, jsx_dev_runtime2;
547
+ var init_ApiKeyStep = __esm(() => {
548
+ init_TextInput();
549
+ init_useTerminalSize();
550
+ init_src();
551
+ init_useKeybinding();
552
+ import_react2 = __toESM(require_react(), 1);
553
+ jsx_dev_runtime2 = __toESM(require_jsx_dev_runtime(), 1);
554
+ });
555
+
556
+ // src/commands/install-github-app/CheckExistingSecretStep.tsx
557
+ function CheckExistingSecretStep({
558
+ useExistingSecret,
559
+ secretName,
560
+ onToggleUseExistingSecret,
561
+ onSecretNameChange,
562
+ onSubmit
563
+ }) {
564
+ const [cursorOffset, setCursorOffset] = import_react3.useState(0);
565
+ const terminalSize = useTerminalSize();
566
+ const [theme] = useTheme();
567
+ const handlePrevious = import_react3.useCallback(() => onToggleUseExistingSecret(true), [onToggleUseExistingSecret]);
568
+ const handleNext = import_react3.useCallback(() => onToggleUseExistingSecret(false), [onToggleUseExistingSecret]);
569
+ useKeybindings({
570
+ "confirm:previous": handlePrevious,
571
+ "confirm:next": handleNext,
572
+ "confirm:yes": onSubmit
573
+ }, { context: "Confirmation", isActive: useExistingSecret });
574
+ useKeybindings({
575
+ "confirm:previous": handlePrevious,
576
+ "confirm:next": handleNext
577
+ }, { context: "Confirmation", isActive: !useExistingSecret });
578
+ return /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(jsx_dev_runtime3.Fragment, {
579
+ children: [
580
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
581
+ flexDirection: "column",
582
+ borderStyle: "round",
583
+ paddingX: 1,
584
+ children: [
585
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
586
+ flexDirection: "column",
587
+ marginBottom: 1,
588
+ children: [
589
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
590
+ bold: true,
591
+ children: "Install GitHub App"
592
+ }, undefined, false, undefined, this),
593
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
594
+ dimColor: true,
595
+ children: "Setup API key secret"
596
+ }, undefined, false, undefined, this)
597
+ ]
598
+ }, undefined, true, undefined, this),
599
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
600
+ marginBottom: 1,
601
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
602
+ color: "warning",
603
+ children: "ANTHROPIC_API_KEY already exists in repository secrets!"
604
+ }, undefined, false, undefined, this)
605
+ }, undefined, false, undefined, this),
606
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
607
+ marginBottom: 1,
608
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
609
+ children: "Would you like to:"
610
+ }, undefined, false, undefined, this)
611
+ }, undefined, false, undefined, this),
612
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
613
+ marginBottom: 1,
614
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
615
+ children: [
616
+ useExistingSecret ? color("success", theme)("> ") : " ",
617
+ "Use the existing API key"
618
+ ]
619
+ }, undefined, true, undefined, this)
620
+ }, undefined, false, undefined, this),
621
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
622
+ marginBottom: 1,
623
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
624
+ children: [
625
+ !useExistingSecret ? color("success", theme)("> ") : " ",
626
+ "Create a new secret with a different name"
627
+ ]
628
+ }, undefined, true, undefined, this)
629
+ }, undefined, false, undefined, this),
630
+ !useExistingSecret && /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(jsx_dev_runtime3.Fragment, {
631
+ children: [
632
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
633
+ marginBottom: 1,
634
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
635
+ children: "Enter new secret name (alphanumeric with underscores):"
636
+ }, undefined, false, undefined, this)
637
+ }, undefined, false, undefined, this),
638
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(TextInput, {
639
+ value: secretName,
640
+ onChange: onSecretNameChange,
641
+ onSubmit,
642
+ focus: true,
643
+ placeholder: "e.g., CLAUDE_API_KEY",
644
+ columns: terminalSize.columns,
645
+ cursorOffset,
646
+ onChangeCursorOffset: setCursorOffset,
647
+ showCursor: true
648
+ }, undefined, false, undefined, this)
649
+ ]
650
+ }, undefined, true, undefined, this)
651
+ ]
652
+ }, undefined, true, undefined, this),
653
+ /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedBox_default, {
654
+ marginLeft: 3,
655
+ children: /* @__PURE__ */ jsx_dev_runtime3.jsxDEV(ThemedText, {
656
+ dimColor: true,
657
+ children: "\u2191/\u2193 to select \xB7 Enter to continue"
658
+ }, undefined, false, undefined, this)
659
+ }, undefined, false, undefined, this)
660
+ ]
661
+ }, undefined, true, undefined, this);
662
+ }
663
+ var import_react3, jsx_dev_runtime3;
664
+ var init_CheckExistingSecretStep = __esm(() => {
665
+ init_TextInput();
666
+ init_useTerminalSize();
667
+ init_src();
668
+ init_useKeybinding();
669
+ import_react3 = __toESM(require_react(), 1);
670
+ jsx_dev_runtime3 = __toESM(require_jsx_dev_runtime(), 1);
671
+ });
672
+
673
+ // src/commands/install-github-app/CheckGitHubStep.tsx
674
+ function CheckGitHubStep() {
675
+ return /* @__PURE__ */ jsx_dev_runtime4.jsxDEV(ThemedText, {
676
+ children: "Checking GitHub CLI installation\u2026"
677
+ }, undefined, false, undefined, this);
678
+ }
679
+ var jsx_dev_runtime4;
680
+ var init_CheckGitHubStep = __esm(() => {
681
+ init_src();
682
+ jsx_dev_runtime4 = __toESM(require_jsx_dev_runtime(), 1);
683
+ });
684
+
685
+ // src/commands/install-github-app/ChooseRepoStep.tsx
686
+ function ChooseRepoStep({
687
+ currentRepo,
688
+ useCurrentRepo,
689
+ repoUrl,
690
+ onRepoUrlChange,
691
+ onSubmit,
692
+ onToggleUseCurrentRepo
693
+ }) {
694
+ const [cursorOffset, setCursorOffset] = import_react4.useState(0);
695
+ const [showEmptyError, setShowEmptyError] = import_react4.useState(false);
696
+ const terminalSize = useTerminalSize();
697
+ const textInputColumns = terminalSize.columns;
698
+ const handleSubmit = import_react4.useCallback(() => {
699
+ const repoName = useCurrentRepo ? currentRepo : repoUrl;
700
+ if (!repoName?.trim()) {
701
+ setShowEmptyError(true);
702
+ return;
703
+ }
704
+ onSubmit();
705
+ }, [useCurrentRepo, currentRepo, repoUrl, onSubmit]);
706
+ const isTextInputVisible = !useCurrentRepo || !currentRepo;
707
+ const handlePrevious = import_react4.useCallback(() => {
708
+ onToggleUseCurrentRepo(true);
709
+ setShowEmptyError(false);
710
+ }, [onToggleUseCurrentRepo]);
711
+ const handleNext = import_react4.useCallback(() => {
712
+ onToggleUseCurrentRepo(false);
713
+ setShowEmptyError(false);
714
+ }, [onToggleUseCurrentRepo]);
715
+ useKeybindings({
716
+ "confirm:previous": handlePrevious,
717
+ "confirm:next": handleNext,
718
+ "confirm:yes": handleSubmit
719
+ }, { context: "Confirmation", isActive: !isTextInputVisible });
720
+ useKeybindings({
721
+ "confirm:previous": handlePrevious,
722
+ "confirm:next": handleNext
723
+ }, { context: "Confirmation", isActive: isTextInputVisible });
724
+ return /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(jsx_dev_runtime5.Fragment, {
725
+ children: [
726
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
727
+ flexDirection: "column",
728
+ borderStyle: "round",
729
+ paddingX: 1,
730
+ children: [
731
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
732
+ flexDirection: "column",
733
+ marginBottom: 1,
734
+ children: [
735
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
736
+ bold: true,
737
+ children: "Install GitHub App"
738
+ }, undefined, false, undefined, this),
739
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
740
+ dimColor: true,
741
+ children: "Select GitHub repository"
742
+ }, undefined, false, undefined, this)
743
+ ]
744
+ }, undefined, true, undefined, this),
745
+ currentRepo && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
746
+ marginBottom: 1,
747
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
748
+ bold: useCurrentRepo,
749
+ color: useCurrentRepo ? "permission" : undefined,
750
+ children: [
751
+ useCurrentRepo ? "> " : " ",
752
+ "Use current repository: ",
753
+ currentRepo
754
+ ]
755
+ }, undefined, true, undefined, this)
756
+ }, undefined, false, undefined, this),
757
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
758
+ marginBottom: 1,
759
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
760
+ bold: !useCurrentRepo || !currentRepo,
761
+ color: !useCurrentRepo || !currentRepo ? "permission" : undefined,
762
+ children: [
763
+ !useCurrentRepo || !currentRepo ? "> " : " ",
764
+ currentRepo ? "Enter a different repository" : "Enter repository"
765
+ ]
766
+ }, undefined, true, undefined, this)
767
+ }, undefined, false, undefined, this),
768
+ (!useCurrentRepo || !currentRepo) && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
769
+ marginLeft: 2,
770
+ marginBottom: 1,
771
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(TextInput, {
772
+ value: repoUrl,
773
+ onChange: (value) => {
774
+ onRepoUrlChange(value);
775
+ setShowEmptyError(false);
776
+ },
777
+ onSubmit: handleSubmit,
778
+ focus: true,
779
+ placeholder: "Enter a repo as owner/repo or https://github.com/owner/repo\u2026",
780
+ columns: textInputColumns,
781
+ cursorOffset,
782
+ onChangeCursorOffset: setCursorOffset,
783
+ showCursor: true
784
+ }, undefined, false, undefined, this)
785
+ }, undefined, false, undefined, this)
786
+ ]
787
+ }, undefined, true, undefined, this),
788
+ showEmptyError && /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
789
+ marginLeft: 3,
790
+ marginBottom: 1,
791
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
792
+ color: "error",
793
+ children: "Please enter a repository name to continue"
794
+ }, undefined, false, undefined, this)
795
+ }, undefined, false, undefined, this),
796
+ /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedBox_default, {
797
+ marginLeft: 3,
798
+ children: /* @__PURE__ */ jsx_dev_runtime5.jsxDEV(ThemedText, {
799
+ dimColor: true,
800
+ children: [
801
+ currentRepo ? "\u2191/\u2193 to select \xB7 " : "",
802
+ "Enter to continue"
803
+ ]
804
+ }, undefined, true, undefined, this)
805
+ }, undefined, false, undefined, this)
806
+ ]
807
+ }, undefined, true, undefined, this);
808
+ }
809
+ var import_react4, jsx_dev_runtime5;
810
+ var init_ChooseRepoStep = __esm(() => {
811
+ init_TextInput();
812
+ init_useTerminalSize();
813
+ init_src();
814
+ init_useKeybinding();
815
+ import_react4 = __toESM(require_react(), 1);
816
+ jsx_dev_runtime5 = __toESM(require_jsx_dev_runtime(), 1);
817
+ });
818
+
819
+ // src/commands/install-github-app/CreatingStep.tsx
820
+ function CreatingStep({
821
+ currentWorkflowInstallStep,
822
+ secretExists,
823
+ useExistingSecret,
824
+ secretName,
825
+ skipWorkflow = false,
826
+ selectedWorkflows
827
+ }) {
828
+ const progressSteps = skipWorkflow ? [
829
+ "Getting repository information",
830
+ secretExists && useExistingSecret ? "Using existing API key secret" : `Setting up ${secretName} secret`
831
+ ] : [
832
+ "Getting repository information",
833
+ "Creating branch",
834
+ selectedWorkflows.length > 1 ? "Creating workflow files" : "Creating workflow file",
835
+ secretExists && useExistingSecret ? "Using existing API key secret" : `Setting up ${secretName} secret`,
836
+ "Opening pull request page"
837
+ ];
838
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(jsx_dev_runtime6.Fragment, {
839
+ children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
840
+ flexDirection: "column",
841
+ borderStyle: "round",
842
+ paddingX: 1,
843
+ children: [
844
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
845
+ flexDirection: "column",
846
+ marginBottom: 1,
847
+ children: [
848
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
849
+ bold: true,
850
+ children: "Install GitHub App"
851
+ }, undefined, false, undefined, this),
852
+ /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
853
+ dimColor: true,
854
+ children: "Create GitHub Actions workflow"
855
+ }, undefined, false, undefined, this)
856
+ ]
857
+ }, undefined, true, undefined, this),
858
+ progressSteps.map((stepText, index) => {
859
+ let status = "pending";
860
+ if (index < currentWorkflowInstallStep) {
861
+ status = "completed";
862
+ } else if (index === currentWorkflowInstallStep) {
863
+ status = "in-progress";
864
+ }
865
+ return /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedBox_default, {
866
+ children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ThemedText, {
867
+ color: status === "completed" ? "success" : status === "in-progress" ? "warning" : undefined,
868
+ children: [
869
+ status === "completed" ? "\u2713 " : "",
870
+ stepText,
871
+ status === "in-progress" ? "\u2026" : ""
872
+ ]
873
+ }, undefined, true, undefined, this)
874
+ }, index, false, undefined, this);
875
+ })
876
+ ]
877
+ }, undefined, true, undefined, this)
878
+ }, undefined, false, undefined, this);
879
+ }
880
+ var jsx_dev_runtime6;
881
+ var init_CreatingStep = __esm(() => {
882
+ init_src();
883
+ jsx_dev_runtime6 = __toESM(require_jsx_dev_runtime(), 1);
884
+ });
885
+
886
+ // src/commands/install-github-app/ErrorStep.tsx
887
+ function ErrorStep({
888
+ error,
889
+ errorReason,
890
+ errorInstructions
891
+ }) {
892
+ return /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(jsx_dev_runtime7.Fragment, {
893
+ children: [
894
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
895
+ flexDirection: "column",
896
+ borderStyle: "round",
897
+ paddingX: 1,
898
+ children: [
899
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
900
+ flexDirection: "column",
901
+ marginBottom: 1,
902
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
903
+ bold: true,
904
+ children: "Install GitHub App"
905
+ }, undefined, false, undefined, this)
906
+ }, undefined, false, undefined, this),
907
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
908
+ color: "error",
909
+ children: [
910
+ "Error: ",
911
+ error
912
+ ]
913
+ }, undefined, true, undefined, this),
914
+ errorReason && /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
915
+ marginTop: 1,
916
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
917
+ dimColor: true,
918
+ children: [
919
+ "Reason: ",
920
+ errorReason
921
+ ]
922
+ }, undefined, true, undefined, this)
923
+ }, undefined, false, undefined, this),
924
+ errorInstructions && errorInstructions.length > 0 && /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
925
+ flexDirection: "column",
926
+ marginTop: 1,
927
+ children: [
928
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
929
+ dimColor: true,
930
+ children: "How to fix:"
931
+ }, undefined, false, undefined, this),
932
+ errorInstructions.map((instruction, index) => /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
933
+ marginLeft: 2,
934
+ children: [
935
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
936
+ dimColor: true,
937
+ children: "\u2022 "
938
+ }, undefined, false, undefined, this),
939
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
940
+ children: instruction
941
+ }, undefined, false, undefined, this)
942
+ ]
943
+ }, index, true, undefined, this))
944
+ ]
945
+ }, undefined, true, undefined, this),
946
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
947
+ marginTop: 1,
948
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
949
+ dimColor: true,
950
+ children: [
951
+ "For manual setup instructions, see:",
952
+ " ",
953
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
954
+ color: "claude",
955
+ children: GITHUB_ACTION_SETUP_DOCS_URL
956
+ }, undefined, false, undefined, this)
957
+ ]
958
+ }, undefined, true, undefined, this)
959
+ }, undefined, false, undefined, this)
960
+ ]
961
+ }, undefined, true, undefined, this),
962
+ /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedBox_default, {
963
+ marginLeft: 3,
964
+ children: /* @__PURE__ */ jsx_dev_runtime7.jsxDEV(ThemedText, {
965
+ dimColor: true,
966
+ children: "Press any key to exit"
967
+ }, undefined, false, undefined, this)
968
+ }, undefined, false, undefined, this)
969
+ ]
970
+ }, undefined, true, undefined, this);
971
+ }
972
+ var jsx_dev_runtime7;
973
+ var init_ErrorStep = __esm(() => {
974
+ init_github_app();
975
+ init_src();
976
+ jsx_dev_runtime7 = __toESM(require_jsx_dev_runtime(), 1);
977
+ });
978
+
979
+ // src/commands/install-github-app/ExistingWorkflowStep.tsx
980
+ function ExistingWorkflowStep({
981
+ repoName,
982
+ onSelectAction
983
+ }) {
984
+ const options = [
985
+ {
986
+ label: "Update workflow file with latest version",
987
+ value: "update"
988
+ },
989
+ {
990
+ label: "Skip workflow update (configure secrets only)",
991
+ value: "skip"
992
+ },
993
+ {
994
+ label: "Exit without making changes",
995
+ value: "exit"
996
+ }
997
+ ];
998
+ const handleSelect = (value) => {
999
+ onSelectAction(value);
1000
+ };
1001
+ const handleCancel = () => {
1002
+ onSelectAction("exit");
1003
+ };
1004
+ return /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedBox_default, {
1005
+ flexDirection: "column",
1006
+ borderStyle: "round",
1007
+ borderDimColor: true,
1008
+ paddingX: 1,
1009
+ children: [
1010
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedBox_default, {
1011
+ flexDirection: "column",
1012
+ marginBottom: 1,
1013
+ children: [
1014
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1015
+ bold: true,
1016
+ children: "Existing Workflow Found"
1017
+ }, undefined, false, undefined, this),
1018
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1019
+ dimColor: true,
1020
+ children: [
1021
+ "Repository: ",
1022
+ repoName
1023
+ ]
1024
+ }, undefined, true, undefined, this)
1025
+ ]
1026
+ }, undefined, true, undefined, this),
1027
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedBox_default, {
1028
+ flexDirection: "column",
1029
+ marginBottom: 1,
1030
+ children: [
1031
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1032
+ children: [
1033
+ "A Claude workflow file already exists at",
1034
+ " ",
1035
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1036
+ color: "claude",
1037
+ children: ".github/workflows/claude.yml"
1038
+ }, undefined, false, undefined, this)
1039
+ ]
1040
+ }, undefined, true, undefined, this),
1041
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1042
+ dimColor: true,
1043
+ children: "What would you like to do?"
1044
+ }, undefined, false, undefined, this)
1045
+ ]
1046
+ }, undefined, true, undefined, this),
1047
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedBox_default, {
1048
+ flexDirection: "column",
1049
+ children: /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(Select, {
1050
+ options,
1051
+ onChange: handleSelect,
1052
+ onCancel: handleCancel
1053
+ }, undefined, false, undefined, this)
1054
+ }, undefined, false, undefined, this),
1055
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedBox_default, {
1056
+ marginTop: 1,
1057
+ children: /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1058
+ dimColor: true,
1059
+ children: [
1060
+ "View the latest workflow template at:",
1061
+ " ",
1062
+ /* @__PURE__ */ jsx_dev_runtime8.jsxDEV(ThemedText, {
1063
+ color: "claude",
1064
+ children: "https://github.com/anthropics/claude-code-action/blob/main/examples/claude.yml"
1065
+ }, undefined, false, undefined, this)
1066
+ ]
1067
+ }, undefined, true, undefined, this)
1068
+ }, undefined, false, undefined, this)
1069
+ ]
1070
+ }, undefined, true, undefined, this);
1071
+ }
1072
+ var jsx_dev_runtime8;
1073
+ var init_ExistingWorkflowStep = __esm(() => {
1074
+ init_CustomSelect();
1075
+ init_src();
1076
+ jsx_dev_runtime8 = __toESM(require_jsx_dev_runtime(), 1);
1077
+ });
1078
+
1079
+ // src/commands/install-github-app/InstallAppStep.tsx
1080
+ function InstallAppStep({ repoUrl, onSubmit }) {
1081
+ useKeybinding("confirm:yes", onSubmit, { context: "Confirmation" });
1082
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1083
+ flexDirection: "column",
1084
+ borderStyle: "round",
1085
+ borderDimColor: true,
1086
+ paddingX: 1,
1087
+ children: [
1088
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1089
+ flexDirection: "column",
1090
+ marginBottom: 1,
1091
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1092
+ bold: true,
1093
+ children: "Install the Claude GitHub App"
1094
+ }, undefined, false, undefined, this)
1095
+ }, undefined, false, undefined, this),
1096
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1097
+ marginBottom: 1,
1098
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1099
+ children: "Opening browser to install the Claude GitHub App\u2026"
1100
+ }, undefined, false, undefined, this)
1101
+ }, undefined, false, undefined, this),
1102
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1103
+ marginBottom: 1,
1104
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1105
+ children: "If your browser doesn't open automatically, visit:"
1106
+ }, undefined, false, undefined, this)
1107
+ }, undefined, false, undefined, this),
1108
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1109
+ marginBottom: 1,
1110
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1111
+ underline: true,
1112
+ children: "https://github.com/apps/claude"
1113
+ }, undefined, false, undefined, this)
1114
+ }, undefined, false, undefined, this),
1115
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1116
+ marginBottom: 1,
1117
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1118
+ children: [
1119
+ "Please install the app for repository: ",
1120
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1121
+ bold: true,
1122
+ children: repoUrl
1123
+ }, undefined, false, undefined, this)
1124
+ ]
1125
+ }, undefined, true, undefined, this)
1126
+ }, undefined, false, undefined, this),
1127
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1128
+ marginBottom: 1,
1129
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1130
+ dimColor: true,
1131
+ children: "Important: Make sure to grant access to this specific repository"
1132
+ }, undefined, false, undefined, this)
1133
+ }, undefined, false, undefined, this),
1134
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1135
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1136
+ bold: true,
1137
+ color: "permission",
1138
+ children: [
1139
+ "Press Enter once you've installed the app",
1140
+ figures_default.ellipsis
1141
+ ]
1142
+ }, undefined, true, undefined, this)
1143
+ }, undefined, false, undefined, this),
1144
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedBox_default, {
1145
+ marginTop: 1,
1146
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1147
+ dimColor: true,
1148
+ children: [
1149
+ "Having trouble? See manual setup instructions at:",
1150
+ " ",
1151
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(ThemedText, {
1152
+ color: "claude",
1153
+ children: GITHUB_ACTION_SETUP_DOCS_URL
1154
+ }, undefined, false, undefined, this)
1155
+ ]
1156
+ }, undefined, true, undefined, this)
1157
+ }, undefined, false, undefined, this)
1158
+ ]
1159
+ }, undefined, true, undefined, this);
1160
+ }
1161
+ var jsx_dev_runtime9;
1162
+ var init_InstallAppStep = __esm(() => {
1163
+ init_figures();
1164
+ init_github_app();
1165
+ init_src();
1166
+ init_useKeybinding();
1167
+ jsx_dev_runtime9 = __toESM(require_jsx_dev_runtime(), 1);
1168
+ });
1169
+
1170
+ // src/commands/install-github-app/OAuthFlowStep.tsx
1171
+ function OAuthFlowStep({
1172
+ onSuccess,
1173
+ onCancel
1174
+ }) {
1175
+ const [oauthStatus, setOAuthStatus] = import_react5.useState({
1176
+ state: "starting"
1177
+ });
1178
+ const [oauthService] = import_react5.useState(() => new OAuthService);
1179
+ const [pastedCode, setPastedCode] = import_react5.useState("");
1180
+ const [cursorOffset, setCursorOffset] = import_react5.useState(0);
1181
+ const [showPastePrompt, setShowPastePrompt] = import_react5.useState(false);
1182
+ const [urlCopied, setUrlCopied] = import_react5.useState(false);
1183
+ const timersRef = import_react5.useRef(new Set);
1184
+ const urlCopiedTimerRef = import_react5.useRef(undefined);
1185
+ const terminalSize = useTerminalSize();
1186
+ const textInputColumns = Math.max(50, terminalSize.columns - PASTE_HERE_MSG.length - 4);
1187
+ function handleKeyDown(e) {
1188
+ if (oauthStatus.state !== "error")
1189
+ return;
1190
+ e.preventDefault();
1191
+ if (e.key === "return" && oauthStatus.toRetry) {
1192
+ setPastedCode("");
1193
+ setCursorOffset(0);
1194
+ setOAuthStatus({
1195
+ state: "about_to_retry",
1196
+ nextState: oauthStatus.toRetry
1197
+ });
1198
+ } else {
1199
+ onCancel();
1200
+ }
1201
+ }
1202
+ async function handleSubmitCode(value, url) {
1203
+ try {
1204
+ const [authorizationCode, state] = value.split("#");
1205
+ if (!authorizationCode || !state) {
1206
+ setOAuthStatus({
1207
+ state: "error",
1208
+ message: "Invalid code. Please make sure the full code was copied",
1209
+ toRetry: { state: "waiting_for_login", url }
1210
+ });
1211
+ return;
1212
+ }
1213
+ logEvent("tengu_oauth_manual_entry", {});
1214
+ oauthService.handleManualAuthCodeInput({
1215
+ authorizationCode,
1216
+ state
1217
+ });
1218
+ } catch (err) {
1219
+ logError(err);
1220
+ setOAuthStatus({
1221
+ state: "error",
1222
+ message: err.message,
1223
+ toRetry: { state: "waiting_for_login", url }
1224
+ });
1225
+ }
1226
+ }
1227
+ const startOAuth = import_react5.useCallback(async () => {
1228
+ timersRef.current.forEach((timer) => clearTimeout(timer));
1229
+ timersRef.current.clear();
1230
+ try {
1231
+ const result = await oauthService.startOAuthFlow(async (url) => {
1232
+ setOAuthStatus({ state: "waiting_for_login", url });
1233
+ const timer = setTimeout(setShowPastePrompt, 3000, true);
1234
+ timersRef.current.add(timer);
1235
+ }, {
1236
+ loginWithClaudeAi: true,
1237
+ inferenceOnly: true,
1238
+ expiresIn: 365 * 24 * 60 * 60
1239
+ });
1240
+ setOAuthStatus({ state: "processing" });
1241
+ saveOAuthTokensIfNeeded(result);
1242
+ const timer1 = setTimeout((setOAuthStatus2, accessToken, onSuccess2, timersRef2) => {
1243
+ setOAuthStatus2({ state: "success", token: accessToken });
1244
+ const timer2 = setTimeout(onSuccess2, 1000, accessToken);
1245
+ timersRef2.current.add(timer2);
1246
+ }, 100, setOAuthStatus, result.accessToken, onSuccess, timersRef);
1247
+ timersRef.current.add(timer1);
1248
+ } catch (err) {
1249
+ const errorMessage = err.message;
1250
+ setOAuthStatus({
1251
+ state: "error",
1252
+ message: errorMessage,
1253
+ toRetry: { state: "starting" }
1254
+ });
1255
+ logError(err);
1256
+ logEvent("tengu_oauth_error", {
1257
+ error: errorMessage
1258
+ });
1259
+ }
1260
+ }, [oauthService, onSuccess]);
1261
+ import_react5.useEffect(() => {
1262
+ if (oauthStatus.state === "starting") {
1263
+ startOAuth();
1264
+ }
1265
+ }, [oauthStatus.state, startOAuth]);
1266
+ import_react5.useEffect(() => {
1267
+ if (oauthStatus.state === "about_to_retry") {
1268
+ const timer = setTimeout((nextState, setShowPastePrompt2, setOAuthStatus2) => {
1269
+ setShowPastePrompt2(nextState.state === "waiting_for_login");
1270
+ setOAuthStatus2(nextState);
1271
+ }, 500, oauthStatus.nextState, setShowPastePrompt, setOAuthStatus);
1272
+ timersRef.current.add(timer);
1273
+ }
1274
+ }, [oauthStatus]);
1275
+ import_react5.useEffect(() => {
1276
+ if (pastedCode === "c" && oauthStatus.state === "waiting_for_login" && showPastePrompt && !urlCopied) {
1277
+ setClipboard(oauthStatus.url).then((raw) => {
1278
+ if (raw)
1279
+ process.stdout.write(raw);
1280
+ setUrlCopied(true);
1281
+ clearTimeout(urlCopiedTimerRef.current);
1282
+ urlCopiedTimerRef.current = setTimeout(setUrlCopied, 2000, false);
1283
+ });
1284
+ setPastedCode("");
1285
+ }
1286
+ }, [pastedCode, oauthStatus, showPastePrompt, urlCopied]);
1287
+ import_react5.useEffect(() => {
1288
+ const timers = timersRef.current;
1289
+ return () => {
1290
+ oauthService.cleanup();
1291
+ timers.forEach((timer) => clearTimeout(timer));
1292
+ timers.clear();
1293
+ clearTimeout(urlCopiedTimerRef.current);
1294
+ };
1295
+ }, [oauthService]);
1296
+ function renderStatusMessage() {
1297
+ switch (oauthStatus.state) {
1298
+ case "starting":
1299
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1300
+ children: [
1301
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(Spinner, {}, undefined, false, undefined, this),
1302
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1303
+ children: "Starting authentication\u2026"
1304
+ }, undefined, false, undefined, this)
1305
+ ]
1306
+ }, undefined, true, undefined, this);
1307
+ case "waiting_for_login":
1308
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1309
+ flexDirection: "column",
1310
+ gap: 1,
1311
+ children: [
1312
+ !showPastePrompt && /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1313
+ children: [
1314
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(Spinner, {}, undefined, false, undefined, this),
1315
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1316
+ children: "Opening browser to sign in with your Claude account\u2026"
1317
+ }, undefined, false, undefined, this)
1318
+ ]
1319
+ }, undefined, true, undefined, this),
1320
+ showPastePrompt && /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1321
+ children: [
1322
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1323
+ children: PASTE_HERE_MSG
1324
+ }, undefined, false, undefined, this),
1325
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(TextInput, {
1326
+ value: pastedCode,
1327
+ onChange: setPastedCode,
1328
+ onSubmit: (value) => handleSubmitCode(value, oauthStatus.url),
1329
+ cursorOffset,
1330
+ onChangeCursorOffset: setCursorOffset,
1331
+ columns: textInputColumns
1332
+ }, undefined, false, undefined, this)
1333
+ ]
1334
+ }, undefined, true, undefined, this)
1335
+ ]
1336
+ }, undefined, true, undefined, this);
1337
+ case "processing":
1338
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1339
+ children: [
1340
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(Spinner, {}, undefined, false, undefined, this),
1341
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1342
+ children: "Processing authentication\u2026"
1343
+ }, undefined, false, undefined, this)
1344
+ ]
1345
+ }, undefined, true, undefined, this);
1346
+ case "success":
1347
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1348
+ flexDirection: "column",
1349
+ gap: 1,
1350
+ children: [
1351
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1352
+ color: "success",
1353
+ children: "\u2713 Authentication token created successfully!"
1354
+ }, undefined, false, undefined, this),
1355
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1356
+ dimColor: true,
1357
+ children: "Using token for GitHub Actions setup\u2026"
1358
+ }, undefined, false, undefined, this)
1359
+ ]
1360
+ }, undefined, true, undefined, this);
1361
+ case "error":
1362
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1363
+ flexDirection: "column",
1364
+ gap: 1,
1365
+ children: [
1366
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1367
+ color: "error",
1368
+ children: [
1369
+ "OAuth error: ",
1370
+ oauthStatus.message
1371
+ ]
1372
+ }, undefined, true, undefined, this),
1373
+ oauthStatus.toRetry ? /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1374
+ dimColor: true,
1375
+ children: "Press Enter to try again, or any other key to cancel"
1376
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1377
+ dimColor: true,
1378
+ children: "Press any key to return to API key selection"
1379
+ }, undefined, false, undefined, this)
1380
+ ]
1381
+ }, undefined, true, undefined, this);
1382
+ case "about_to_retry":
1383
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1384
+ flexDirection: "column",
1385
+ gap: 1,
1386
+ children: /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1387
+ color: "permission",
1388
+ children: "Retrying\u2026"
1389
+ }, undefined, false, undefined, this)
1390
+ }, undefined, false, undefined, this);
1391
+ default:
1392
+ return null;
1393
+ }
1394
+ }
1395
+ return /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1396
+ flexDirection: "column",
1397
+ gap: 1,
1398
+ tabIndex: 0,
1399
+ autoFocus: true,
1400
+ onKeyDown: handleKeyDown,
1401
+ children: [
1402
+ oauthStatus.state === "starting" && /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1403
+ flexDirection: "column",
1404
+ gap: 1,
1405
+ paddingBottom: 1,
1406
+ children: [
1407
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1408
+ bold: true,
1409
+ children: "Create Authentication Token"
1410
+ }, undefined, false, undefined, this),
1411
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1412
+ dimColor: true,
1413
+ children: "Creating a long-lived token for GitHub Actions"
1414
+ }, undefined, false, undefined, this)
1415
+ ]
1416
+ }, undefined, true, undefined, this),
1417
+ oauthStatus.state !== "success" && oauthStatus.state !== "starting" && oauthStatus.state !== "processing" && /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1418
+ flexDirection: "column",
1419
+ gap: 1,
1420
+ paddingBottom: 1,
1421
+ children: [
1422
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1423
+ bold: true,
1424
+ children: "Create Authentication Token"
1425
+ }, undefined, false, undefined, this),
1426
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1427
+ dimColor: true,
1428
+ children: "Creating a long-lived token for GitHub Actions"
1429
+ }, undefined, false, undefined, this)
1430
+ ]
1431
+ }, "header", true, undefined, this),
1432
+ oauthStatus.state === "waiting_for_login" && showPastePrompt && /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1433
+ flexDirection: "column",
1434
+ gap: 1,
1435
+ paddingBottom: 1,
1436
+ children: [
1437
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1438
+ paddingX: 1,
1439
+ children: [
1440
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1441
+ dimColor: true,
1442
+ children: [
1443
+ "Browser didn't open? Use the url below to sign in",
1444
+ " "
1445
+ ]
1446
+ }, undefined, true, undefined, this),
1447
+ urlCopied ? /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1448
+ color: "success",
1449
+ children: "(Copied!)"
1450
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1451
+ dimColor: true,
1452
+ children: /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(KeyboardShortcutHint, {
1453
+ shortcut: "c",
1454
+ action: "copy",
1455
+ parens: true
1456
+ }, undefined, false, undefined, this)
1457
+ }, undefined, false, undefined, this)
1458
+ ]
1459
+ }, undefined, true, undefined, this),
1460
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(Link, {
1461
+ url: oauthStatus.url,
1462
+ children: /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedText, {
1463
+ dimColor: true,
1464
+ children: oauthStatus.url
1465
+ }, undefined, false, undefined, this)
1466
+ }, undefined, false, undefined, this)
1467
+ ]
1468
+ }, "urlToCopy", true, undefined, this),
1469
+ /* @__PURE__ */ jsx_dev_runtime10.jsxDEV(ThemedBox_default, {
1470
+ paddingLeft: 1,
1471
+ flexDirection: "column",
1472
+ gap: 1,
1473
+ children: renderStatusMessage()
1474
+ }, undefined, false, undefined, this)
1475
+ ]
1476
+ }, undefined, true, undefined, this);
1477
+ }
1478
+ var import_react5, jsx_dev_runtime10, PASTE_HERE_MSG = "Paste code here if prompted > ";
1479
+ var init_OAuthFlowStep = __esm(() => {
1480
+ init_analytics();
1481
+ init_src();
1482
+ init_Spinner();
1483
+ init_TextInput();
1484
+ init_useTerminalSize();
1485
+ init_src();
1486
+ init_oauth();
1487
+ init_auth();
1488
+ init_log();
1489
+ import_react5 = __toESM(require_react(), 1);
1490
+ jsx_dev_runtime10 = __toESM(require_jsx_dev_runtime(), 1);
1491
+ });
1492
+
1493
+ // src/commands/install-github-app/SuccessStep.tsx
1494
+ function SuccessStep({
1495
+ secretExists,
1496
+ useExistingSecret,
1497
+ secretName,
1498
+ skipWorkflow = false
1499
+ }) {
1500
+ return /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(jsx_dev_runtime11.Fragment, {
1501
+ children: [
1502
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1503
+ flexDirection: "column",
1504
+ borderStyle: "round",
1505
+ paddingX: 1,
1506
+ children: [
1507
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1508
+ flexDirection: "column",
1509
+ marginBottom: 1,
1510
+ children: [
1511
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1512
+ bold: true,
1513
+ children: "Install GitHub App"
1514
+ }, undefined, false, undefined, this),
1515
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1516
+ dimColor: true,
1517
+ children: "Success"
1518
+ }, undefined, false, undefined, this)
1519
+ ]
1520
+ }, undefined, true, undefined, this),
1521
+ !skipWorkflow && /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1522
+ color: "success",
1523
+ children: "\u2713 GitHub Actions workflow created!"
1524
+ }, undefined, false, undefined, this),
1525
+ secretExists && useExistingSecret && /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1526
+ marginTop: 1,
1527
+ children: /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1528
+ color: "success",
1529
+ children: "\u2713 Using existing ANTHROPIC_API_KEY secret"
1530
+ }, undefined, false, undefined, this)
1531
+ }, undefined, false, undefined, this),
1532
+ (!secretExists || !useExistingSecret) && /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1533
+ marginTop: 1,
1534
+ children: /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1535
+ color: "success",
1536
+ children: [
1537
+ "\u2713 API key saved as ",
1538
+ secretName,
1539
+ " secret"
1540
+ ]
1541
+ }, undefined, true, undefined, this)
1542
+ }, undefined, false, undefined, this),
1543
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1544
+ marginTop: 1,
1545
+ children: /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1546
+ children: "Next steps:"
1547
+ }, undefined, false, undefined, this)
1548
+ }, undefined, false, undefined, this),
1549
+ skipWorkflow ? /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(jsx_dev_runtime11.Fragment, {
1550
+ children: [
1551
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1552
+ children: "1. Install the Claude GitHub App if you haven't already"
1553
+ }, undefined, false, undefined, this),
1554
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1555
+ children: "2. Your workflow file was kept unchanged"
1556
+ }, undefined, false, undefined, this),
1557
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1558
+ children: "3. API key is configured and ready to use"
1559
+ }, undefined, false, undefined, this)
1560
+ ]
1561
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(jsx_dev_runtime11.Fragment, {
1562
+ children: [
1563
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1564
+ children: "1. A pre-filled PR page has been created"
1565
+ }, undefined, false, undefined, this),
1566
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1567
+ children: "2. Install the Claude GitHub App if you haven't already"
1568
+ }, undefined, false, undefined, this),
1569
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1570
+ children: "3. Merge the PR to enable Claude PR assistance"
1571
+ }, undefined, false, undefined, this)
1572
+ ]
1573
+ }, undefined, true, undefined, this)
1574
+ ]
1575
+ }, undefined, true, undefined, this),
1576
+ /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedBox_default, {
1577
+ marginLeft: 3,
1578
+ children: /* @__PURE__ */ jsx_dev_runtime11.jsxDEV(ThemedText, {
1579
+ dimColor: true,
1580
+ children: "Press any key to exit"
1581
+ }, undefined, false, undefined, this)
1582
+ }, undefined, false, undefined, this)
1583
+ ]
1584
+ }, undefined, true, undefined, this);
1585
+ }
1586
+ var jsx_dev_runtime11;
1587
+ var init_SuccessStep = __esm(() => {
1588
+ init_src();
1589
+ jsx_dev_runtime11 = __toESM(require_jsx_dev_runtime(), 1);
1590
+ });
1591
+
1592
+ // src/commands/install-github-app/setupGitHubActions.ts
1593
+ async function createWorkflowFile(repoName, branchName, workflowPath, workflowContent, secretName, message, context) {
1594
+ const checkFileResult = await execFileNoThrow("gh", [
1595
+ "api",
1596
+ `repos/${repoName}/contents/${workflowPath}`,
1597
+ "--jq",
1598
+ ".sha"
1599
+ ]);
1600
+ let fileSha = null;
1601
+ if (checkFileResult.code === 0) {
1602
+ fileSha = checkFileResult.stdout.trim();
1603
+ }
1604
+ let content = workflowContent;
1605
+ if (secretName === "CLAUDE_CODE_OAUTH_TOKEN") {
1606
+ content = workflowContent.replace(/anthropic_api_key: \$\{\{ secrets\.ANTHROPIC_API_KEY \}\}/g, `claude_code_oauth_token: \${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}`);
1607
+ } else if (secretName !== "ANTHROPIC_API_KEY") {
1608
+ content = workflowContent.replace(/anthropic_api_key: \$\{\{ secrets\.ANTHROPIC_API_KEY \}\}/g, `anthropic_api_key: \${{ secrets.${secretName} }}`);
1609
+ }
1610
+ const base64Content = Buffer.from(content).toString("base64");
1611
+ const apiParams = [
1612
+ "api",
1613
+ "--method",
1614
+ "PUT",
1615
+ `repos/${repoName}/contents/${workflowPath}`,
1616
+ "-f",
1617
+ `message=${fileSha ? `"Update ${message}"` : `"${message}"`}`,
1618
+ "-f",
1619
+ `content=${base64Content}`,
1620
+ "-f",
1621
+ `branch=${branchName}`
1622
+ ];
1623
+ if (fileSha) {
1624
+ apiParams.push("-f", `sha=${fileSha}`);
1625
+ }
1626
+ const createFileResult = await execFileNoThrow("gh", apiParams);
1627
+ if (createFileResult.code !== 0) {
1628
+ if (createFileResult.stderr.includes("422") && createFileResult.stderr.includes("sha")) {
1629
+ logEvent("tengu_setup_github_actions_failed", {
1630
+ reason: "failed_to_create_workflow_file",
1631
+ exit_code: createFileResult.code,
1632
+ ...context
1633
+ });
1634
+ throw new Error(`Failed to create workflow file ${workflowPath}: A Claude workflow file already exists in this repository. Please remove it first or update it manually.`);
1635
+ }
1636
+ logEvent("tengu_setup_github_actions_failed", {
1637
+ reason: "failed_to_create_workflow_file",
1638
+ exit_code: createFileResult.code,
1639
+ ...context
1640
+ });
1641
+ const helpText = `
1642
+
1643
+ Need help? Common issues:
1644
+ ` + `\xB7 Permission denied \u2192 Run: gh auth refresh -h github.com -s repo,workflow
1645
+ ` + `\xB7 Not authorized \u2192 Ensure you have admin access to the repository
1646
+ ` + "\xB7 For manual setup \u2192 Visit: https://github.com/anthropics/claude-code-action";
1647
+ throw new Error(`Failed to create workflow file ${workflowPath}: ${createFileResult.stderr}${helpText}`);
1648
+ }
1649
+ }
1650
+ async function setupGitHubActions(repoName, apiKeyOrOAuthToken, secretName, updateProgress, skipWorkflow = false, selectedWorkflows, authType, context) {
1651
+ try {
1652
+ logEvent("tengu_setup_github_actions_started", {
1653
+ skip_workflow: skipWorkflow,
1654
+ has_api_key: !!apiKeyOrOAuthToken,
1655
+ using_default_secret_name: secretName === "ANTHROPIC_API_KEY",
1656
+ selected_claude_workflow: selectedWorkflows.includes("claude"),
1657
+ selected_claude_review_workflow: selectedWorkflows.includes("claude-review"),
1658
+ ...context
1659
+ });
1660
+ const repoCheckResult = await execFileNoThrow("gh", [
1661
+ "api",
1662
+ `repos/${repoName}`,
1663
+ "--jq",
1664
+ ".id"
1665
+ ]);
1666
+ if (repoCheckResult.code !== 0) {
1667
+ logEvent("tengu_setup_github_actions_failed", {
1668
+ reason: "repo_not_found",
1669
+ exit_code: repoCheckResult.code,
1670
+ ...context
1671
+ });
1672
+ throw new Error(`Failed to access repository ${repoName}: ${repoCheckResult.stderr}`);
1673
+ }
1674
+ const defaultBranchResult = await execFileNoThrow("gh", [
1675
+ "api",
1676
+ `repos/${repoName}`,
1677
+ "--jq",
1678
+ ".default_branch"
1679
+ ]);
1680
+ if (defaultBranchResult.code !== 0) {
1681
+ logEvent("tengu_setup_github_actions_failed", {
1682
+ reason: "failed_to_get_default_branch",
1683
+ exit_code: defaultBranchResult.code,
1684
+ ...context
1685
+ });
1686
+ throw new Error(`Failed to get default branch: ${defaultBranchResult.stderr}`);
1687
+ }
1688
+ const defaultBranch = defaultBranchResult.stdout.trim();
1689
+ const shaResult = await execFileNoThrow("gh", [
1690
+ "api",
1691
+ `repos/${repoName}/git/ref/heads/${defaultBranch}`,
1692
+ "--jq",
1693
+ ".object.sha"
1694
+ ]);
1695
+ if (shaResult.code !== 0) {
1696
+ logEvent("tengu_setup_github_actions_failed", {
1697
+ reason: "failed_to_get_branch_sha",
1698
+ exit_code: shaResult.code,
1699
+ ...context
1700
+ });
1701
+ throw new Error(`Failed to get branch SHA: ${shaResult.stderr}`);
1702
+ }
1703
+ const sha = shaResult.stdout.trim();
1704
+ let branchName = null;
1705
+ if (!skipWorkflow) {
1706
+ updateProgress();
1707
+ branchName = `add-claude-github-actions-${Date.now()}`;
1708
+ const createBranchResult = await execFileNoThrow("gh", [
1709
+ "api",
1710
+ "--method",
1711
+ "POST",
1712
+ `repos/${repoName}/git/refs`,
1713
+ "-f",
1714
+ `ref=refs/heads/${branchName}`,
1715
+ "-f",
1716
+ `sha=${sha}`
1717
+ ]);
1718
+ if (createBranchResult.code !== 0) {
1719
+ logEvent("tengu_setup_github_actions_failed", {
1720
+ reason: "failed_to_create_branch",
1721
+ exit_code: createBranchResult.code,
1722
+ ...context
1723
+ });
1724
+ throw new Error(`Failed to create branch: ${createBranchResult.stderr}`);
1725
+ }
1726
+ updateProgress();
1727
+ const workflows = [];
1728
+ if (selectedWorkflows.includes("claude")) {
1729
+ workflows.push({
1730
+ path: ".github/workflows/claude.yml",
1731
+ content: WORKFLOW_CONTENT,
1732
+ message: "Claude PR Assistant workflow"
1733
+ });
1734
+ }
1735
+ if (selectedWorkflows.includes("claude-review")) {
1736
+ workflows.push({
1737
+ path: ".github/workflows/claude-code-review.yml",
1738
+ content: CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT,
1739
+ message: "Claude Code Review workflow"
1740
+ });
1741
+ }
1742
+ for (const workflow of workflows) {
1743
+ await createWorkflowFile(repoName, branchName, workflow.path, workflow.content, secretName, workflow.message, context);
1744
+ }
1745
+ }
1746
+ updateProgress();
1747
+ if (apiKeyOrOAuthToken) {
1748
+ const setSecretResult = await execFileNoThrow("gh", [
1749
+ "secret",
1750
+ "set",
1751
+ secretName,
1752
+ "--body",
1753
+ apiKeyOrOAuthToken,
1754
+ "--repo",
1755
+ repoName
1756
+ ]);
1757
+ if (setSecretResult.code !== 0) {
1758
+ logEvent("tengu_setup_github_actions_failed", {
1759
+ reason: "failed_to_set_api_key_secret",
1760
+ exit_code: setSecretResult.code,
1761
+ ...context
1762
+ });
1763
+ const helpText = `
1764
+
1765
+ Need help? Common issues:
1766
+ ` + `\xB7 Permission denied \u2192 Run: gh auth refresh -h github.com -s repo
1767
+ ` + `\xB7 Not authorized \u2192 Ensure you have admin access to the repository
1768
+ ` + "\xB7 For manual setup \u2192 Visit: https://github.com/anthropics/claude-code-action";
1769
+ throw new Error(`Failed to set API key secret: ${setSecretResult.stderr || "Unknown error"}${helpText}`);
1770
+ }
1771
+ }
1772
+ if (!skipWorkflow && branchName) {
1773
+ updateProgress();
1774
+ const compareUrl = `https://github.com/${repoName}/compare/${defaultBranch}...${branchName}?quick_pull=1&title=${encodeURIComponent(PR_TITLE)}&body=${encodeURIComponent(PR_BODY)}`;
1775
+ await openBrowser(compareUrl);
1776
+ }
1777
+ logEvent("tengu_setup_github_actions_completed", {
1778
+ skip_workflow: skipWorkflow,
1779
+ has_api_key: !!apiKeyOrOAuthToken,
1780
+ auth_type: authType,
1781
+ using_default_secret_name: secretName === "ANTHROPIC_API_KEY",
1782
+ selected_claude_workflow: selectedWorkflows.includes("claude"),
1783
+ selected_claude_review_workflow: selectedWorkflows.includes("claude-review"),
1784
+ ...context
1785
+ });
1786
+ saveGlobalConfig((current) => ({
1787
+ ...current,
1788
+ githubActionSetupCount: (current.githubActionSetupCount ?? 0) + 1
1789
+ }));
1790
+ } catch (error) {
1791
+ if (!error || !(error instanceof Error) || !error.message.includes("Failed to")) {
1792
+ logEvent("tengu_setup_github_actions_failed", {
1793
+ reason: "unexpected_error",
1794
+ ...context
1795
+ });
1796
+ }
1797
+ if (error instanceof Error) {
1798
+ logError(error);
1799
+ }
1800
+ throw error;
1801
+ }
1802
+ }
1803
+ var init_setupGitHubActions = __esm(() => {
1804
+ init_analytics();
1805
+ init_config();
1806
+ init_github_app();
1807
+ init_browser();
1808
+ init_execFileNoThrow();
1809
+ init_log();
1810
+ });
1811
+
1812
+ // src/commands/install-github-app/WarningsStep.tsx
1813
+ function WarningsStep({ warnings, onContinue }) {
1814
+ useKeybinding("confirm:yes", onContinue, { context: "Confirmation" });
1815
+ return /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(jsx_dev_runtime12.Fragment, {
1816
+ children: /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1817
+ flexDirection: "column",
1818
+ borderStyle: "round",
1819
+ paddingX: 1,
1820
+ children: [
1821
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1822
+ flexDirection: "column",
1823
+ marginBottom: 1,
1824
+ children: [
1825
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1826
+ bold: true,
1827
+ children: [
1828
+ figures_default.warning,
1829
+ " Setup Warnings"
1830
+ ]
1831
+ }, undefined, true, undefined, this),
1832
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1833
+ dimColor: true,
1834
+ children: "We found some potential issues, but you can continue anyway"
1835
+ }, undefined, false, undefined, this)
1836
+ ]
1837
+ }, undefined, true, undefined, this),
1838
+ warnings.map((warning, index) => /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1839
+ flexDirection: "column",
1840
+ marginBottom: 1,
1841
+ children: [
1842
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1843
+ color: "warning",
1844
+ bold: true,
1845
+ children: warning.title
1846
+ }, undefined, false, undefined, this),
1847
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1848
+ children: warning.message
1849
+ }, undefined, false, undefined, this),
1850
+ warning.instructions.length > 0 && /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1851
+ flexDirection: "column",
1852
+ marginLeft: 2,
1853
+ marginTop: 1,
1854
+ children: warning.instructions.map((instruction, i) => /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1855
+ dimColor: true,
1856
+ children: [
1857
+ "\u2022 ",
1858
+ instruction
1859
+ ]
1860
+ }, i, true, undefined, this))
1861
+ }, undefined, false, undefined, this)
1862
+ ]
1863
+ }, index, true, undefined, this)),
1864
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1865
+ marginTop: 1,
1866
+ children: /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1867
+ bold: true,
1868
+ color: "permission",
1869
+ children: "Press Enter to continue anyway, or Ctrl+C to exit and fix issues"
1870
+ }, undefined, false, undefined, this)
1871
+ }, undefined, false, undefined, this),
1872
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedBox_default, {
1873
+ marginTop: 1,
1874
+ children: /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1875
+ dimColor: true,
1876
+ children: [
1877
+ "You can also try the manual setup steps if needed:",
1878
+ " ",
1879
+ /* @__PURE__ */ jsx_dev_runtime12.jsxDEV(ThemedText, {
1880
+ color: "claude",
1881
+ children: GITHUB_ACTION_SETUP_DOCS_URL
1882
+ }, undefined, false, undefined, this)
1883
+ ]
1884
+ }, undefined, true, undefined, this)
1885
+ }, undefined, false, undefined, this)
1886
+ ]
1887
+ }, undefined, true, undefined, this)
1888
+ }, undefined, false, undefined, this);
1889
+ }
1890
+ var jsx_dev_runtime12;
1891
+ var init_WarningsStep = __esm(() => {
1892
+ init_figures();
1893
+ init_github_app();
1894
+ init_src();
1895
+ init_useKeybinding();
1896
+ jsx_dev_runtime12 = __toESM(require_jsx_dev_runtime(), 1);
1897
+ });
1898
+
1899
+ // src/commands/install-github-app/install-github-app.tsx
1900
+ function InstallGitHubApp(props) {
1901
+ const [existingApiKey] = import_react6.useState(() => getAnthropicApiKey());
1902
+ const [state, setState] = import_react6.useState({
1903
+ ...INITIAL_STATE,
1904
+ useExistingKey: !!existingApiKey,
1905
+ selectedApiKeyOption: existingApiKey ? "existing" : isAnthropicAuthEnabled() ? "oauth" : "new"
1906
+ });
1907
+ useExitOnCtrlCDWithKeybindings();
1908
+ import_react6.default.useEffect(() => {
1909
+ logEvent("tengu_install_github_app_started", {});
1910
+ }, []);
1911
+ const checkGitHubCLI = import_react6.useCallback(async () => {
1912
+ const warnings = [];
1913
+ const ghVersionResult = await execa("gh --version", {
1914
+ shell: true,
1915
+ reject: false
1916
+ });
1917
+ if (ghVersionResult.exitCode !== 0) {
1918
+ warnings.push({
1919
+ title: "GitHub CLI not found",
1920
+ message: "GitHub CLI (gh) does not appear to be installed or accessible.",
1921
+ instructions: [
1922
+ "Install GitHub CLI from https://cli.github.com/",
1923
+ "macOS: brew install gh",
1924
+ "Windows: winget install --id GitHub.cli",
1925
+ "Linux: See installation instructions at https://github.com/cli/cli#installation"
1926
+ ]
1927
+ });
1928
+ }
1929
+ const authResult = await execa("gh auth status -a", {
1930
+ shell: true,
1931
+ reject: false
1932
+ });
1933
+ if (authResult.exitCode !== 0) {
1934
+ warnings.push({
1935
+ title: "GitHub CLI not authenticated",
1936
+ message: "GitHub CLI does not appear to be authenticated.",
1937
+ instructions: [
1938
+ "Run: gh auth login",
1939
+ "Follow the prompts to authenticate with GitHub",
1940
+ "Or set up authentication using environment variables or other methods"
1941
+ ]
1942
+ });
1943
+ } else {
1944
+ const tokenScopesMatch = authResult.stdout.match(/Token scopes:.*$/m);
1945
+ if (tokenScopesMatch) {
1946
+ const scopes = tokenScopesMatch[0];
1947
+ const missingScopes = [];
1948
+ if (!scopes.includes("repo")) {
1949
+ missingScopes.push("repo");
1950
+ }
1951
+ if (!scopes.includes("workflow")) {
1952
+ missingScopes.push("workflow");
1953
+ }
1954
+ if (missingScopes.length > 0) {
1955
+ setState((prev) => ({
1956
+ ...prev,
1957
+ step: "error",
1958
+ error: `GitHub CLI is missing required permissions: ${missingScopes.join(", ")}.`,
1959
+ errorReason: "Missing required scopes",
1960
+ errorInstructions: [
1961
+ `Your GitHub CLI authentication is missing the "${missingScopes.join('" and "')}" ${plural(missingScopes.length, "scope")} needed to manage GitHub Actions and secrets.`,
1962
+ "",
1963
+ "To fix this, run:",
1964
+ " gh auth refresh -h github.com -s repo,workflow",
1965
+ "",
1966
+ "This will add the necessary permissions to manage workflows and secrets."
1967
+ ]
1968
+ }));
1969
+ return;
1970
+ }
1971
+ }
1972
+ }
1973
+ const currentRepo = await getGithubRepo() ?? "";
1974
+ logEvent("tengu_install_github_app_step_completed", {
1975
+ step: "check-gh"
1976
+ });
1977
+ setState((prev) => ({
1978
+ ...prev,
1979
+ warnings,
1980
+ currentRepo,
1981
+ selectedRepoName: currentRepo,
1982
+ useCurrentRepo: !!currentRepo,
1983
+ step: warnings.length > 0 ? "warnings" : "choose-repo"
1984
+ }));
1985
+ }, []);
1986
+ import_react6.default.useEffect(() => {
1987
+ if (state.step === "check-gh") {
1988
+ checkGitHubCLI();
1989
+ }
1990
+ }, [state.step, checkGitHubCLI]);
1991
+ const runSetupGitHubActions = import_react6.useCallback(async (apiKeyOrOAuthToken, secretName) => {
1992
+ setState((prev) => ({
1993
+ ...prev,
1994
+ step: "creating",
1995
+ currentWorkflowInstallStep: 0
1996
+ }));
1997
+ try {
1998
+ await setupGitHubActions(state.selectedRepoName, apiKeyOrOAuthToken, secretName, () => {
1999
+ setState((prev) => ({
2000
+ ...prev,
2001
+ currentWorkflowInstallStep: prev.currentWorkflowInstallStep + 1
2002
+ }));
2003
+ }, state.workflowAction === "skip", state.selectedWorkflows, state.authType, {
2004
+ useCurrentRepo: state.useCurrentRepo,
2005
+ workflowExists: state.workflowExists,
2006
+ secretExists: state.secretExists
2007
+ });
2008
+ logEvent("tengu_install_github_app_step_completed", {
2009
+ step: "creating"
2010
+ });
2011
+ setState((prev) => ({ ...prev, step: "success" }));
2012
+ } catch (error) {
2013
+ const errorMessage = error instanceof Error ? error.message : "Failed to set up GitHub Actions";
2014
+ if (errorMessage.includes("workflow file already exists")) {
2015
+ logEvent("tengu_install_github_app_error", {
2016
+ reason: "workflow_file_exists"
2017
+ });
2018
+ setState((prev) => ({
2019
+ ...prev,
2020
+ step: "error",
2021
+ error: "A Claude workflow file already exists in this repository.",
2022
+ errorReason: "Workflow file conflict",
2023
+ errorInstructions: [
2024
+ "The file .github/workflows/claude.yml already exists",
2025
+ "You can either:",
2026
+ " 1. Delete the existing file and run this command again",
2027
+ " 2. Update the existing file manually using the template from:",
2028
+ ` ${GITHUB_ACTION_SETUP_DOCS_URL}`
2029
+ ]
2030
+ }));
2031
+ } else {
2032
+ logEvent("tengu_install_github_app_error", {
2033
+ reason: "setup_github_actions_failed"
2034
+ });
2035
+ setState((prev) => ({
2036
+ ...prev,
2037
+ step: "error",
2038
+ error: errorMessage,
2039
+ errorReason: "GitHub Actions setup failed",
2040
+ errorInstructions: []
2041
+ }));
2042
+ }
2043
+ }
2044
+ }, [
2045
+ state.selectedRepoName,
2046
+ state.workflowAction,
2047
+ state.selectedWorkflows,
2048
+ state.useCurrentRepo,
2049
+ state.workflowExists,
2050
+ state.secretExists,
2051
+ state.authType
2052
+ ]);
2053
+ async function openGitHubAppInstallation() {
2054
+ const installUrl = "https://github.com/apps/claude";
2055
+ await openBrowser(installUrl);
2056
+ }
2057
+ async function checkRepositoryPermissions(repoName) {
2058
+ try {
2059
+ const result = await execFileNoThrow("gh", [
2060
+ "api",
2061
+ `repos/${repoName}`,
2062
+ "--jq",
2063
+ ".permissions.admin"
2064
+ ]);
2065
+ if (result.code === 0) {
2066
+ const hasAdmin = result.stdout.trim() === "true";
2067
+ return { hasAccess: hasAdmin };
2068
+ }
2069
+ if (result.stderr.includes("404") || result.stderr.includes("Not Found")) {
2070
+ return {
2071
+ hasAccess: false,
2072
+ error: "repository_not_found"
2073
+ };
2074
+ }
2075
+ return { hasAccess: false };
2076
+ } catch {
2077
+ return { hasAccess: false };
2078
+ }
2079
+ }
2080
+ async function checkExistingWorkflowFile(repoName) {
2081
+ const checkFileResult = await execFileNoThrow("gh", [
2082
+ "api",
2083
+ `repos/${repoName}/contents/.github/workflows/claude.yml`,
2084
+ "--jq",
2085
+ ".sha"
2086
+ ]);
2087
+ return checkFileResult.code === 0;
2088
+ }
2089
+ async function checkExistingSecret() {
2090
+ const checkSecretsResult = await execFileNoThrow("gh", [
2091
+ "secret",
2092
+ "list",
2093
+ "--app",
2094
+ "actions",
2095
+ "--repo",
2096
+ state.selectedRepoName
2097
+ ]);
2098
+ if (checkSecretsResult.code === 0) {
2099
+ const lines = checkSecretsResult.stdout.split(`
2100
+ `);
2101
+ const hasAnthropicKey = lines.some((line) => {
2102
+ return /^ANTHROPIC_API_KEY\s+/.test(line);
2103
+ });
2104
+ if (hasAnthropicKey) {
2105
+ setState((prev) => ({
2106
+ ...prev,
2107
+ secretExists: true,
2108
+ step: "check-existing-secret"
2109
+ }));
2110
+ } else {
2111
+ if (existingApiKey) {
2112
+ setState((prev) => ({
2113
+ ...prev,
2114
+ apiKeyOrOAuthToken: existingApiKey,
2115
+ useExistingKey: true
2116
+ }));
2117
+ await runSetupGitHubActions(existingApiKey, state.secretName);
2118
+ } else {
2119
+ setState((prev) => ({ ...prev, step: "api-key" }));
2120
+ }
2121
+ }
2122
+ } else {
2123
+ if (existingApiKey) {
2124
+ setState((prev) => ({
2125
+ ...prev,
2126
+ apiKeyOrOAuthToken: existingApiKey,
2127
+ useExistingKey: true
2128
+ }));
2129
+ await runSetupGitHubActions(existingApiKey, state.secretName);
2130
+ } else {
2131
+ setState((prev) => ({ ...prev, step: "api-key" }));
2132
+ }
2133
+ }
2134
+ }
2135
+ const handleSubmit = async () => {
2136
+ if (state.step === "warnings") {
2137
+ logEvent("tengu_install_github_app_step_completed", {
2138
+ step: "warnings"
2139
+ });
2140
+ setState((prev) => ({ ...prev, step: "install-app" }));
2141
+ setTimeout(openGitHubAppInstallation, 0);
2142
+ } else if (state.step === "choose-repo") {
2143
+ let repoName = state.useCurrentRepo ? state.currentRepo : state.selectedRepoName;
2144
+ if (!repoName.trim()) {
2145
+ return;
2146
+ }
2147
+ const repoWarnings = [];
2148
+ if (repoName.includes("github.com")) {
2149
+ const match = repoName.match(/github\.com[:/]([^/]+\/[^/]+)(\.git)?$/);
2150
+ if (!match) {
2151
+ repoWarnings.push({
2152
+ title: "Invalid GitHub URL format",
2153
+ message: "The repository URL format appears to be invalid.",
2154
+ instructions: [
2155
+ "Use format: owner/repo or https://github.com/owner/repo",
2156
+ "Example: anthropics/claude-cli"
2157
+ ]
2158
+ });
2159
+ } else {
2160
+ repoName = match[1]?.replace(/\.git$/, "") || "";
2161
+ }
2162
+ }
2163
+ if (!repoName.includes("/")) {
2164
+ repoWarnings.push({
2165
+ title: "Repository format warning",
2166
+ message: 'Repository should be in format "owner/repo"',
2167
+ instructions: [
2168
+ "Use format: owner/repo",
2169
+ "Example: anthropics/claude-cli"
2170
+ ]
2171
+ });
2172
+ }
2173
+ const permissionCheck = await checkRepositoryPermissions(repoName);
2174
+ if (permissionCheck.error === "repository_not_found") {
2175
+ repoWarnings.push({
2176
+ title: "Repository not found",
2177
+ message: `Repository ${repoName} was not found or you don't have access.`,
2178
+ instructions: [
2179
+ `Check that the repository name is correct: ${repoName}`,
2180
+ "Ensure you have access to this repository",
2181
+ 'For private repositories, make sure your GitHub token has the "repo" scope',
2182
+ "You can add the repo scope with: gh auth refresh -h github.com -s repo,workflow"
2183
+ ]
2184
+ });
2185
+ } else if (!permissionCheck.hasAccess) {
2186
+ repoWarnings.push({
2187
+ title: "Admin permissions required",
2188
+ message: `You might need admin permissions on ${repoName} to set up GitHub Actions.`,
2189
+ instructions: [
2190
+ "Repository admins can install GitHub Apps and set secrets",
2191
+ "Ask a repository admin to run this command if setup fails",
2192
+ "Alternatively, you can use the manual setup instructions"
2193
+ ]
2194
+ });
2195
+ }
2196
+ const workflowExists = await checkExistingWorkflowFile(repoName);
2197
+ if (repoWarnings.length > 0) {
2198
+ const allWarnings = [...state.warnings, ...repoWarnings];
2199
+ setState((prev) => ({
2200
+ ...prev,
2201
+ selectedRepoName: repoName,
2202
+ workflowExists,
2203
+ warnings: allWarnings,
2204
+ step: "warnings"
2205
+ }));
2206
+ } else {
2207
+ logEvent("tengu_install_github_app_step_completed", {
2208
+ step: "choose-repo"
2209
+ });
2210
+ setState((prev) => ({
2211
+ ...prev,
2212
+ selectedRepoName: repoName,
2213
+ workflowExists,
2214
+ step: "install-app"
2215
+ }));
2216
+ setTimeout(openGitHubAppInstallation, 0);
2217
+ }
2218
+ } else if (state.step === "install-app") {
2219
+ logEvent("tengu_install_github_app_step_completed", {
2220
+ step: "install-app"
2221
+ });
2222
+ if (state.workflowExists) {
2223
+ setState((prev) => ({ ...prev, step: "check-existing-workflow" }));
2224
+ } else {
2225
+ setState((prev) => ({ ...prev, step: "select-workflows" }));
2226
+ }
2227
+ } else if (state.step === "check-existing-workflow") {
2228
+ return;
2229
+ } else if (state.step === "select-workflows") {
2230
+ return;
2231
+ } else if (state.step === "check-existing-secret") {
2232
+ logEvent("tengu_install_github_app_step_completed", {
2233
+ step: "check-existing-secret"
2234
+ });
2235
+ if (state.useExistingSecret) {
2236
+ await runSetupGitHubActions(null, state.secretName);
2237
+ } else {
2238
+ await runSetupGitHubActions(state.apiKeyOrOAuthToken, state.secretName);
2239
+ }
2240
+ } else if (state.step === "api-key") {
2241
+ if (state.selectedApiKeyOption === "oauth") {
2242
+ return;
2243
+ }
2244
+ const apiKeyToUse = state.selectedApiKeyOption === "existing" ? existingApiKey : state.apiKeyOrOAuthToken;
2245
+ if (!apiKeyToUse) {
2246
+ logEvent("tengu_install_github_app_error", {
2247
+ reason: "api_key_missing"
2248
+ });
2249
+ setState((prev) => ({
2250
+ ...prev,
2251
+ step: "error",
2252
+ error: "API key is required"
2253
+ }));
2254
+ return;
2255
+ }
2256
+ setState((prev) => ({
2257
+ ...prev,
2258
+ apiKeyOrOAuthToken: apiKeyToUse,
2259
+ useExistingKey: state.selectedApiKeyOption === "existing"
2260
+ }));
2261
+ const checkSecretsResult = await execFileNoThrow("gh", [
2262
+ "secret",
2263
+ "list",
2264
+ "--app",
2265
+ "actions",
2266
+ "--repo",
2267
+ state.selectedRepoName
2268
+ ]);
2269
+ if (checkSecretsResult.code === 0) {
2270
+ const lines = checkSecretsResult.stdout.split(`
2271
+ `);
2272
+ const hasAnthropicKey = lines.some((line) => {
2273
+ return /^ANTHROPIC_API_KEY\s+/.test(line);
2274
+ });
2275
+ if (hasAnthropicKey) {
2276
+ logEvent("tengu_install_github_app_step_completed", {
2277
+ step: "api-key"
2278
+ });
2279
+ setState((prev) => ({
2280
+ ...prev,
2281
+ secretExists: true,
2282
+ step: "check-existing-secret"
2283
+ }));
2284
+ } else {
2285
+ logEvent("tengu_install_github_app_step_completed", {
2286
+ step: "api-key"
2287
+ });
2288
+ await runSetupGitHubActions(apiKeyToUse, state.secretName);
2289
+ }
2290
+ } else {
2291
+ logEvent("tengu_install_github_app_step_completed", {
2292
+ step: "api-key"
2293
+ });
2294
+ await runSetupGitHubActions(apiKeyToUse, state.secretName);
2295
+ }
2296
+ }
2297
+ };
2298
+ const handleRepoUrlChange = (value) => {
2299
+ setState((prev) => ({ ...prev, selectedRepoName: value }));
2300
+ };
2301
+ const handleApiKeyChange = (value) => {
2302
+ setState((prev) => ({ ...prev, apiKeyOrOAuthToken: value }));
2303
+ };
2304
+ const handleApiKeyOptionChange = (option) => {
2305
+ setState((prev) => ({ ...prev, selectedApiKeyOption: option }));
2306
+ };
2307
+ const handleCreateOAuthToken = import_react6.useCallback(() => {
2308
+ logEvent("tengu_install_github_app_step_completed", {
2309
+ step: "api-key"
2310
+ });
2311
+ setState((prev) => ({ ...prev, step: "oauth-flow" }));
2312
+ }, []);
2313
+ const handleOAuthSuccess = import_react6.useCallback((token) => {
2314
+ logEvent("tengu_install_github_app_step_completed", {
2315
+ step: "oauth-flow"
2316
+ });
2317
+ setState((prev) => ({
2318
+ ...prev,
2319
+ apiKeyOrOAuthToken: token,
2320
+ useExistingKey: false,
2321
+ secretName: "CLAUDE_CODE_OAUTH_TOKEN",
2322
+ authType: "oauth_token"
2323
+ }));
2324
+ runSetupGitHubActions(token, "CLAUDE_CODE_OAUTH_TOKEN");
2325
+ }, [runSetupGitHubActions]);
2326
+ const handleOAuthCancel = import_react6.useCallback(() => {
2327
+ setState((prev) => ({ ...prev, step: "api-key" }));
2328
+ }, []);
2329
+ const handleSecretNameChange = (value) => {
2330
+ if (value && !/^[a-zA-Z0-9_]+$/.test(value))
2331
+ return;
2332
+ setState((prev) => ({ ...prev, secretName: value }));
2333
+ };
2334
+ const handleToggleUseCurrentRepo = (useCurrentRepo) => {
2335
+ setState((prev) => ({
2336
+ ...prev,
2337
+ useCurrentRepo,
2338
+ selectedRepoName: useCurrentRepo ? prev.currentRepo : ""
2339
+ }));
2340
+ };
2341
+ const handleToggleUseExistingKey = (useExistingKey) => {
2342
+ setState((prev) => ({ ...prev, useExistingKey }));
2343
+ };
2344
+ const handleToggleUseExistingSecret = (useExistingSecret) => {
2345
+ setState((prev) => ({
2346
+ ...prev,
2347
+ useExistingSecret,
2348
+ secretName: useExistingSecret ? "ANTHROPIC_API_KEY" : ""
2349
+ }));
2350
+ };
2351
+ const handleWorkflowAction = async (action) => {
2352
+ if (action === "exit") {
2353
+ props.onDone("Installation cancelled by user");
2354
+ return;
2355
+ }
2356
+ logEvent("tengu_install_github_app_step_completed", {
2357
+ step: "check-existing-workflow"
2358
+ });
2359
+ setState((prev) => ({ ...prev, workflowAction: action }));
2360
+ if (action === "skip" || action === "update") {
2361
+ if (existingApiKey) {
2362
+ await checkExistingSecret();
2363
+ } else {
2364
+ setState((prev) => ({ ...prev, step: "api-key" }));
2365
+ }
2366
+ }
2367
+ };
2368
+ function handleDismissKeyDown(e) {
2369
+ e.preventDefault();
2370
+ if (state.step === "success") {
2371
+ logEvent("tengu_install_github_app_completed", {});
2372
+ }
2373
+ props.onDone(state.step === "success" ? "GitHub Actions setup complete!" : state.error ? `Couldn't install GitHub App: ${state.error}
2374
+ For manual setup instructions, see: ${GITHUB_ACTION_SETUP_DOCS_URL}` : `GitHub App installation failed
2375
+ For manual setup instructions, see: ${GITHUB_ACTION_SETUP_DOCS_URL}`);
2376
+ }
2377
+ switch (state.step) {
2378
+ case "check-gh":
2379
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(CheckGitHubStep, {}, undefined, false, undefined, this);
2380
+ case "warnings":
2381
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(WarningsStep, {
2382
+ warnings: state.warnings,
2383
+ onContinue: handleSubmit
2384
+ }, undefined, false, undefined, this);
2385
+ case "choose-repo":
2386
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ChooseRepoStep, {
2387
+ currentRepo: state.currentRepo,
2388
+ useCurrentRepo: state.useCurrentRepo,
2389
+ repoUrl: state.selectedRepoName,
2390
+ onRepoUrlChange: handleRepoUrlChange,
2391
+ onToggleUseCurrentRepo: handleToggleUseCurrentRepo,
2392
+ onSubmit: handleSubmit
2393
+ }, undefined, false, undefined, this);
2394
+ case "install-app":
2395
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(InstallAppStep, {
2396
+ repoUrl: state.selectedRepoName,
2397
+ onSubmit: handleSubmit
2398
+ }, undefined, false, undefined, this);
2399
+ case "check-existing-workflow":
2400
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ExistingWorkflowStep, {
2401
+ repoName: state.selectedRepoName,
2402
+ onSelectAction: handleWorkflowAction
2403
+ }, undefined, false, undefined, this);
2404
+ case "check-existing-secret":
2405
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(CheckExistingSecretStep, {
2406
+ useExistingSecret: state.useExistingSecret,
2407
+ secretName: state.secretName,
2408
+ onToggleUseExistingSecret: handleToggleUseExistingSecret,
2409
+ onSecretNameChange: handleSecretNameChange,
2410
+ onSubmit: handleSubmit
2411
+ }, undefined, false, undefined, this);
2412
+ case "api-key":
2413
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ApiKeyStep, {
2414
+ existingApiKey,
2415
+ useExistingKey: state.useExistingKey,
2416
+ apiKeyOrOAuthToken: state.apiKeyOrOAuthToken,
2417
+ onApiKeyChange: handleApiKeyChange,
2418
+ onToggleUseExistingKey: handleToggleUseExistingKey,
2419
+ onSubmit: handleSubmit,
2420
+ onCreateOAuthToken: isAnthropicAuthEnabled() ? handleCreateOAuthToken : undefined,
2421
+ selectedOption: state.selectedApiKeyOption,
2422
+ onSelectOption: handleApiKeyOptionChange
2423
+ }, undefined, false, undefined, this);
2424
+ case "creating":
2425
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(CreatingStep, {
2426
+ currentWorkflowInstallStep: state.currentWorkflowInstallStep,
2427
+ secretExists: state.secretExists,
2428
+ useExistingSecret: state.useExistingSecret,
2429
+ secretName: state.secretName,
2430
+ skipWorkflow: state.workflowAction === "skip",
2431
+ selectedWorkflows: state.selectedWorkflows
2432
+ }, undefined, false, undefined, this);
2433
+ case "success":
2434
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ThemedBox_default, {
2435
+ tabIndex: 0,
2436
+ autoFocus: true,
2437
+ onKeyDown: handleDismissKeyDown,
2438
+ children: /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(SuccessStep, {
2439
+ secretExists: state.secretExists,
2440
+ useExistingSecret: state.useExistingSecret,
2441
+ secretName: state.secretName,
2442
+ skipWorkflow: state.workflowAction === "skip"
2443
+ }, undefined, false, undefined, this)
2444
+ }, undefined, false, undefined, this);
2445
+ case "error":
2446
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ThemedBox_default, {
2447
+ tabIndex: 0,
2448
+ autoFocus: true,
2449
+ onKeyDown: handleDismissKeyDown,
2450
+ children: /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(ErrorStep, {
2451
+ error: state.error,
2452
+ errorReason: state.errorReason,
2453
+ errorInstructions: state.errorInstructions
2454
+ }, undefined, false, undefined, this)
2455
+ }, undefined, false, undefined, this);
2456
+ case "select-workflows":
2457
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(WorkflowMultiselectDialog, {
2458
+ defaultSelections: state.selectedWorkflows,
2459
+ onSubmit: (selectedWorkflows) => {
2460
+ logEvent("tengu_install_github_app_step_completed", {
2461
+ step: "select-workflows"
2462
+ });
2463
+ setState((prev) => ({
2464
+ ...prev,
2465
+ selectedWorkflows
2466
+ }));
2467
+ if (existingApiKey) {
2468
+ checkExistingSecret();
2469
+ } else {
2470
+ setState((prev) => ({ ...prev, step: "api-key" }));
2471
+ }
2472
+ }
2473
+ }, undefined, false, undefined, this);
2474
+ case "oauth-flow":
2475
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(OAuthFlowStep, {
2476
+ onSuccess: handleOAuthSuccess,
2477
+ onCancel: handleOAuthCancel
2478
+ }, undefined, false, undefined, this);
2479
+ }
2480
+ }
2481
+ async function call(onDone) {
2482
+ return /* @__PURE__ */ jsx_dev_runtime13.jsxDEV(InstallGitHubApp, {
2483
+ onDone
2484
+ }, undefined, false, undefined, this);
2485
+ }
2486
+ var import_react6, jsx_dev_runtime13, INITIAL_STATE;
2487
+ var init_install_github_app = __esm(() => {
2488
+ init_execa();
2489
+ init_analytics();
2490
+ init_WorkflowMultiselectDialog();
2491
+ init_github_app();
2492
+ init_useExitOnCtrlCDWithKeybindings();
2493
+ init_src();
2494
+ init_auth();
2495
+ init_browser();
2496
+ init_execFileNoThrow();
2497
+ init_git();
2498
+ init_stringUtils();
2499
+ init_ApiKeyStep();
2500
+ init_CheckExistingSecretStep();
2501
+ init_CheckGitHubStep();
2502
+ init_ChooseRepoStep();
2503
+ init_CreatingStep();
2504
+ init_ErrorStep();
2505
+ init_ExistingWorkflowStep();
2506
+ init_InstallAppStep();
2507
+ init_OAuthFlowStep();
2508
+ init_SuccessStep();
2509
+ init_setupGitHubActions();
2510
+ init_WarningsStep();
2511
+ import_react6 = __toESM(require_react(), 1);
2512
+ jsx_dev_runtime13 = __toESM(require_jsx_dev_runtime(), 1);
2513
+ INITIAL_STATE = {
2514
+ step: "check-gh",
2515
+ selectedRepoName: "",
2516
+ currentRepo: "",
2517
+ useCurrentRepo: false,
2518
+ apiKeyOrOAuthToken: "",
2519
+ useExistingKey: true,
2520
+ currentWorkflowInstallStep: 0,
2521
+ warnings: [],
2522
+ secretExists: false,
2523
+ secretName: "ANTHROPIC_API_KEY",
2524
+ useExistingSecret: true,
2525
+ workflowExists: false,
2526
+ selectedWorkflows: ["claude", "claude-review"],
2527
+ selectedApiKeyOption: "new",
2528
+ authType: "api_key"
2529
+ };
2530
+ });
2531
+ init_install_github_app();
2532
+
2533
+ export {
2534
+ call
2535
+ };