voxflow 1.15.0 → 1.15.2

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 (453) hide show
  1. package/README.md +34 -0
  2. package/bin/voxflow.js +27 -0
  3. package/dist/index.js +1 -1
  4. package/dist/remotion-bundle/02a2fb2eb80bc7bf.woff2 +0 -0
  5. package/dist/remotion-bundle/052ca5351e5e06ba.woff2 +0 -0
  6. package/dist/remotion-bundle/05853dd28f4019cb.woff2 +0 -0
  7. package/dist/remotion-bundle/072ead3737f7c0d0.woff2 +0 -0
  8. package/dist/remotion-bundle/07d4248613c86a2e.woff2 +0 -0
  9. package/dist/remotion-bundle/0884a5c2d1d2d99b.woff2 +0 -0
  10. package/dist/remotion-bundle/0b0e185b2752095e.woff2 +0 -0
  11. package/dist/remotion-bundle/0e66c11bde067d91.woff2 +0 -0
  12. package/dist/remotion-bundle/0f7794cfba2c5d21.woff2 +0 -0
  13. package/dist/remotion-bundle/0fdbae5a4365783a.woff2 +0 -0
  14. package/dist/remotion-bundle/112.bundle.js +11 -0
  15. package/dist/remotion-bundle/112.bundle.js.map +1 -0
  16. package/dist/remotion-bundle/113.bundle.js +11 -0
  17. package/dist/remotion-bundle/113.bundle.js.map +1 -0
  18. package/dist/remotion-bundle/119cae0c4c16f7ed.woff2 +0 -0
  19. package/dist/remotion-bundle/14725f649fd1e78c.woff2 +0 -0
  20. package/dist/remotion-bundle/14abe9e3f95f7888.woff2 +0 -0
  21. package/dist/remotion-bundle/163.bundle.js +14678 -0
  22. package/dist/remotion-bundle/163.bundle.js.map +1 -0
  23. package/dist/remotion-bundle/1808c54072bf6d14.woff2 +0 -0
  24. package/dist/remotion-bundle/18948bec3e3012fe.woff2 +0 -0
  25. package/dist/remotion-bundle/1a661c60d0fc84fc.woff2 +0 -0
  26. package/dist/remotion-bundle/1af94941e1bc7e1e.woff2 +0 -0
  27. package/dist/remotion-bundle/1bee0219595f606c.woff2 +0 -0
  28. package/dist/remotion-bundle/1bfd5da7ce9d4ec4.woff2 +0 -0
  29. package/dist/remotion-bundle/1c158d56f1884f3f.woff2 +0 -0
  30. package/dist/remotion-bundle/1cf5e88e667610eb.woff2 +0 -0
  31. package/dist/remotion-bundle/1d431bd10f53c481.woff2 +0 -0
  32. package/dist/remotion-bundle/1d701a81a7670db2.woff2 +0 -0
  33. package/dist/remotion-bundle/1da0fecad4240f16.woff2 +0 -0
  34. package/dist/remotion-bundle/1ed14d3d0c5c63fe.woff2 +0 -0
  35. package/dist/remotion-bundle/1edfecf40e586f53.woff2 +0 -0
  36. package/dist/remotion-bundle/1f479711bc34b054.woff +0 -0
  37. package/dist/remotion-bundle/1f86e54a0ff5fcd1.woff2 +0 -0
  38. package/dist/remotion-bundle/2043ea87d9aabd11.woff2 +0 -0
  39. package/dist/remotion-bundle/20563c39ee8a0e40.woff2 +0 -0
  40. package/dist/remotion-bundle/20c231590fd12c44.woff2 +0 -0
  41. package/dist/remotion-bundle/20ce61713f754c07.woff2 +0 -0
  42. package/dist/remotion-bundle/21eb9306fce24bb1.woff2 +0 -0
  43. package/dist/remotion-bundle/244bf71c0cc851af.woff2 +0 -0
  44. package/dist/remotion-bundle/274d4cfc02bffbcb.woff2 +0 -0
  45. package/dist/remotion-bundle/275.bundle.js +21 -0
  46. package/dist/remotion-bundle/275.bundle.js.map +1 -0
  47. package/dist/remotion-bundle/2958f540b39513dc.woff2 +0 -0
  48. package/dist/remotion-bundle/2a168b98fd97722e.woff2 +0 -0
  49. package/dist/remotion-bundle/2d1f6373937ab55f.woff2 +0 -0
  50. package/dist/remotion-bundle/2d213ae47ff6daa9.woff2 +0 -0
  51. package/dist/remotion-bundle/2e4b1f04fcd05047.woff2 +0 -0
  52. package/dist/remotion-bundle/304170d98f4c4563.woff2 +0 -0
  53. package/dist/remotion-bundle/30d02e136e7a5642.woff2 +0 -0
  54. package/dist/remotion-bundle/3135562b52a714cd.woff2 +0 -0
  55. package/dist/remotion-bundle/313713af2c8144e9.woff2 +0 -0
  56. package/dist/remotion-bundle/325fa4108d2285b9.woff2 +0 -0
  57. package/dist/remotion-bundle/338e927ed3345e0c.woff2 +0 -0
  58. package/dist/remotion-bundle/35fc6b190365bc17.woff2 +0 -0
  59. package/dist/remotion-bundle/37a51f1122d4efc5.woff2 +0 -0
  60. package/dist/remotion-bundle/39a4d63e02736f5e.woff2 +0 -0
  61. package/dist/remotion-bundle/3a00e0d62dfc4171.woff2 +0 -0
  62. package/dist/remotion-bundle/3a6955e6561affe1.woff2 +0 -0
  63. package/dist/remotion-bundle/3c573945aef49b89.woff2 +0 -0
  64. package/dist/remotion-bundle/3cdbfbfa23b516a5.woff2 +0 -0
  65. package/dist/remotion-bundle/3e42f85a9e64ca8a.woff2 +0 -0
  66. package/dist/remotion-bundle/3e83eaf1ec859415.woff2 +0 -0
  67. package/dist/remotion-bundle/3f3c8c90de1250ee.woff2 +0 -0
  68. package/dist/remotion-bundle/434.bundle.js +205 -0
  69. package/dist/remotion-bundle/434.bundle.js.map +1 -0
  70. package/dist/remotion-bundle/44ffc6ca4d781692.woff2 +0 -0
  71. package/dist/remotion-bundle/4670d9c4580b09eb.woff2 +0 -0
  72. package/dist/remotion-bundle/479756881b302824.woff2 +0 -0
  73. package/dist/remotion-bundle/481b82134bfa9c82.woff2 +0 -0
  74. package/dist/remotion-bundle/48d27029626f4328.woff2 +0 -0
  75. package/dist/remotion-bundle/49b7b2a30329c511.woff2 +0 -0
  76. package/dist/remotion-bundle/4c8b25a1a9337045.woff2 +0 -0
  77. package/dist/remotion-bundle/4cba14788ca9259b.woff2 +0 -0
  78. package/dist/remotion-bundle/4cd6c589c004a6a7.woff2 +0 -0
  79. package/dist/remotion-bundle/4cd8d79c1021608d.woff2 +0 -0
  80. package/dist/remotion-bundle/4d8fa99b3f00f9f0.woff2 +0 -0
  81. package/dist/remotion-bundle/4e7805a643f86d53.woff2 +0 -0
  82. package/dist/remotion-bundle/4ff91be454542e3f.woff2 +0 -0
  83. package/dist/remotion-bundle/504cbcba1f63591b.woff2 +0 -0
  84. package/dist/remotion-bundle/5202d792e5791d6c.woff2 +0 -0
  85. package/dist/remotion-bundle/534db5ad4770cc1d.woff2 +0 -0
  86. package/dist/remotion-bundle/53b9568eb85f866b.woff2 +0 -0
  87. package/dist/remotion-bundle/543ad386ca171de9.woff2 +0 -0
  88. package/dist/remotion-bundle/54798e55bbf7976e.woff2 +0 -0
  89. package/dist/remotion-bundle/580.bundle.js +11 -0
  90. package/dist/remotion-bundle/580.bundle.js.map +1 -0
  91. package/dist/remotion-bundle/58d174d1193af6d1.woff2 +0 -0
  92. package/dist/remotion-bundle/591d29ff3ff53c80.woff2 +0 -0
  93. package/dist/remotion-bundle/5c28c4f4824383c6.woff2 +0 -0
  94. package/dist/remotion-bundle/5da9740d2ce894c8.woff2 +0 -0
  95. package/dist/remotion-bundle/6197735364642360.woff2 +0 -0
  96. package/dist/remotion-bundle/6265a4335724080f.woff2 +0 -0
  97. package/dist/remotion-bundle/633f5e4f6394daa7.woff2 +0 -0
  98. package/dist/remotion-bundle/637d95ace6a69c49.woff2 +0 -0
  99. package/dist/remotion-bundle/648e04a04dacff8f.woff2 +0 -0
  100. package/dist/remotion-bundle/64a6e83045a008b2.woff2 +0 -0
  101. package/dist/remotion-bundle/651.bundle.js +11 -0
  102. package/dist/remotion-bundle/651.bundle.js.map +1 -0
  103. package/dist/remotion-bundle/65e2a988c070facc.woff2 +0 -0
  104. package/dist/remotion-bundle/66a2f6ce5cc69105.woff2 +0 -0
  105. package/dist/remotion-bundle/690.bundle.js +3479 -0
  106. package/dist/remotion-bundle/690.bundle.js.map +1 -0
  107. package/dist/remotion-bundle/690ff55252ca715d.woff2 +0 -0
  108. package/dist/remotion-bundle/6a01a1cff49314fc.woff2 +0 -0
  109. package/dist/remotion-bundle/6cbc32670982986c.woff2 +0 -0
  110. package/dist/remotion-bundle/6d3cc42ae547f454.woff2 +0 -0
  111. package/dist/remotion-bundle/6d8f4cfa1ddc0830.woff2 +0 -0
  112. package/dist/remotion-bundle/6e4d7c6ae65e2dc3.woff2 +0 -0
  113. package/dist/remotion-bundle/6e86418bbcefb2e8.woff2 +0 -0
  114. package/dist/remotion-bundle/6ee02884b29cf7fb.woff2 +0 -0
  115. package/dist/remotion-bundle/6f436a74c9e3252c.woff2 +0 -0
  116. package/dist/remotion-bundle/78c8022f1657618b.woff2 +0 -0
  117. package/dist/remotion-bundle/7c5444169792bca4.woff2 +0 -0
  118. package/dist/remotion-bundle/7c86bddd9d997212.woff2 +0 -0
  119. package/dist/remotion-bundle/7e1284684767f584.woff2 +0 -0
  120. package/dist/remotion-bundle/7e81c17522d182b2.woff2 +0 -0
  121. package/dist/remotion-bundle/7eb87be198f7858c.woff2 +0 -0
  122. package/dist/remotion-bundle/8060c928f948aab5.woff2 +0 -0
  123. package/dist/remotion-bundle/80bc9dfbea2b35ae.woff2 +0 -0
  124. package/dist/remotion-bundle/811b83f69963bb48.woff2 +0 -0
  125. package/dist/remotion-bundle/813.bundle.js +117511 -0
  126. package/dist/remotion-bundle/813.bundle.js.map +1 -0
  127. package/dist/remotion-bundle/84df492e349f82e9.woff2 +0 -0
  128. package/dist/remotion-bundle/8501bfd73eb36f2b.woff2 +0 -0
  129. package/dist/remotion-bundle/854236a8376093fe.woff2 +0 -0
  130. package/dist/remotion-bundle/8571d74529082753.woff2 +0 -0
  131. package/dist/remotion-bundle/860bf44f8e6f4b5d.woff2 +0 -0
  132. package/dist/remotion-bundle/879.bundle.js +64 -0
  133. package/dist/remotion-bundle/879.bundle.js.map +1 -0
  134. package/dist/remotion-bundle/887dd482f848d56f.woff2 +0 -0
  135. package/dist/remotion-bundle/89b2132e85fbbb5a.woff2 +0 -0
  136. package/dist/remotion-bundle/8ba60d6c306010c2.woff2 +0 -0
  137. package/dist/remotion-bundle/8c7c4dadea897806.woff2 +0 -0
  138. package/dist/remotion-bundle/8c943f9999706f61.woff2 +0 -0
  139. package/dist/remotion-bundle/8f2a718c90575cc9.woff2 +0 -0
  140. package/dist/remotion-bundle/906b6edb3e1772c9.woff2 +0 -0
  141. package/dist/remotion-bundle/930ff9daccdf14eb.woff2 +0 -0
  142. package/dist/remotion-bundle/934db2f1c403c4d0.woff2 +0 -0
  143. package/dist/remotion-bundle/938.bundle.js +451 -0
  144. package/dist/remotion-bundle/938.bundle.js.map +1 -0
  145. package/dist/remotion-bundle/967.bundle.js +4462 -0
  146. package/dist/remotion-bundle/967.bundle.js.map +1 -0
  147. package/dist/remotion-bundle/9684a1093d3c02ce.woff2 +0 -0
  148. package/dist/remotion-bundle/973dcd0faa6116cc.woff2 +0 -0
  149. package/dist/remotion-bundle/9745400694e76cd8.woff2 +0 -0
  150. package/dist/remotion-bundle/999ef957bed3bdca.woff2 +0 -0
  151. package/dist/remotion-bundle/99a3d67c8b0f43e3.woff2 +0 -0
  152. package/dist/remotion-bundle/a0586c3e03127283.woff2 +0 -0
  153. package/dist/remotion-bundle/a0eb654fdae46269.woff2 +0 -0
  154. package/dist/remotion-bundle/a20e35d3b08f7994.woff2 +0 -0
  155. package/dist/remotion-bundle/a2dcaced7c8c25ab.woff2 +0 -0
  156. package/dist/remotion-bundle/a79255a972a2681a.woff2 +0 -0
  157. package/dist/remotion-bundle/a804b352cb9fec1a.woff2 +0 -0
  158. package/dist/remotion-bundle/aae7117164e1eabc.woff2 +0 -0
  159. package/dist/remotion-bundle/affd121385d0442d.woff2 +0 -0
  160. package/dist/remotion-bundle/b19a6083987ee0d7.woff2 +0 -0
  161. package/dist/remotion-bundle/b1b2bd04d8637981.woff2 +0 -0
  162. package/dist/remotion-bundle/b2c07f341486be87.woff2 +0 -0
  163. package/dist/remotion-bundle/b33d8f82e575c4ce.woff2 +0 -0
  164. package/dist/remotion-bundle/b366c0bed35ef491.woff2 +0 -0
  165. package/dist/remotion-bundle/b41e857ec1b85642.woff2 +0 -0
  166. package/dist/remotion-bundle/b420bb34ccf23e7f.woff2 +0 -0
  167. package/dist/remotion-bundle/b4f7bf4efb0c0ccf.woff2 +0 -0
  168. package/dist/remotion-bundle/b60fe5eca03cff93.woff2 +0 -0
  169. package/dist/remotion-bundle/b6bd31a336e64bce.woff2 +0 -0
  170. package/dist/remotion-bundle/b6d2befba3dfefeb.woff2 +0 -0
  171. package/dist/remotion-bundle/b75f39ab06c43bf4.woff2 +0 -0
  172. package/dist/remotion-bundle/b77880e8c413d4fd.woff2 +0 -0
  173. package/dist/remotion-bundle/b7e38ec441e4a77a.woff2 +0 -0
  174. package/dist/remotion-bundle/b83baa383ff0bf2b.woff2 +0 -0
  175. package/dist/remotion-bundle/b9ad7b6c0a11450a.woff2 +0 -0
  176. package/dist/remotion-bundle/baf84486e8ae3aaf.woff2 +0 -0
  177. package/dist/remotion-bundle/bc047b1f6869cffa.woff2 +0 -0
  178. package/dist/remotion-bundle/bf4f3ac6e93f33aa.woff2 +0 -0
  179. package/dist/remotion-bundle/bf6835ffec5897a2.woff2 +0 -0
  180. package/dist/remotion-bundle/bf8885f581eb1724.woff2 +0 -0
  181. package/dist/remotion-bundle/bundle.js +83376 -0
  182. package/dist/remotion-bundle/bundle.js.map +1 -0
  183. package/dist/remotion-bundle/c03f046bccd789d0.woff2 +0 -0
  184. package/dist/remotion-bundle/c0bb1f8962b73bc3.woff2 +0 -0
  185. package/dist/remotion-bundle/c1003f9a7db6e1cf.woff2 +0 -0
  186. package/dist/remotion-bundle/c15d83fb1e199515.woff2 +0 -0
  187. package/dist/remotion-bundle/c28e7e5d310f73ef.woff2 +0 -0
  188. package/dist/remotion-bundle/c2b840274db78aea.woff2 +0 -0
  189. package/dist/remotion-bundle/c3000e3299d4e45f.woff2 +0 -0
  190. package/dist/remotion-bundle/c83ce886e5288510.woff2 +0 -0
  191. package/dist/remotion-bundle/c87a5a64d4ac0918.woff2 +0 -0
  192. package/dist/remotion-bundle/c8a7e0d049e965fa.woff2 +0 -0
  193. package/dist/remotion-bundle/c949a35d3a3b1faf.woff2 +0 -0
  194. package/dist/remotion-bundle/c9618c9b9ac2bc78.woff2 +0 -0
  195. package/dist/remotion-bundle/ca3add3b84152d5b.woff2 +0 -0
  196. package/dist/remotion-bundle/cad9dd036408d707.woff2 +0 -0
  197. package/dist/remotion-bundle/cbb24916619df439.woff2 +0 -0
  198. package/dist/remotion-bundle/cc054f0b5514e177.woff2 +0 -0
  199. package/dist/remotion-bundle/ccc248ed9312bc71.woff2 +0 -0
  200. package/dist/remotion-bundle/cd9d623aa07af925.woff2 +0 -0
  201. package/dist/remotion-bundle/ce2ba7a321bd1247.woff2 +0 -0
  202. package/dist/remotion-bundle/cf72455f79a29b14.woff2 +0 -0
  203. package/dist/remotion-bundle/d267cbfefab452ac.woff2 +0 -0
  204. package/dist/remotion-bundle/d435cff46a64955f.woff +0 -0
  205. package/dist/remotion-bundle/d494d07f67e363f6.woff2 +0 -0
  206. package/dist/remotion-bundle/d7aa0cc1fa47bf38.woff2 +0 -0
  207. package/dist/remotion-bundle/d7c5ca93d885160a.woff2 +0 -0
  208. package/dist/remotion-bundle/d855d3e252db74e2.woff2 +0 -0
  209. package/dist/remotion-bundle/d8f13d47f02f82c2.woff2 +0 -0
  210. package/dist/remotion-bundle/d9567cce2ee11019.woff2 +0 -0
  211. package/dist/remotion-bundle/db8d4456fc75dd86.woff +0 -0
  212. package/dist/remotion-bundle/dc274628378c47ee.woff2 +0 -0
  213. package/dist/remotion-bundle/dc3e06947bb69903.woff2 +0 -0
  214. package/dist/remotion-bundle/dd67040ac3b6d523.woff2 +0 -0
  215. package/dist/remotion-bundle/e0b04bd488f953f4.woff2 +0 -0
  216. package/dist/remotion-bundle/e2a572ff95089370.woff2 +0 -0
  217. package/dist/remotion-bundle/e2e18a86b1c2b0cc.woff2 +0 -0
  218. package/dist/remotion-bundle/e3a78ee2fc9c6931.woff2 +0 -0
  219. package/dist/remotion-bundle/e654c9d547605a9f.woff2 +0 -0
  220. package/dist/remotion-bundle/e67a3a64c129927c.woff2 +0 -0
  221. package/dist/remotion-bundle/e6be28b4203cd6ce.woff2 +0 -0
  222. package/dist/remotion-bundle/e841907ad9b0a191.woff +0 -0
  223. package/dist/remotion-bundle/e889d1541c69fffa.woff2 +0 -0
  224. package/dist/remotion-bundle/e88ef8c76373a9e2.woff2 +0 -0
  225. package/dist/remotion-bundle/e9c72f4bc37defef.woff2 +0 -0
  226. package/dist/remotion-bundle/e9e35f863403a255.woff2 +0 -0
  227. package/dist/remotion-bundle/eb23b37b009375da.woff2 +0 -0
  228. package/dist/remotion-bundle/ee1342b741625721.woff2 +0 -0
  229. package/dist/remotion-bundle/f07da88543a57ec9.woff2 +0 -0
  230. package/dist/remotion-bundle/f522982115306f8a.woff2 +0 -0
  231. package/dist/remotion-bundle/f8449bd864e6d8bc.woff2 +0 -0
  232. package/dist/remotion-bundle/f906dd5bd95ff9ab.woff2 +0 -0
  233. package/dist/remotion-bundle/f9e9e9413e3c38bb.woff2 +0 -0
  234. package/dist/remotion-bundle/fa5a5b16280994a8.woff2 +0 -0
  235. package/dist/remotion-bundle/favicon.ico +0 -0
  236. package/dist/remotion-bundle/fb19c0517725599b.woff2 +0 -0
  237. package/dist/remotion-bundle/fcaf24232f684b9b.woff2 +0 -0
  238. package/dist/remotion-bundle/fe09e084a3eea8cf.woff2 +0 -0
  239. package/dist/remotion-bundle/ff38d5317df7345a.woff2 +0 -0
  240. package/dist/remotion-bundle/ffe7ea1ea08f455a.woff2 +0 -0
  241. package/dist/remotion-bundle/index.html +49 -0
  242. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/0.mp3 +0 -0
  243. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/1.mp3 +0 -0
  244. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/2.mp3 +0 -0
  245. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/3.mp3 +0 -0
  246. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/0.mp3 +0 -0
  247. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/1.mp3 +0 -0
  248. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/2.mp3 +0 -0
  249. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/3.mp3 +0 -0
  250. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/0.mp3 +0 -0
  251. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/1.mp3 +0 -0
  252. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/2.mp3 +0 -0
  253. package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/3.mp3 +0 -0
  254. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/0.mp3 +0 -0
  255. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/1.mp3 +0 -0
  256. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/2.mp3 +0 -0
  257. package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/3.mp3 +0 -0
  258. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/0.mp3 +0 -0
  259. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/1.mp3 +0 -0
  260. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/2.mp3 +0 -0
  261. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/3.mp3 +0 -0
  262. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/0.mp3 +0 -0
  263. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/1.mp3 +0 -0
  264. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/2.mp3 +0 -0
  265. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/3.mp3 +0 -0
  266. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/0.mp3 +0 -0
  267. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/1.mp3 +0 -0
  268. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/2.mp3 +0 -0
  269. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/3.mp3 +0 -0
  270. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/0.mp3 +0 -0
  271. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/1.mp3 +0 -0
  272. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/2.mp3 +0 -0
  273. package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/3.mp3 +0 -0
  274. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/0.mp3 +0 -0
  275. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/1.mp3 +0 -0
  276. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/2.mp3 +0 -0
  277. package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/3.mp3 +0 -0
  278. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/0.mp3 +0 -0
  279. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/1.mp3 +0 -0
  280. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/2.mp3 +0 -0
  281. package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/3.mp3 +0 -0
  282. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/0.mp3 +0 -0
  283. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/1.mp3 +0 -0
  284. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/2.mp3 +0 -0
  285. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/3.mp3 +0 -0
  286. package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/4.mp3 +0 -0
  287. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/0.mp3 +0 -0
  288. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/1.mp3 +0 -0
  289. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/2.mp3 +0 -0
  290. package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/3.mp3 +0 -0
  291. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/0.mp3 +0 -0
  292. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/1.mp3 +0 -0
  293. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/2.mp3 +0 -0
  294. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/3.mp3 +0 -0
  295. package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/4.mp3 +0 -0
  296. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/0.mp3 +0 -0
  297. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/1.mp3 +0 -0
  298. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/2.mp3 +0 -0
  299. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/3.mp3 +0 -0
  300. package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/4.mp3 +0 -0
  301. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/0.mp3 +0 -0
  302. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/1.mp3 +0 -0
  303. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/2.mp3 +0 -0
  304. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/3.mp3 +0 -0
  305. package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/4.mp3 +0 -0
  306. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/0.mp3 +0 -0
  307. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/1.mp3 +0 -0
  308. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/2.mp3 +0 -0
  309. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/3.mp3 +0 -0
  310. package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/4.mp3 +0 -0
  311. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/0.mp3 +0 -0
  312. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/1.mp3 +0 -0
  313. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/2.mp3 +0 -0
  314. package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/3.mp3 +0 -0
  315. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/0.mp3 +0 -0
  316. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/1.mp3 +0 -0
  317. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/2.mp3 +0 -0
  318. package/dist/remotion-bundle/public/paper-slide-experiments/product-update/3.mp3 +0 -0
  319. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/0.mp3 +0 -0
  320. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/1.mp3 +0 -0
  321. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/2.mp3 +0 -0
  322. package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/3.mp3 +0 -0
  323. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/0.mp3 +0 -0
  324. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/1.mp3 +0 -0
  325. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/2.mp3 +0 -0
  326. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/3.mp3 +0 -0
  327. package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/4.mp3 +0 -0
  328. package/dist/remotion-bundle/public/voiceover/ai-life/card-0.mp3 +0 -0
  329. package/dist/remotion-bundle/public/voiceover/ai-life/card-1.mp3 +0 -0
  330. package/dist/remotion-bundle/public/voiceover/ai-life/card-2.mp3 +0 -0
  331. package/dist/remotion-bundle/public/voiceover/ai-life/card-3.mp3 +0 -0
  332. package/dist/remotion-bundle/public/voiceover/ai-life/card-4.mp3 +0 -0
  333. package/dist/remotion-bundle/public/voiceover/ai-life/card-5.mp3 +0 -0
  334. package/dist/remotion-bundle/public/voiceover/coffee-science/card-0.mp3 +0 -0
  335. package/dist/remotion-bundle/public/voiceover/coffee-science/card-1.mp3 +0 -0
  336. package/dist/remotion-bundle/public/voiceover/coffee-science/card-2.mp3 +0 -0
  337. package/dist/remotion-bundle/public/voiceover/coffee-science/card-3.mp3 +0 -0
  338. package/dist/remotion-bundle/public/voiceover/coffee-science/card-4.mp3 +0 -0
  339. package/dist/remotion-bundle/public/voiceover/coffee-science/card-5.mp3 +0 -0
  340. package/dist/remotion-bundle/public/voiceover/coffee-science/card-6.mp3 +0 -0
  341. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-0.mp3 +0 -0
  342. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-1.mp3 +0 -0
  343. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-2.mp3 +0 -0
  344. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-3.mp3 +0 -0
  345. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-4.mp3 +0 -0
  346. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-5.mp3 +0 -0
  347. package/dist/remotion-bundle/public/voiceover/reading-secrets/card-6.mp3 +0 -0
  348. package/dist/remotion-bundle/public/voiceover/remote-work/card-0.mp3 +0 -0
  349. package/dist/remotion-bundle/public/voiceover/remote-work/card-1.mp3 +0 -0
  350. package/dist/remotion-bundle/public/voiceover/remote-work/card-2.mp3 +0 -0
  351. package/dist/remotion-bundle/public/voiceover/remote-work/card-3.mp3 +0 -0
  352. package/dist/remotion-bundle/public/voiceover/remote-work/card-4.mp3 +0 -0
  353. package/dist/remotion-bundle/public/voiceover/remote-work/card-5.mp3 +0 -0
  354. package/dist/remotion-bundle/source-map-helper.wasm +0 -0
  355. package/lib/cli.js +270 -0
  356. package/lib/commands/_registry.js +48 -0
  357. package/lib/commands/add.js +242 -0
  358. package/lib/commands/asr/azure-transcribe.js +336 -0
  359. package/lib/commands/asr/cloud-transcribe.js +384 -0
  360. package/lib/commands/asr/helpers.js +76 -0
  361. package/lib/commands/asr/index.js +236 -0
  362. package/lib/commands/asr/local-transcribe.js +125 -0
  363. package/lib/commands/asr-jobs.js +257 -0
  364. package/lib/commands/asr.js +11 -0
  365. package/lib/commands/auth-cmds.js +358 -0
  366. package/lib/commands/dub.js +542 -0
  367. package/lib/commands/explain.js +512 -0
  368. package/lib/commands/feedback.js +152 -0
  369. package/lib/commands/image.js +207 -0
  370. package/lib/commands/mcp-key.js +166 -0
  371. package/lib/commands/narrate.js +639 -0
  372. package/lib/commands/picstory-templates.js +276 -0
  373. package/lib/commands/picstory.js +547 -0
  374. package/lib/commands/podcast/dialogue.js +109 -0
  375. package/lib/commands/podcast/generate.js +127 -0
  376. package/lib/commands/podcast/index.js +561 -0
  377. package/lib/commands/podcast/synthesize.js +188 -0
  378. package/lib/commands/podcast.js +11 -0
  379. package/lib/commands/present.js +519 -0
  380. package/lib/commands/publish.js +415 -0
  381. package/lib/commands/skills.js +473 -0
  382. package/lib/commands/slice-render.js +282 -0
  383. package/lib/commands/slice-stage.js +264 -0
  384. package/lib/commands/slice.js +346 -0
  385. package/lib/commands/slides/constants.js +108 -0
  386. package/lib/commands/slides/html-renderer.js +338 -0
  387. package/lib/commands/slides/index.js +345 -0
  388. package/lib/commands/slides.js +11 -0
  389. package/lib/commands/story.js +302 -0
  390. package/lib/commands/summarize.js +532 -0
  391. package/lib/commands/synthesize.js +261 -0
  392. package/lib/commands/translate.js +593 -0
  393. package/lib/commands/upgrade.js +249 -0
  394. package/lib/commands/video-translate.js +577 -0
  395. package/lib/commands/voices.js +292 -0
  396. package/lib/core/agent-env.js +104 -0
  397. package/lib/core/args.js +107 -0
  398. package/lib/core/asr-client.js +448 -0
  399. package/lib/core/asr-jobs-client.js +126 -0
  400. package/lib/core/asr-jobs-store.js +105 -0
  401. package/lib/core/asr-r2-upload.js +181 -0
  402. package/lib/core/asr-upload.js +132 -0
  403. package/lib/core/audio-extract.js +150 -0
  404. package/lib/core/audio.js +219 -0
  405. package/lib/core/auth.js +880 -0
  406. package/lib/core/config.js +197 -0
  407. package/lib/core/feedback.js +64 -0
  408. package/lib/core/ffmpeg.js +476 -0
  409. package/lib/core/http.js +188 -0
  410. package/lib/core/image-client.js +55 -0
  411. package/lib/core/intent-params.js +11 -0
  412. package/lib/core/llm-client.js +76 -0
  413. package/lib/core/logger.js +208 -0
  414. package/lib/core/mic-recorder.js +182 -0
  415. package/lib/core/pause-markers.js +94 -0
  416. package/lib/core/podcast-pacing.js +118 -0
  417. package/lib/core/spinner.js +33 -0
  418. package/lib/core/srt.js +394 -0
  419. package/lib/core/telemetry.js +100 -0
  420. package/lib/core/timeline.js +92 -0
  421. package/lib/core/tts-synthesizer.js +70 -0
  422. package/lib/core/update-check.js +185 -0
  423. package/lib/core/url-download.js +148 -0
  424. package/lib/core/whisper-local.js +279 -0
  425. package/lib/internal/deck-validator.js +488 -0
  426. package/lib/internal/slice-themes.json +370 -0
  427. package/lib/stage-core/cloud-render.js +170 -0
  428. package/lib/stage-core/deck-format.js +133 -0
  429. package/lib/stage-core/edit-prompt.js +104 -0
  430. package/lib/stage-core/event-bus.js +31 -0
  431. package/lib/stage-core/port.js +46 -0
  432. package/lib/stage-core/server.js +352 -0
  433. package/lib/stage-core/snapshot-store.js +198 -0
  434. package/lib/stage-core/watcher.js +106 -0
  435. package/lib/stage-ui/slice/template.js +1672 -0
  436. package/package.json +9 -4
  437. package/skills/.claude-plugin/marketplace.json +22 -0
  438. package/skills/.claude-plugin/plugin.json +25 -0
  439. package/skills/LICENSE +21 -0
  440. package/skills/README.md +120 -0
  441. package/skills/hub/SKILL.md +317 -0
  442. package/skills/podcast/SKILL.md +146 -0
  443. package/skills/slice/SKILL.md +205 -0
  444. package/skills/slice/agents/openai.yaml +4 -0
  445. package/skills/slice/references/deck-schema.md +183 -0
  446. package/skills/slice/references/example-decks.md +108 -0
  447. package/skills/slice/references/themes.md +172 -0
  448. package/skills/transcribe/SKILL.md +473 -0
  449. package/skills/video/SKILL.md +261 -0
  450. package/skills/voxflow-slice/SKILL.md +271 -0
  451. package/skills/voxflow-slice/examples/article.md +13 -0
  452. package/skills/voxflow-slice/examples/expected-deck.json +39 -0
  453. package/skills/voxflow-slice/examples/validate.mjs +46 -0
@@ -0,0 +1,473 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * VoxFlow CLI — `skills` subcommand surface.
5
+ *
6
+ * Single-command installer for VoxFlow Skills across AI agents.
7
+ * Detects which agents are available locally and runs the right install
8
+ * command for each. Falls back to the universal `npx skills add ...`
9
+ * Skills-protocol installer when no specific agent is detected.
10
+ *
11
+ * Subcommands:
12
+ * install [--for <agent>] [--all] [--dry-run] [-y] Install skills
13
+ * list Show supported agents
14
+ * detect Show what's detected
15
+ */
16
+
17
+ const { execFile, execFileSync } = require('child_process');
18
+ const { promisify } = require('util');
19
+ const readline = require('readline');
20
+ const { getFreshTokenInfo } = require('../core/auth');
21
+ const { detectAIAgent } = require('../core/agent-env');
22
+
23
+ const execFileAsync = promisify(execFile);
24
+
25
+ const SKILLS_NPM_TARGET = 'VoxFlowStudio/skills';
26
+ const SKILL_LIST = ['hub', 'podcast', 'transcribe', 'video', 'slice'];
27
+
28
+ // Universal install command — same for every agent. The `skills` npm package
29
+ // detects which AI agents are present on the user's machine and installs the
30
+ // skill files (or symlinks them, for Claude Code etc.) into the right
31
+ // per-agent locations automatically. We do NOT need a per-agent install:
32
+ // - `claude skills add voxflow` does NOT exist (was wrong in earlier docs)
33
+ // - `npx skills add VoxFlowStudio/skills --skill voxflow` was wrong too —
34
+ // `--skill voxflow` is interpreted as "find a skill literally named
35
+ // voxflow", but our repo has 5 skills (hub / podcast / transcribe /
36
+ // video / slice), no skill called voxflow.
37
+ //
38
+ // Flags:
39
+ // --all install every skill in the target repo (we ship all 5).
40
+ // --yes auto-confirm target-agent prompts (non-interactive).
41
+ // --global install to `~/.agents/skills/` instead of `./.agents/skills/`.
42
+ // Without this, the `skills` package writes to the current
43
+ // directory, so the install evaporates when the user `cd`s
44
+ // elsewhere — see 1.10.3 verify (skills landed in /tmp/...
45
+ // and were inaccessible from the user's normal cwd).
46
+ const UNIVERSAL_INSTALL = Object.freeze([
47
+ 'npx', Object.freeze(['-y', 'skills', 'add', SKILLS_NPM_TARGET, '--all', '--yes', '--global']),
48
+ ]);
49
+
50
+ // Agent registry. Each entry must define:
51
+ // name Human-readable display name
52
+ // binary CLI binary used for detection (null = no auto-detection)
53
+ // install [cmd, args[]] to install skills for this agent
54
+ // docs URL to agent-specific docs / install page
55
+ const AGENTS = {
56
+ claude: {
57
+ name: 'Claude Code',
58
+ binary: 'claude',
59
+ install: UNIVERSAL_INSTALL,
60
+ docs: 'https://docs.anthropic.com/claude/docs/claude-code',
61
+ },
62
+ cursor: {
63
+ name: 'Cursor',
64
+ binary: 'cursor',
65
+ install: UNIVERSAL_INSTALL,
66
+ docs: 'https://docs.cursor.com/',
67
+ },
68
+ codex: {
69
+ name: 'Codex CLI',
70
+ binary: 'codex',
71
+ install: UNIVERSAL_INSTALL,
72
+ docs: 'https://github.com/openai/codex',
73
+ },
74
+ gemini: {
75
+ name: 'Gemini CLI',
76
+ binary: 'gemini',
77
+ install: UNIVERSAL_INSTALL,
78
+ docs: 'https://github.com/google-gemini/gemini-cli',
79
+ },
80
+ workbuddy: {
81
+ name: 'WorkBuddy',
82
+ binary: 'workbuddy',
83
+ install: UNIVERSAL_INSTALL,
84
+ docs: 'https://voxflow.studio/docs/skills',
85
+ },
86
+ openclaw: {
87
+ name: 'OpenClaw',
88
+ binary: 'openclaw',
89
+ install: UNIVERSAL_INSTALL,
90
+ docs: 'https://voxflow.studio/docs/skills',
91
+ },
92
+ generic: {
93
+ name: 'Generic Skills-protocol agent',
94
+ binary: null,
95
+ install: UNIVERSAL_INSTALL,
96
+ docs: 'https://voxflow.studio/docs/skills',
97
+ },
98
+ };
99
+
100
+ const AUTO_DETECTABLE = Object.keys(AGENTS).filter((k) => AGENTS[k].binary);
101
+
102
+ // ─── Detection ────────────────────────────────────────────────────────────
103
+
104
+ function binaryExists(binary, _exec = execFileSync) {
105
+ if (!binary) return false;
106
+ try {
107
+ const which = process.platform === 'win32' ? 'where' : 'which';
108
+ _exec(which, [binary], { stdio: 'ignore', timeout: 3000 });
109
+ return true;
110
+ } catch {
111
+ return false;
112
+ }
113
+ }
114
+
115
+ function detectAgents(_exec = execFileSync) {
116
+ return AUTO_DETECTABLE
117
+ .filter((key) => binaryExists(AGENTS[key].binary, _exec))
118
+ .map((key) => ({ key, ...AGENTS[key] }));
119
+ }
120
+
121
+ // ─── Selection logic ──────────────────────────────────────────────────────
122
+
123
+ /**
124
+ * Collapse the list of install targets so that any two whose install command
125
+ * is byte-identical run only once. With the current registry every entry uses
126
+ * the same UNIVERSAL_INSTALL tuple, so this folds N targets into 1 — the
127
+ * underlying `npx skills add` walks the user's machine and writes to every
128
+ * agent's standard location in a single invocation.
129
+ */
130
+ function dedupeByInstallCommand(targets) {
131
+ const seen = new Map();
132
+ for (const t of targets) {
133
+ const key = `${t.install[0]} ${t.install[1].join(' ')}`;
134
+ if (!seen.has(key)) seen.set(key, t);
135
+ }
136
+ return Array.from(seen.values());
137
+ }
138
+
139
+ function chooseTargets(opts, detected) {
140
+ if (opts.for) {
141
+ const t = AGENTS[opts.for];
142
+ if (!t) {
143
+ const known = Object.keys(AGENTS).join(', ');
144
+ throw new Error(`Unknown agent "${opts.for}". Supported: ${known}`);
145
+ }
146
+ return [{ key: opts.for, ...t }];
147
+ }
148
+ // Default: list every detected agent. Since the underlying universal
149
+ // install writes to every agent's standard location in one shot, showing
150
+ // only the "first" detected agent (older behavior) was misleading — the
151
+ // user got skills installed for ALL detected agents but the UI suggested
152
+ // otherwise. `--all` is now the implicit default; the flag is kept as a
153
+ // no-op alias so existing scripts don't break.
154
+ if (detected.length === 0) return [{ key: 'generic', ...AGENTS.generic }];
155
+ return detected;
156
+ }
157
+
158
+ // ─── Args ─────────────────────────────────────────────────────────────────
159
+
160
+ function parseArgs(argv) {
161
+ const opts = { for: null, all: false, dryRun: false, yes: false };
162
+ for (let i = 0; i < argv.length; i++) {
163
+ const a = argv[i];
164
+ if (a === '--for') { opts.for = argv[++i]; if (opts.for) opts.for = opts.for.toLowerCase(); }
165
+ else if (a === '--all') opts.all = true;
166
+ else if (a === '--dry-run') opts.dryRun = true;
167
+ else if (a === '-y' || a === '--yes') opts.yes = true;
168
+ }
169
+ return opts;
170
+ }
171
+
172
+ // ─── Install execution ────────────────────────────────────────────────────
173
+
174
+ async function runInstall(target, { dryRun }, _exec = execFileAsync) {
175
+ const [cmd, args] = target.install;
176
+ const printable = `${cmd} ${args.join(' ')}`;
177
+ if (dryRun) return { ok: true, dryRun: true, command: printable };
178
+ try {
179
+ const { stdout, stderr } = await _exec(cmd, args, { timeout: 180_000 });
180
+ return { ok: true, stdout, stderr, command: printable };
181
+ } catch (err) {
182
+ return { ok: false, error: err, command: printable };
183
+ }
184
+ }
185
+
186
+ // ─── User prompt ──────────────────────────────────────────────────────────
187
+
188
+ function ask(question, _input = process.stdin, _output = process.stderr) {
189
+ return new Promise((resolve) => {
190
+ if (!_input.isTTY) { resolve(''); return; }
191
+ const rl = readline.createInterface({ input: _input, output: _output });
192
+ rl.question(question, (a) => { rl.close(); resolve(a.trim()); });
193
+ });
194
+ }
195
+
196
+ // ─── Output helpers ───────────────────────────────────────────────────────
197
+
198
+ function out(line) { process.stderr.write(line); }
199
+
200
+ function printDetection(detected, allKeys = AUTO_DETECTABLE) {
201
+ out(' Detecting AI agents on this machine...\n');
202
+ for (const key of allKeys) {
203
+ const found = detected.some((d) => d.key === key);
204
+ const mark = found ? '✓' : '·';
205
+ const suffix = found ? '' : ' (not detected)';
206
+ out(` ${mark} ${AGENTS[key].name}${suffix}\n`);
207
+ }
208
+ out('\n');
209
+ }
210
+
211
+ function printList() {
212
+ out('\n Supported AI agents and install methods:\n\n');
213
+ for (const [key, info] of Object.entries(AGENTS)) {
214
+ const cmd = `${info.install[0]} ${info.install[1].join(' ')}`;
215
+ const auto = info.binary ? '[auto-detect]' : '[fallback]';
216
+ out(` ${key.padEnd(11)} ${info.name.padEnd(35)} ${auto}\n`);
217
+ out(` → ${cmd}\n`);
218
+ }
219
+ out('\n Run `voxflow skills install` for auto-detection,\n');
220
+ out(' or `voxflow skills install --for <agent>` to force one,\n');
221
+ out(' or `voxflow skills install --all` to install for every detected agent.\n\n');
222
+ }
223
+
224
+ function printNextSteps(targets, hasFailures) {
225
+ out('\n What you can do now:\n');
226
+ out(' 1. Make sure CLI is logged in (only needed once):\n');
227
+ out(' voxflow login\n');
228
+ out(' 2. Open your AI agent and try saying:\n');
229
+ out(' "把这段话合成语音"\n');
230
+ out(' "生成一个 3 分钟 AI 播客"\n');
231
+ out(' "把这个视频翻译成日语"\n');
232
+ if (hasFailures) {
233
+ out('\n ⚠ Some installs failed. You can retry manually with:\n');
234
+ for (const t of targets) {
235
+ out(` ${t.install[0]} ${t.install[1].join(' ')}\n`);
236
+ }
237
+ }
238
+ out('\n Docs: https://voxflow.studio/docs/skills\n\n');
239
+ }
240
+
241
+ // ─── Pre-flight auth advice ───────────────────────────────────────────────
242
+ //
243
+ // The skill install commands themselves don't authenticate against VoxFlow —
244
+ // they only place skill files where the agent can read them. But the user's
245
+ // real goal is "install + use it"; we surface auth status here so they (or
246
+ // the AI agent driving the install) don't discover the missing login at the
247
+ // next `voxflow say` call.
248
+ //
249
+ // We check via getFreshTokenInfo() which transparently uses a cached refresh
250
+ // token if available — so an expired access token but valid refresh token
251
+ // shows up as "logged in" silently.
252
+
253
+ async function preflightAuthAdvice() {
254
+ let info;
255
+ try {
256
+ info = await getFreshTokenInfo();
257
+ } catch {
258
+ info = null;
259
+ }
260
+
261
+ if (info && info.valid) {
262
+ out(` ✓ Logged in as ${info.email}\n\n`);
263
+ return { loggedIn: true, info };
264
+ }
265
+
266
+ const agentName = detectAIAgent();
267
+ out(' ⚠ Not logged in to VoxFlow.\n');
268
+ out(' Skills will install successfully, but the first `voxflow say` /\n');
269
+ out(' `voxflow narrate` call will prompt for login.\n');
270
+ out('\n');
271
+ if (agentName) {
272
+ out(` 👤 USER ACTION (you are running inside ${agentName}):\n`);
273
+ out(' After this command, run `voxflow login` and finish the browser flow.\n');
274
+ out(' Or skip browser entirely: `export VOXFLOW_TOKEN=<jwt>` then re-run.\n');
275
+ } else {
276
+ out(' Run `voxflow login` separately to set up auth ahead of time.\n');
277
+ }
278
+ out('\n');
279
+ return { loggedIn: false };
280
+ }
281
+
282
+ // ─── Subcommand handlers ──────────────────────────────────────────────────
283
+
284
+ async function handleInstall(args) {
285
+ const opts = parseArgs(args);
286
+ const detected = detectAgents();
287
+
288
+ out('\n VoxFlow Skill Installer\n\n');
289
+ printDetection(detected);
290
+
291
+ let targets;
292
+ try {
293
+ targets = chooseTargets(opts, detected);
294
+ } catch (err) {
295
+ out(` Error: ${err.message}\n\n`);
296
+ printList();
297
+ process.exit(1);
298
+ }
299
+
300
+ // Dedupe targets that share the same install command. Since `npx skills add`
301
+ // detects all agents present on the machine and writes to each in one shot,
302
+ // running it once covers everything — no need to repeat per agent.
303
+ const uniqueByCommand = dedupeByInstallCommand(targets);
304
+
305
+ out(' Will install for:\n');
306
+ for (const t of targets) {
307
+ out(` → ${t.name}\n`);
308
+ }
309
+ out(`\n Command: ${uniqueByCommand[0].install[0]} ${uniqueByCommand[0].install[1].join(' ')}\n`);
310
+ if (uniqueByCommand.length === 1) {
311
+ out(' (One command covers all detected agents — `npx skills add` writes\n');
312
+ out(' to each agent\'s standard location automatically.)\n');
313
+ }
314
+ out('\n');
315
+
316
+ // Pre-flight auth check. The install commands themselves don't need a token,
317
+ // but the user's intent is "install + use it"; if they're not logged in,
318
+ // signal that early so the AI agent (or human) can address it before the
319
+ // first actual `voxflow say` fails. Skipped on --dry-run since dry-run is
320
+ // explicitly read-only.
321
+ if (!opts.dryRun) {
322
+ await preflightAuthAdvice();
323
+ }
324
+
325
+ if (!opts.yes && !opts.dryRun && process.stdin.isTTY) {
326
+ const answer = (await ask(' Proceed? [Y/n] ')).toLowerCase();
327
+ if (answer && answer !== 'y' && answer !== 'yes') {
328
+ out(' Cancelled.\n\n');
329
+ return { ok: false, reason: 'user-cancelled' };
330
+ }
331
+ out('\n');
332
+ }
333
+
334
+ const results = [];
335
+ for (const t of uniqueByCommand) {
336
+ out(` Installing...\n`);
337
+ out(` $ ${t.install[0]} ${t.install[1].join(' ')}\n`);
338
+ const r = await runInstall(t, opts);
339
+ results.push({ target: t, result: r });
340
+ if (r.dryRun) out(` (dry-run, nothing executed)\n`);
341
+ else if (r.ok) {
342
+ out(` ✓ Installed: ${SKILL_LIST.join(', ')}\n`);
343
+ out(` → ~/.agents/skills/ (linked into every detected agent's skill dir)\n`);
344
+ }
345
+ else {
346
+ out(` ✗ Failed: ${r.error.message.split('\n')[0]}\n`);
347
+ if (r.error.stderr) {
348
+ const trimmed = r.error.stderr.toString().trim().split('\n').slice(-3).join('\n ');
349
+ if (trimmed) out(` ${trimmed}\n`);
350
+ }
351
+ }
352
+ }
353
+
354
+ const hasFailures = results.some((r) => !r.result.ok && !r.result.dryRun);
355
+ printNextSteps(targets, hasFailures);
356
+ if (hasFailures) process.exit(1);
357
+ return { ok: !hasFailures, results };
358
+ }
359
+
360
+ function handleList() {
361
+ printList();
362
+ return { ok: true };
363
+ }
364
+
365
+ function handleDetect() {
366
+ const detected = detectAgents();
367
+ out('\n');
368
+ printDetection(detected);
369
+ const cmd = `${UNIVERSAL_INSTALL[0]} ${UNIVERSAL_INSTALL[1].join(' ')}`;
370
+ if (detected.length === 0) {
371
+ out(' No AI agents auto-detected. You can still install via the universal\n');
372
+ out(' Skills-protocol installer (it will write to whatever standard agent\n');
373
+ out(' locations exist on this machine):\n\n');
374
+ out(` ${cmd}\n\n`);
375
+ } else {
376
+ out(` Run \`voxflow skills install\` to install for the detected agents,\n`);
377
+ out(` or run the underlying command directly:\n\n ${cmd}\n\n`);
378
+ }
379
+ return { ok: true, detected: detected.map((d) => d.key) };
380
+ }
381
+
382
+ // ─── Top-level dispatch ───────────────────────────────────────────────────
383
+
384
+ const SUBCOMMANDS = ['install', 'list', 'detect'];
385
+
386
+ async function handle(args) {
387
+ const sub = args[0];
388
+ const rest = args.slice(1);
389
+
390
+ if (!sub || sub === '-h' || sub === '--help') {
391
+ printHelp();
392
+ process.exit(sub ? 0 : 1);
393
+ return;
394
+ }
395
+
396
+ if (!SUBCOMMANDS.includes(sub)) {
397
+ out(`Error: unknown subcommand "${sub}". Use one of: ${SUBCOMMANDS.join(' | ')}\n`);
398
+ printHelp();
399
+ process.exit(1);
400
+ return;
401
+ }
402
+
403
+ if (sub === 'install') return handleInstall(rest);
404
+ if (sub === 'list') return handleList();
405
+ if (sub === 'detect') return handleDetect();
406
+ }
407
+
408
+ function printHelp() {
409
+ out(`
410
+ Usage: voxflow skills <subcommand> [options]
411
+
412
+ Subcommands:
413
+ install Install VoxFlow Skills into your AI agent
414
+ list Show all supported agents and their install commands
415
+ detect Show which agents are detected on this machine
416
+
417
+ Options for \`install\`:
418
+ --for <agent> Target a specific agent (claude | cursor | codex | gemini |
419
+ workbuddy | openclaw | generic)
420
+ --all Install for every detected agent
421
+ --dry-run Print commands without executing
422
+ -y, --yes Skip confirmation prompt
423
+
424
+ Examples:
425
+ voxflow skills install # auto-detect best target
426
+ voxflow skills install --for claude # force Claude Code
427
+ voxflow skills install --all # install for every detected agent
428
+ voxflow skills install --dry-run # preview without running
429
+ voxflow skills detect # what's on this machine
430
+ voxflow skills list # all supported agents
431
+
432
+ `);
433
+ }
434
+
435
+ const meta = {
436
+ skills: {
437
+ usage: '<install | list | detect> [options]',
438
+ description: 'Install VoxFlow Skills into your AI agent (Claude Code, Cursor, Codex, Gemini, WorkBuddy, OpenClaw, etc.)',
439
+ options: [
440
+ 'install [--for <agent>] Install skills (auto-detect or force one)',
441
+ 'install --all Install for every detected agent',
442
+ 'install --dry-run Print commands without executing',
443
+ 'install -y Skip confirmation prompt',
444
+ 'list Show every supported agent + command',
445
+ 'detect Show what is auto-detected on this machine',
446
+ ],
447
+ examples: [
448
+ 'voxflow skills install',
449
+ 'voxflow skills install --for claude',
450
+ 'voxflow skills install --all',
451
+ 'voxflow skills detect',
452
+ 'voxflow skills list',
453
+ ],
454
+ },
455
+ };
456
+
457
+ module.exports = {
458
+ // public surface
459
+ handle,
460
+ meta,
461
+ // helpers for tests
462
+ AGENTS,
463
+ AUTO_DETECTABLE,
464
+ SKILL_LIST,
465
+ UNIVERSAL_INSTALL,
466
+ binaryExists,
467
+ detectAgents,
468
+ chooseTargets,
469
+ dedupeByInstallCommand,
470
+ parseArgs,
471
+ runInstall,
472
+ preflightAuthAdvice,
473
+ };