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.
- package/README.md +34 -0
- package/bin/voxflow.js +27 -0
- package/dist/index.js +1 -1
- package/dist/remotion-bundle/02a2fb2eb80bc7bf.woff2 +0 -0
- package/dist/remotion-bundle/052ca5351e5e06ba.woff2 +0 -0
- package/dist/remotion-bundle/05853dd28f4019cb.woff2 +0 -0
- package/dist/remotion-bundle/072ead3737f7c0d0.woff2 +0 -0
- package/dist/remotion-bundle/07d4248613c86a2e.woff2 +0 -0
- package/dist/remotion-bundle/0884a5c2d1d2d99b.woff2 +0 -0
- package/dist/remotion-bundle/0b0e185b2752095e.woff2 +0 -0
- package/dist/remotion-bundle/0e66c11bde067d91.woff2 +0 -0
- package/dist/remotion-bundle/0f7794cfba2c5d21.woff2 +0 -0
- package/dist/remotion-bundle/0fdbae5a4365783a.woff2 +0 -0
- package/dist/remotion-bundle/112.bundle.js +11 -0
- package/dist/remotion-bundle/112.bundle.js.map +1 -0
- package/dist/remotion-bundle/113.bundle.js +11 -0
- package/dist/remotion-bundle/113.bundle.js.map +1 -0
- package/dist/remotion-bundle/119cae0c4c16f7ed.woff2 +0 -0
- package/dist/remotion-bundle/14725f649fd1e78c.woff2 +0 -0
- package/dist/remotion-bundle/14abe9e3f95f7888.woff2 +0 -0
- package/dist/remotion-bundle/163.bundle.js +14678 -0
- package/dist/remotion-bundle/163.bundle.js.map +1 -0
- package/dist/remotion-bundle/1808c54072bf6d14.woff2 +0 -0
- package/dist/remotion-bundle/18948bec3e3012fe.woff2 +0 -0
- package/dist/remotion-bundle/1a661c60d0fc84fc.woff2 +0 -0
- package/dist/remotion-bundle/1af94941e1bc7e1e.woff2 +0 -0
- package/dist/remotion-bundle/1bee0219595f606c.woff2 +0 -0
- package/dist/remotion-bundle/1bfd5da7ce9d4ec4.woff2 +0 -0
- package/dist/remotion-bundle/1c158d56f1884f3f.woff2 +0 -0
- package/dist/remotion-bundle/1cf5e88e667610eb.woff2 +0 -0
- package/dist/remotion-bundle/1d431bd10f53c481.woff2 +0 -0
- package/dist/remotion-bundle/1d701a81a7670db2.woff2 +0 -0
- package/dist/remotion-bundle/1da0fecad4240f16.woff2 +0 -0
- package/dist/remotion-bundle/1ed14d3d0c5c63fe.woff2 +0 -0
- package/dist/remotion-bundle/1edfecf40e586f53.woff2 +0 -0
- package/dist/remotion-bundle/1f479711bc34b054.woff +0 -0
- package/dist/remotion-bundle/1f86e54a0ff5fcd1.woff2 +0 -0
- package/dist/remotion-bundle/2043ea87d9aabd11.woff2 +0 -0
- package/dist/remotion-bundle/20563c39ee8a0e40.woff2 +0 -0
- package/dist/remotion-bundle/20c231590fd12c44.woff2 +0 -0
- package/dist/remotion-bundle/20ce61713f754c07.woff2 +0 -0
- package/dist/remotion-bundle/21eb9306fce24bb1.woff2 +0 -0
- package/dist/remotion-bundle/244bf71c0cc851af.woff2 +0 -0
- package/dist/remotion-bundle/274d4cfc02bffbcb.woff2 +0 -0
- package/dist/remotion-bundle/275.bundle.js +21 -0
- package/dist/remotion-bundle/275.bundle.js.map +1 -0
- package/dist/remotion-bundle/2958f540b39513dc.woff2 +0 -0
- package/dist/remotion-bundle/2a168b98fd97722e.woff2 +0 -0
- package/dist/remotion-bundle/2d1f6373937ab55f.woff2 +0 -0
- package/dist/remotion-bundle/2d213ae47ff6daa9.woff2 +0 -0
- package/dist/remotion-bundle/2e4b1f04fcd05047.woff2 +0 -0
- package/dist/remotion-bundle/304170d98f4c4563.woff2 +0 -0
- package/dist/remotion-bundle/30d02e136e7a5642.woff2 +0 -0
- package/dist/remotion-bundle/3135562b52a714cd.woff2 +0 -0
- package/dist/remotion-bundle/313713af2c8144e9.woff2 +0 -0
- package/dist/remotion-bundle/325fa4108d2285b9.woff2 +0 -0
- package/dist/remotion-bundle/338e927ed3345e0c.woff2 +0 -0
- package/dist/remotion-bundle/35fc6b190365bc17.woff2 +0 -0
- package/dist/remotion-bundle/37a51f1122d4efc5.woff2 +0 -0
- package/dist/remotion-bundle/39a4d63e02736f5e.woff2 +0 -0
- package/dist/remotion-bundle/3a00e0d62dfc4171.woff2 +0 -0
- package/dist/remotion-bundle/3a6955e6561affe1.woff2 +0 -0
- package/dist/remotion-bundle/3c573945aef49b89.woff2 +0 -0
- package/dist/remotion-bundle/3cdbfbfa23b516a5.woff2 +0 -0
- package/dist/remotion-bundle/3e42f85a9e64ca8a.woff2 +0 -0
- package/dist/remotion-bundle/3e83eaf1ec859415.woff2 +0 -0
- package/dist/remotion-bundle/3f3c8c90de1250ee.woff2 +0 -0
- package/dist/remotion-bundle/434.bundle.js +205 -0
- package/dist/remotion-bundle/434.bundle.js.map +1 -0
- package/dist/remotion-bundle/44ffc6ca4d781692.woff2 +0 -0
- package/dist/remotion-bundle/4670d9c4580b09eb.woff2 +0 -0
- package/dist/remotion-bundle/479756881b302824.woff2 +0 -0
- package/dist/remotion-bundle/481b82134bfa9c82.woff2 +0 -0
- package/dist/remotion-bundle/48d27029626f4328.woff2 +0 -0
- package/dist/remotion-bundle/49b7b2a30329c511.woff2 +0 -0
- package/dist/remotion-bundle/4c8b25a1a9337045.woff2 +0 -0
- package/dist/remotion-bundle/4cba14788ca9259b.woff2 +0 -0
- package/dist/remotion-bundle/4cd6c589c004a6a7.woff2 +0 -0
- package/dist/remotion-bundle/4cd8d79c1021608d.woff2 +0 -0
- package/dist/remotion-bundle/4d8fa99b3f00f9f0.woff2 +0 -0
- package/dist/remotion-bundle/4e7805a643f86d53.woff2 +0 -0
- package/dist/remotion-bundle/4ff91be454542e3f.woff2 +0 -0
- package/dist/remotion-bundle/504cbcba1f63591b.woff2 +0 -0
- package/dist/remotion-bundle/5202d792e5791d6c.woff2 +0 -0
- package/dist/remotion-bundle/534db5ad4770cc1d.woff2 +0 -0
- package/dist/remotion-bundle/53b9568eb85f866b.woff2 +0 -0
- package/dist/remotion-bundle/543ad386ca171de9.woff2 +0 -0
- package/dist/remotion-bundle/54798e55bbf7976e.woff2 +0 -0
- package/dist/remotion-bundle/580.bundle.js +11 -0
- package/dist/remotion-bundle/580.bundle.js.map +1 -0
- package/dist/remotion-bundle/58d174d1193af6d1.woff2 +0 -0
- package/dist/remotion-bundle/591d29ff3ff53c80.woff2 +0 -0
- package/dist/remotion-bundle/5c28c4f4824383c6.woff2 +0 -0
- package/dist/remotion-bundle/5da9740d2ce894c8.woff2 +0 -0
- package/dist/remotion-bundle/6197735364642360.woff2 +0 -0
- package/dist/remotion-bundle/6265a4335724080f.woff2 +0 -0
- package/dist/remotion-bundle/633f5e4f6394daa7.woff2 +0 -0
- package/dist/remotion-bundle/637d95ace6a69c49.woff2 +0 -0
- package/dist/remotion-bundle/648e04a04dacff8f.woff2 +0 -0
- package/dist/remotion-bundle/64a6e83045a008b2.woff2 +0 -0
- package/dist/remotion-bundle/651.bundle.js +11 -0
- package/dist/remotion-bundle/651.bundle.js.map +1 -0
- package/dist/remotion-bundle/65e2a988c070facc.woff2 +0 -0
- package/dist/remotion-bundle/66a2f6ce5cc69105.woff2 +0 -0
- package/dist/remotion-bundle/690.bundle.js +3479 -0
- package/dist/remotion-bundle/690.bundle.js.map +1 -0
- package/dist/remotion-bundle/690ff55252ca715d.woff2 +0 -0
- package/dist/remotion-bundle/6a01a1cff49314fc.woff2 +0 -0
- package/dist/remotion-bundle/6cbc32670982986c.woff2 +0 -0
- package/dist/remotion-bundle/6d3cc42ae547f454.woff2 +0 -0
- package/dist/remotion-bundle/6d8f4cfa1ddc0830.woff2 +0 -0
- package/dist/remotion-bundle/6e4d7c6ae65e2dc3.woff2 +0 -0
- package/dist/remotion-bundle/6e86418bbcefb2e8.woff2 +0 -0
- package/dist/remotion-bundle/6ee02884b29cf7fb.woff2 +0 -0
- package/dist/remotion-bundle/6f436a74c9e3252c.woff2 +0 -0
- package/dist/remotion-bundle/78c8022f1657618b.woff2 +0 -0
- package/dist/remotion-bundle/7c5444169792bca4.woff2 +0 -0
- package/dist/remotion-bundle/7c86bddd9d997212.woff2 +0 -0
- package/dist/remotion-bundle/7e1284684767f584.woff2 +0 -0
- package/dist/remotion-bundle/7e81c17522d182b2.woff2 +0 -0
- package/dist/remotion-bundle/7eb87be198f7858c.woff2 +0 -0
- package/dist/remotion-bundle/8060c928f948aab5.woff2 +0 -0
- package/dist/remotion-bundle/80bc9dfbea2b35ae.woff2 +0 -0
- package/dist/remotion-bundle/811b83f69963bb48.woff2 +0 -0
- package/dist/remotion-bundle/813.bundle.js +117511 -0
- package/dist/remotion-bundle/813.bundle.js.map +1 -0
- package/dist/remotion-bundle/84df492e349f82e9.woff2 +0 -0
- package/dist/remotion-bundle/8501bfd73eb36f2b.woff2 +0 -0
- package/dist/remotion-bundle/854236a8376093fe.woff2 +0 -0
- package/dist/remotion-bundle/8571d74529082753.woff2 +0 -0
- package/dist/remotion-bundle/860bf44f8e6f4b5d.woff2 +0 -0
- package/dist/remotion-bundle/879.bundle.js +64 -0
- package/dist/remotion-bundle/879.bundle.js.map +1 -0
- package/dist/remotion-bundle/887dd482f848d56f.woff2 +0 -0
- package/dist/remotion-bundle/89b2132e85fbbb5a.woff2 +0 -0
- package/dist/remotion-bundle/8ba60d6c306010c2.woff2 +0 -0
- package/dist/remotion-bundle/8c7c4dadea897806.woff2 +0 -0
- package/dist/remotion-bundle/8c943f9999706f61.woff2 +0 -0
- package/dist/remotion-bundle/8f2a718c90575cc9.woff2 +0 -0
- package/dist/remotion-bundle/906b6edb3e1772c9.woff2 +0 -0
- package/dist/remotion-bundle/930ff9daccdf14eb.woff2 +0 -0
- package/dist/remotion-bundle/934db2f1c403c4d0.woff2 +0 -0
- package/dist/remotion-bundle/938.bundle.js +451 -0
- package/dist/remotion-bundle/938.bundle.js.map +1 -0
- package/dist/remotion-bundle/967.bundle.js +4462 -0
- package/dist/remotion-bundle/967.bundle.js.map +1 -0
- package/dist/remotion-bundle/9684a1093d3c02ce.woff2 +0 -0
- package/dist/remotion-bundle/973dcd0faa6116cc.woff2 +0 -0
- package/dist/remotion-bundle/9745400694e76cd8.woff2 +0 -0
- package/dist/remotion-bundle/999ef957bed3bdca.woff2 +0 -0
- package/dist/remotion-bundle/99a3d67c8b0f43e3.woff2 +0 -0
- package/dist/remotion-bundle/a0586c3e03127283.woff2 +0 -0
- package/dist/remotion-bundle/a0eb654fdae46269.woff2 +0 -0
- package/dist/remotion-bundle/a20e35d3b08f7994.woff2 +0 -0
- package/dist/remotion-bundle/a2dcaced7c8c25ab.woff2 +0 -0
- package/dist/remotion-bundle/a79255a972a2681a.woff2 +0 -0
- package/dist/remotion-bundle/a804b352cb9fec1a.woff2 +0 -0
- package/dist/remotion-bundle/aae7117164e1eabc.woff2 +0 -0
- package/dist/remotion-bundle/affd121385d0442d.woff2 +0 -0
- package/dist/remotion-bundle/b19a6083987ee0d7.woff2 +0 -0
- package/dist/remotion-bundle/b1b2bd04d8637981.woff2 +0 -0
- package/dist/remotion-bundle/b2c07f341486be87.woff2 +0 -0
- package/dist/remotion-bundle/b33d8f82e575c4ce.woff2 +0 -0
- package/dist/remotion-bundle/b366c0bed35ef491.woff2 +0 -0
- package/dist/remotion-bundle/b41e857ec1b85642.woff2 +0 -0
- package/dist/remotion-bundle/b420bb34ccf23e7f.woff2 +0 -0
- package/dist/remotion-bundle/b4f7bf4efb0c0ccf.woff2 +0 -0
- package/dist/remotion-bundle/b60fe5eca03cff93.woff2 +0 -0
- package/dist/remotion-bundle/b6bd31a336e64bce.woff2 +0 -0
- package/dist/remotion-bundle/b6d2befba3dfefeb.woff2 +0 -0
- package/dist/remotion-bundle/b75f39ab06c43bf4.woff2 +0 -0
- package/dist/remotion-bundle/b77880e8c413d4fd.woff2 +0 -0
- package/dist/remotion-bundle/b7e38ec441e4a77a.woff2 +0 -0
- package/dist/remotion-bundle/b83baa383ff0bf2b.woff2 +0 -0
- package/dist/remotion-bundle/b9ad7b6c0a11450a.woff2 +0 -0
- package/dist/remotion-bundle/baf84486e8ae3aaf.woff2 +0 -0
- package/dist/remotion-bundle/bc047b1f6869cffa.woff2 +0 -0
- package/dist/remotion-bundle/bf4f3ac6e93f33aa.woff2 +0 -0
- package/dist/remotion-bundle/bf6835ffec5897a2.woff2 +0 -0
- package/dist/remotion-bundle/bf8885f581eb1724.woff2 +0 -0
- package/dist/remotion-bundle/bundle.js +83376 -0
- package/dist/remotion-bundle/bundle.js.map +1 -0
- package/dist/remotion-bundle/c03f046bccd789d0.woff2 +0 -0
- package/dist/remotion-bundle/c0bb1f8962b73bc3.woff2 +0 -0
- package/dist/remotion-bundle/c1003f9a7db6e1cf.woff2 +0 -0
- package/dist/remotion-bundle/c15d83fb1e199515.woff2 +0 -0
- package/dist/remotion-bundle/c28e7e5d310f73ef.woff2 +0 -0
- package/dist/remotion-bundle/c2b840274db78aea.woff2 +0 -0
- package/dist/remotion-bundle/c3000e3299d4e45f.woff2 +0 -0
- package/dist/remotion-bundle/c83ce886e5288510.woff2 +0 -0
- package/dist/remotion-bundle/c87a5a64d4ac0918.woff2 +0 -0
- package/dist/remotion-bundle/c8a7e0d049e965fa.woff2 +0 -0
- package/dist/remotion-bundle/c949a35d3a3b1faf.woff2 +0 -0
- package/dist/remotion-bundle/c9618c9b9ac2bc78.woff2 +0 -0
- package/dist/remotion-bundle/ca3add3b84152d5b.woff2 +0 -0
- package/dist/remotion-bundle/cad9dd036408d707.woff2 +0 -0
- package/dist/remotion-bundle/cbb24916619df439.woff2 +0 -0
- package/dist/remotion-bundle/cc054f0b5514e177.woff2 +0 -0
- package/dist/remotion-bundle/ccc248ed9312bc71.woff2 +0 -0
- package/dist/remotion-bundle/cd9d623aa07af925.woff2 +0 -0
- package/dist/remotion-bundle/ce2ba7a321bd1247.woff2 +0 -0
- package/dist/remotion-bundle/cf72455f79a29b14.woff2 +0 -0
- package/dist/remotion-bundle/d267cbfefab452ac.woff2 +0 -0
- package/dist/remotion-bundle/d435cff46a64955f.woff +0 -0
- package/dist/remotion-bundle/d494d07f67e363f6.woff2 +0 -0
- package/dist/remotion-bundle/d7aa0cc1fa47bf38.woff2 +0 -0
- package/dist/remotion-bundle/d7c5ca93d885160a.woff2 +0 -0
- package/dist/remotion-bundle/d855d3e252db74e2.woff2 +0 -0
- package/dist/remotion-bundle/d8f13d47f02f82c2.woff2 +0 -0
- package/dist/remotion-bundle/d9567cce2ee11019.woff2 +0 -0
- package/dist/remotion-bundle/db8d4456fc75dd86.woff +0 -0
- package/dist/remotion-bundle/dc274628378c47ee.woff2 +0 -0
- package/dist/remotion-bundle/dc3e06947bb69903.woff2 +0 -0
- package/dist/remotion-bundle/dd67040ac3b6d523.woff2 +0 -0
- package/dist/remotion-bundle/e0b04bd488f953f4.woff2 +0 -0
- package/dist/remotion-bundle/e2a572ff95089370.woff2 +0 -0
- package/dist/remotion-bundle/e2e18a86b1c2b0cc.woff2 +0 -0
- package/dist/remotion-bundle/e3a78ee2fc9c6931.woff2 +0 -0
- package/dist/remotion-bundle/e654c9d547605a9f.woff2 +0 -0
- package/dist/remotion-bundle/e67a3a64c129927c.woff2 +0 -0
- package/dist/remotion-bundle/e6be28b4203cd6ce.woff2 +0 -0
- package/dist/remotion-bundle/e841907ad9b0a191.woff +0 -0
- package/dist/remotion-bundle/e889d1541c69fffa.woff2 +0 -0
- package/dist/remotion-bundle/e88ef8c76373a9e2.woff2 +0 -0
- package/dist/remotion-bundle/e9c72f4bc37defef.woff2 +0 -0
- package/dist/remotion-bundle/e9e35f863403a255.woff2 +0 -0
- package/dist/remotion-bundle/eb23b37b009375da.woff2 +0 -0
- package/dist/remotion-bundle/ee1342b741625721.woff2 +0 -0
- package/dist/remotion-bundle/f07da88543a57ec9.woff2 +0 -0
- package/dist/remotion-bundle/f522982115306f8a.woff2 +0 -0
- package/dist/remotion-bundle/f8449bd864e6d8bc.woff2 +0 -0
- package/dist/remotion-bundle/f906dd5bd95ff9ab.woff2 +0 -0
- package/dist/remotion-bundle/f9e9e9413e3c38bb.woff2 +0 -0
- package/dist/remotion-bundle/fa5a5b16280994a8.woff2 +0 -0
- package/dist/remotion-bundle/favicon.ico +0 -0
- package/dist/remotion-bundle/fb19c0517725599b.woff2 +0 -0
- package/dist/remotion-bundle/fcaf24232f684b9b.woff2 +0 -0
- package/dist/remotion-bundle/fe09e084a3eea8cf.woff2 +0 -0
- package/dist/remotion-bundle/ff38d5317df7345a.woff2 +0 -0
- package/dist/remotion-bundle/ffe7ea1ea08f455a.woff2 +0 -0
- package/dist/remotion-bundle/index.html +49 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaomei/communication/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoxin/career/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/female-kefu-xiaoyue/parenting/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/male-kefu-xiaoxu/time-trap/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/cognition/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/growth/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/parenting/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-A6b7WpG3/soothing/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-female-R2s4N9qJ/cognition/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-Bk7vD3xP/decision/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-W1tH9jVc/manager/4.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide/v-male-s5NqE0rZ/founder/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/career-advice/4.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/founder-lesson/4.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/incident-review/4.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/learning-loop/4.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/meeting-closure/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/product-update/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/product-update/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/product-update/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/product-update/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/research-reading/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/0.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/1.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/2.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/3.mp3 +0 -0
- package/dist/remotion-bundle/public/paper-slide-experiments/sales-enablement/4.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-0.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-1.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-2.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-3.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-4.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/ai-life/card-5.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-0.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-1.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-2.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-3.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-4.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-5.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/coffee-science/card-6.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-0.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-1.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-2.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-3.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-4.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-5.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/reading-secrets/card-6.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-0.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-1.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-2.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-3.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-4.mp3 +0 -0
- package/dist/remotion-bundle/public/voiceover/remote-work/card-5.mp3 +0 -0
- package/dist/remotion-bundle/source-map-helper.wasm +0 -0
- package/lib/cli.js +270 -0
- package/lib/commands/_registry.js +48 -0
- package/lib/commands/add.js +242 -0
- package/lib/commands/asr/azure-transcribe.js +336 -0
- package/lib/commands/asr/cloud-transcribe.js +384 -0
- package/lib/commands/asr/helpers.js +76 -0
- package/lib/commands/asr/index.js +236 -0
- package/lib/commands/asr/local-transcribe.js +125 -0
- package/lib/commands/asr-jobs.js +257 -0
- package/lib/commands/asr.js +11 -0
- package/lib/commands/auth-cmds.js +358 -0
- package/lib/commands/dub.js +542 -0
- package/lib/commands/explain.js +512 -0
- package/lib/commands/feedback.js +152 -0
- package/lib/commands/image.js +207 -0
- package/lib/commands/mcp-key.js +166 -0
- package/lib/commands/narrate.js +639 -0
- package/lib/commands/picstory-templates.js +276 -0
- package/lib/commands/picstory.js +547 -0
- package/lib/commands/podcast/dialogue.js +109 -0
- package/lib/commands/podcast/generate.js +127 -0
- package/lib/commands/podcast/index.js +561 -0
- package/lib/commands/podcast/synthesize.js +188 -0
- package/lib/commands/podcast.js +11 -0
- package/lib/commands/present.js +519 -0
- package/lib/commands/publish.js +415 -0
- package/lib/commands/skills.js +473 -0
- package/lib/commands/slice-render.js +282 -0
- package/lib/commands/slice-stage.js +264 -0
- package/lib/commands/slice.js +346 -0
- package/lib/commands/slides/constants.js +108 -0
- package/lib/commands/slides/html-renderer.js +338 -0
- package/lib/commands/slides/index.js +345 -0
- package/lib/commands/slides.js +11 -0
- package/lib/commands/story.js +302 -0
- package/lib/commands/summarize.js +532 -0
- package/lib/commands/synthesize.js +261 -0
- package/lib/commands/translate.js +593 -0
- package/lib/commands/upgrade.js +249 -0
- package/lib/commands/video-translate.js +577 -0
- package/lib/commands/voices.js +292 -0
- package/lib/core/agent-env.js +104 -0
- package/lib/core/args.js +107 -0
- package/lib/core/asr-client.js +448 -0
- package/lib/core/asr-jobs-client.js +126 -0
- package/lib/core/asr-jobs-store.js +105 -0
- package/lib/core/asr-r2-upload.js +181 -0
- package/lib/core/asr-upload.js +132 -0
- package/lib/core/audio-extract.js +150 -0
- package/lib/core/audio.js +219 -0
- package/lib/core/auth.js +880 -0
- package/lib/core/config.js +197 -0
- package/lib/core/feedback.js +64 -0
- package/lib/core/ffmpeg.js +476 -0
- package/lib/core/http.js +188 -0
- package/lib/core/image-client.js +55 -0
- package/lib/core/intent-params.js +11 -0
- package/lib/core/llm-client.js +76 -0
- package/lib/core/logger.js +208 -0
- package/lib/core/mic-recorder.js +182 -0
- package/lib/core/pause-markers.js +94 -0
- package/lib/core/podcast-pacing.js +118 -0
- package/lib/core/spinner.js +33 -0
- package/lib/core/srt.js +394 -0
- package/lib/core/telemetry.js +100 -0
- package/lib/core/timeline.js +92 -0
- package/lib/core/tts-synthesizer.js +70 -0
- package/lib/core/update-check.js +185 -0
- package/lib/core/url-download.js +148 -0
- package/lib/core/whisper-local.js +279 -0
- package/lib/internal/deck-validator.js +488 -0
- package/lib/internal/slice-themes.json +370 -0
- package/lib/stage-core/cloud-render.js +170 -0
- package/lib/stage-core/deck-format.js +133 -0
- package/lib/stage-core/edit-prompt.js +104 -0
- package/lib/stage-core/event-bus.js +31 -0
- package/lib/stage-core/port.js +46 -0
- package/lib/stage-core/server.js +352 -0
- package/lib/stage-core/snapshot-store.js +198 -0
- package/lib/stage-core/watcher.js +106 -0
- package/lib/stage-ui/slice/template.js +1672 -0
- package/package.json +9 -4
- package/skills/.claude-plugin/marketplace.json +22 -0
- package/skills/.claude-plugin/plugin.json +25 -0
- package/skills/LICENSE +21 -0
- package/skills/README.md +120 -0
- package/skills/hub/SKILL.md +317 -0
- package/skills/podcast/SKILL.md +146 -0
- package/skills/slice/SKILL.md +205 -0
- package/skills/slice/agents/openai.yaml +4 -0
- package/skills/slice/references/deck-schema.md +183 -0
- package/skills/slice/references/example-decks.md +108 -0
- package/skills/slice/references/themes.md +172 -0
- package/skills/transcribe/SKILL.md +473 -0
- package/skills/video/SKILL.md +261 -0
- package/skills/voxflow-slice/SKILL.md +271 -0
- package/skills/voxflow-slice/examples/article.md +13 -0
- package/skills/voxflow-slice/examples/expected-deck.json +39 -0
- 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
|
+
};
|