@vibeframe/cli 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +21 -0
  3. package/.turbo/turbo-test.log +689 -0
  4. package/dist/agent/adapters/claude.d.ts +15 -0
  5. package/dist/agent/adapters/claude.d.ts.map +1 -0
  6. package/dist/agent/adapters/claude.js +119 -0
  7. package/dist/agent/adapters/claude.js.map +1 -0
  8. package/dist/agent/adapters/gemini.d.ts +15 -0
  9. package/dist/agent/adapters/gemini.d.ts.map +1 -0
  10. package/dist/agent/adapters/gemini.js +132 -0
  11. package/dist/agent/adapters/gemini.js.map +1 -0
  12. package/dist/agent/adapters/index.d.ts +27 -0
  13. package/dist/agent/adapters/index.d.ts.map +1 -0
  14. package/dist/agent/adapters/index.js +38 -0
  15. package/dist/agent/adapters/index.js.map +1 -0
  16. package/dist/agent/adapters/ollama.d.ts +20 -0
  17. package/dist/agent/adapters/ollama.d.ts.map +1 -0
  18. package/dist/agent/adapters/ollama.js +186 -0
  19. package/dist/agent/adapters/ollama.js.map +1 -0
  20. package/dist/agent/adapters/openai.d.ts +15 -0
  21. package/dist/agent/adapters/openai.d.ts.map +1 -0
  22. package/dist/agent/adapters/openai.js +92 -0
  23. package/dist/agent/adapters/openai.js.map +1 -0
  24. package/dist/agent/adapters/xai.d.ts +15 -0
  25. package/dist/agent/adapters/xai.d.ts.map +1 -0
  26. package/dist/agent/adapters/xai.js +95 -0
  27. package/dist/agent/adapters/xai.js.map +1 -0
  28. package/dist/agent/index.d.ts +69 -0
  29. package/dist/agent/index.d.ts.map +1 -0
  30. package/dist/agent/index.js +180 -0
  31. package/dist/agent/index.js.map +1 -0
  32. package/dist/agent/memory/index.d.ts +70 -0
  33. package/dist/agent/memory/index.d.ts.map +1 -0
  34. package/dist/agent/memory/index.js +132 -0
  35. package/dist/agent/memory/index.js.map +1 -0
  36. package/dist/agent/prompts/system.d.ts +6 -0
  37. package/dist/agent/prompts/system.d.ts.map +1 -0
  38. package/dist/agent/prompts/system.js +103 -0
  39. package/dist/agent/prompts/system.js.map +1 -0
  40. package/dist/agent/tools/ai-editing.d.ts +15 -0
  41. package/dist/agent/tools/ai-editing.d.ts.map +1 -0
  42. package/dist/agent/tools/ai-editing.js +763 -0
  43. package/dist/agent/tools/ai-editing.js.map +1 -0
  44. package/dist/agent/tools/ai-generation.d.ts +13 -0
  45. package/dist/agent/tools/ai-generation.d.ts.map +1 -0
  46. package/dist/agent/tools/ai-generation.js +973 -0
  47. package/dist/agent/tools/ai-generation.js.map +1 -0
  48. package/dist/agent/tools/ai-pipeline.d.ts +14 -0
  49. package/dist/agent/tools/ai-pipeline.d.ts.map +1 -0
  50. package/dist/agent/tools/ai-pipeline.js +961 -0
  51. package/dist/agent/tools/ai-pipeline.js.map +1 -0
  52. package/dist/agent/tools/ai.d.ts +13 -0
  53. package/dist/agent/tools/ai.d.ts.map +1 -0
  54. package/dist/agent/tools/ai.js +19 -0
  55. package/dist/agent/tools/ai.js.map +1 -0
  56. package/dist/agent/tools/batch.d.ts +6 -0
  57. package/dist/agent/tools/batch.d.ts.map +1 -0
  58. package/dist/agent/tools/batch.js +383 -0
  59. package/dist/agent/tools/batch.js.map +1 -0
  60. package/dist/agent/tools/e2e.test.d.ts +26 -0
  61. package/dist/agent/tools/e2e.test.d.ts.map +1 -0
  62. package/dist/agent/tools/e2e.test.js +397 -0
  63. package/dist/agent/tools/e2e.test.js.map +1 -0
  64. package/dist/agent/tools/export.d.ts +6 -0
  65. package/dist/agent/tools/export.d.ts.map +1 -0
  66. package/dist/agent/tools/export.js +171 -0
  67. package/dist/agent/tools/export.js.map +1 -0
  68. package/dist/agent/tools/filesystem.d.ts +6 -0
  69. package/dist/agent/tools/filesystem.d.ts.map +1 -0
  70. package/dist/agent/tools/filesystem.js +212 -0
  71. package/dist/agent/tools/filesystem.js.map +1 -0
  72. package/dist/agent/tools/index.d.ts +65 -0
  73. package/dist/agent/tools/index.d.ts.map +1 -0
  74. package/dist/agent/tools/index.js +120 -0
  75. package/dist/agent/tools/index.js.map +1 -0
  76. package/dist/agent/tools/integration.test.d.ts +11 -0
  77. package/dist/agent/tools/integration.test.d.ts.map +1 -0
  78. package/dist/agent/tools/integration.test.js +659 -0
  79. package/dist/agent/tools/integration.test.js.map +1 -0
  80. package/dist/agent/tools/media.d.ts +6 -0
  81. package/dist/agent/tools/media.d.ts.map +1 -0
  82. package/dist/agent/tools/media.js +616 -0
  83. package/dist/agent/tools/media.js.map +1 -0
  84. package/dist/agent/tools/project.d.ts +6 -0
  85. package/dist/agent/tools/project.d.ts.map +1 -0
  86. package/dist/agent/tools/project.js +284 -0
  87. package/dist/agent/tools/project.js.map +1 -0
  88. package/dist/agent/tools/timeline.d.ts +6 -0
  89. package/dist/agent/tools/timeline.d.ts.map +1 -0
  90. package/dist/agent/tools/timeline.js +873 -0
  91. package/dist/agent/tools/timeline.js.map +1 -0
  92. package/dist/agent/types.d.ts +59 -0
  93. package/dist/agent/types.d.ts.map +1 -0
  94. package/dist/agent/types.js +5 -0
  95. package/dist/agent/types.js.map +1 -0
  96. package/dist/commands/agent.d.ts +21 -0
  97. package/dist/commands/agent.d.ts.map +1 -0
  98. package/dist/commands/agent.js +290 -0
  99. package/dist/commands/agent.js.map +1 -0
  100. package/dist/commands/ai-analyze.d.ts +106 -0
  101. package/dist/commands/ai-analyze.d.ts.map +1 -0
  102. package/dist/commands/ai-analyze.js +327 -0
  103. package/dist/commands/ai-analyze.js.map +1 -0
  104. package/dist/commands/ai-animated-caption.d.ts +64 -0
  105. package/dist/commands/ai-animated-caption.d.ts.map +1 -0
  106. package/dist/commands/ai-animated-caption.js +272 -0
  107. package/dist/commands/ai-animated-caption.js.map +1 -0
  108. package/dist/commands/ai-audio.d.ts +20 -0
  109. package/dist/commands/ai-audio.d.ts.map +1 -0
  110. package/dist/commands/ai-audio.js +808 -0
  111. package/dist/commands/ai-audio.js.map +1 -0
  112. package/dist/commands/ai-broll.d.ts +15 -0
  113. package/dist/commands/ai-broll.d.ts.map +1 -0
  114. package/dist/commands/ai-broll.js +406 -0
  115. package/dist/commands/ai-broll.js.map +1 -0
  116. package/dist/commands/ai-edit-cli.d.ts +14 -0
  117. package/dist/commands/ai-edit-cli.d.ts.map +1 -0
  118. package/dist/commands/ai-edit-cli.js +579 -0
  119. package/dist/commands/ai-edit-cli.js.map +1 -0
  120. package/dist/commands/ai-edit.d.ts +398 -0
  121. package/dist/commands/ai-edit.d.ts.map +1 -0
  122. package/dist/commands/ai-edit.js +1019 -0
  123. package/dist/commands/ai-edit.js.map +1 -0
  124. package/dist/commands/ai-fill-gaps.d.ts +14 -0
  125. package/dist/commands/ai-fill-gaps.d.ts.map +1 -0
  126. package/dist/commands/ai-fill-gaps.js +451 -0
  127. package/dist/commands/ai-fill-gaps.js.map +1 -0
  128. package/dist/commands/ai-helpers.d.ts +20 -0
  129. package/dist/commands/ai-helpers.d.ts.map +1 -0
  130. package/dist/commands/ai-helpers.js +59 -0
  131. package/dist/commands/ai-helpers.js.map +1 -0
  132. package/dist/commands/ai-highlights.d.ts +127 -0
  133. package/dist/commands/ai-highlights.d.ts.map +1 -0
  134. package/dist/commands/ai-highlights.js +1026 -0
  135. package/dist/commands/ai-highlights.js.map +1 -0
  136. package/dist/commands/ai-image.d.ts +34 -0
  137. package/dist/commands/ai-image.d.ts.map +1 -0
  138. package/dist/commands/ai-image.js +653 -0
  139. package/dist/commands/ai-image.js.map +1 -0
  140. package/dist/commands/ai-motion.d.ts +50 -0
  141. package/dist/commands/ai-motion.d.ts.map +1 -0
  142. package/dist/commands/ai-motion.js +271 -0
  143. package/dist/commands/ai-motion.js.map +1 -0
  144. package/dist/commands/ai-narrate.d.ts +66 -0
  145. package/dist/commands/ai-narrate.d.ts.map +1 -0
  146. package/dist/commands/ai-narrate.js +329 -0
  147. package/dist/commands/ai-narrate.js.map +1 -0
  148. package/dist/commands/ai-review.d.ts +57 -0
  149. package/dist/commands/ai-review.d.ts.map +1 -0
  150. package/dist/commands/ai-review.js +251 -0
  151. package/dist/commands/ai-review.js.map +1 -0
  152. package/dist/commands/ai-script-pipeline-cli.d.ts +9 -0
  153. package/dist/commands/ai-script-pipeline-cli.d.ts.map +1 -0
  154. package/dist/commands/ai-script-pipeline-cli.js +1494 -0
  155. package/dist/commands/ai-script-pipeline-cli.js.map +1 -0
  156. package/dist/commands/ai-script-pipeline.d.ts +259 -0
  157. package/dist/commands/ai-script-pipeline.d.ts.map +1 -0
  158. package/dist/commands/ai-script-pipeline.js +1027 -0
  159. package/dist/commands/ai-script-pipeline.js.map +1 -0
  160. package/dist/commands/ai-suggest-edit.d.ts +14 -0
  161. package/dist/commands/ai-suggest-edit.d.ts.map +1 -0
  162. package/dist/commands/ai-suggest-edit.js +220 -0
  163. package/dist/commands/ai-suggest-edit.js.map +1 -0
  164. package/dist/commands/ai-video-fx.d.ts +14 -0
  165. package/dist/commands/ai-video-fx.d.ts.map +1 -0
  166. package/dist/commands/ai-video-fx.js +395 -0
  167. package/dist/commands/ai-video-fx.js.map +1 -0
  168. package/dist/commands/ai-video.d.ts +15 -0
  169. package/dist/commands/ai-video.d.ts.map +1 -0
  170. package/dist/commands/ai-video.js +785 -0
  171. package/dist/commands/ai-video.js.map +1 -0
  172. package/dist/commands/ai-viral.d.ts +15 -0
  173. package/dist/commands/ai-viral.d.ts.map +1 -0
  174. package/dist/commands/ai-viral.js +519 -0
  175. package/dist/commands/ai-viral.js.map +1 -0
  176. package/dist/commands/ai-visual-fx.d.ts +14 -0
  177. package/dist/commands/ai-visual-fx.d.ts.map +1 -0
  178. package/dist/commands/ai-visual-fx.js +505 -0
  179. package/dist/commands/ai-visual-fx.js.map +1 -0
  180. package/dist/commands/ai.d.ts +38 -0
  181. package/dist/commands/ai.d.ts.map +1 -0
  182. package/dist/commands/ai.js +225 -0
  183. package/dist/commands/ai.js.map +1 -0
  184. package/dist/commands/ai.test.d.ts +2 -0
  185. package/dist/commands/ai.test.d.ts.map +1 -0
  186. package/dist/commands/ai.test.js +554 -0
  187. package/dist/commands/ai.test.js.map +1 -0
  188. package/dist/commands/analyze.d.ts +16 -0
  189. package/dist/commands/analyze.d.ts.map +1 -0
  190. package/dist/commands/analyze.js +247 -0
  191. package/dist/commands/analyze.js.map +1 -0
  192. package/dist/commands/audio.d.ts +18 -0
  193. package/dist/commands/audio.d.ts.map +1 -0
  194. package/dist/commands/audio.js +539 -0
  195. package/dist/commands/audio.js.map +1 -0
  196. package/dist/commands/batch.d.ts +3 -0
  197. package/dist/commands/batch.d.ts.map +1 -0
  198. package/dist/commands/batch.js +366 -0
  199. package/dist/commands/batch.js.map +1 -0
  200. package/dist/commands/batch.test.d.ts +2 -0
  201. package/dist/commands/batch.test.d.ts.map +1 -0
  202. package/dist/commands/batch.test.js +203 -0
  203. package/dist/commands/batch.test.js.map +1 -0
  204. package/dist/commands/detect.d.ts +3 -0
  205. package/dist/commands/detect.d.ts.map +1 -0
  206. package/dist/commands/detect.js +273 -0
  207. package/dist/commands/detect.js.map +1 -0
  208. package/dist/commands/doctor.d.ts +6 -0
  209. package/dist/commands/doctor.d.ts.map +1 -0
  210. package/dist/commands/doctor.js +191 -0
  211. package/dist/commands/doctor.js.map +1 -0
  212. package/dist/commands/edit-cmd.d.ts +26 -0
  213. package/dist/commands/edit-cmd.d.ts.map +1 -0
  214. package/dist/commands/edit-cmd.js +870 -0
  215. package/dist/commands/edit-cmd.js.map +1 -0
  216. package/dist/commands/export.d.ts +39 -0
  217. package/dist/commands/export.d.ts.map +1 -0
  218. package/dist/commands/export.js +730 -0
  219. package/dist/commands/export.js.map +1 -0
  220. package/dist/commands/generate.d.ts +25 -0
  221. package/dist/commands/generate.d.ts.map +1 -0
  222. package/dist/commands/generate.js +1885 -0
  223. package/dist/commands/generate.js.map +1 -0
  224. package/dist/commands/media.d.ts +3 -0
  225. package/dist/commands/media.d.ts.map +1 -0
  226. package/dist/commands/media.js +165 -0
  227. package/dist/commands/media.js.map +1 -0
  228. package/dist/commands/output.d.ts +45 -0
  229. package/dist/commands/output.d.ts.map +1 -0
  230. package/dist/commands/output.js +122 -0
  231. package/dist/commands/output.js.map +1 -0
  232. package/dist/commands/pipeline.d.ts +19 -0
  233. package/dist/commands/pipeline.d.ts.map +1 -0
  234. package/dist/commands/pipeline.js +345 -0
  235. package/dist/commands/pipeline.js.map +1 -0
  236. package/dist/commands/project.d.ts +3 -0
  237. package/dist/commands/project.d.ts.map +1 -0
  238. package/dist/commands/project.js +139 -0
  239. package/dist/commands/project.js.map +1 -0
  240. package/dist/commands/project.test.d.ts +2 -0
  241. package/dist/commands/project.test.d.ts.map +1 -0
  242. package/dist/commands/project.test.js +105 -0
  243. package/dist/commands/project.test.js.map +1 -0
  244. package/dist/commands/sanitize.d.ts +21 -0
  245. package/dist/commands/sanitize.d.ts.map +1 -0
  246. package/dist/commands/sanitize.js +56 -0
  247. package/dist/commands/sanitize.js.map +1 -0
  248. package/dist/commands/schema.d.ts +11 -0
  249. package/dist/commands/schema.d.ts.map +1 -0
  250. package/dist/commands/schema.js +101 -0
  251. package/dist/commands/schema.js.map +1 -0
  252. package/dist/commands/setup.d.ts +6 -0
  253. package/dist/commands/setup.d.ts.map +1 -0
  254. package/dist/commands/setup.js +440 -0
  255. package/dist/commands/setup.js.map +1 -0
  256. package/dist/commands/timeline.d.ts +3 -0
  257. package/dist/commands/timeline.d.ts.map +1 -0
  258. package/dist/commands/timeline.js +469 -0
  259. package/dist/commands/timeline.js.map +1 -0
  260. package/dist/commands/timeline.test.d.ts +2 -0
  261. package/dist/commands/timeline.test.d.ts.map +1 -0
  262. package/dist/commands/timeline.test.js +320 -0
  263. package/dist/commands/timeline.test.js.map +1 -0
  264. package/dist/commands/validate.d.ts +32 -0
  265. package/dist/commands/validate.d.ts.map +1 -0
  266. package/dist/commands/validate.js +63 -0
  267. package/dist/commands/validate.js.map +1 -0
  268. package/dist/config/config.test.d.ts +2 -0
  269. package/dist/config/config.test.d.ts.map +1 -0
  270. package/dist/config/config.test.js +164 -0
  271. package/dist/config/config.test.js.map +1 -0
  272. package/dist/config/index.d.ts +35 -0
  273. package/dist/config/index.d.ts.map +1 -0
  274. package/dist/config/index.js +101 -0
  275. package/dist/config/index.js.map +1 -0
  276. package/dist/config/schema.d.ts +43 -0
  277. package/dist/config/schema.d.ts.map +1 -0
  278. package/dist/config/schema.js +42 -0
  279. package/dist/config/schema.js.map +1 -0
  280. package/dist/engine/index.d.ts +3 -0
  281. package/dist/engine/index.d.ts.map +1 -0
  282. package/dist/engine/index.js +2 -0
  283. package/dist/engine/index.js.map +1 -0
  284. package/dist/engine/project.d.ts +84 -0
  285. package/dist/engine/project.d.ts.map +1 -0
  286. package/dist/engine/project.js +355 -0
  287. package/dist/engine/project.js.map +1 -0
  288. package/dist/engine/project.test.d.ts +2 -0
  289. package/dist/engine/project.test.d.ts.map +1 -0
  290. package/dist/engine/project.test.js +599 -0
  291. package/dist/engine/project.test.js.map +1 -0
  292. package/dist/index.d.ts +7 -0
  293. package/dist/index.d.ts.map +1 -0
  294. package/dist/index.js +131 -0
  295. package/dist/index.js.map +1 -0
  296. package/dist/utils/api-key.d.ts +36 -0
  297. package/dist/utils/api-key.d.ts.map +1 -0
  298. package/dist/utils/api-key.js +211 -0
  299. package/dist/utils/api-key.js.map +1 -0
  300. package/dist/utils/api-key.test.d.ts +2 -0
  301. package/dist/utils/api-key.test.d.ts.map +1 -0
  302. package/dist/utils/api-key.test.js +35 -0
  303. package/dist/utils/api-key.test.js.map +1 -0
  304. package/dist/utils/audio.d.ts +23 -0
  305. package/dist/utils/audio.d.ts.map +1 -0
  306. package/dist/utils/audio.js +79 -0
  307. package/dist/utils/audio.js.map +1 -0
  308. package/dist/utils/exec-safe.d.ts +22 -0
  309. package/dist/utils/exec-safe.d.ts.map +1 -0
  310. package/dist/utils/exec-safe.js +62 -0
  311. package/dist/utils/exec-safe.js.map +1 -0
  312. package/dist/utils/first-run.d.ts +13 -0
  313. package/dist/utils/first-run.d.ts.map +1 -0
  314. package/dist/utils/first-run.js +48 -0
  315. package/dist/utils/first-run.js.map +1 -0
  316. package/dist/utils/provider-resolver.d.ts +15 -0
  317. package/dist/utils/provider-resolver.d.ts.map +1 -0
  318. package/dist/utils/provider-resolver.js +42 -0
  319. package/dist/utils/provider-resolver.js.map +1 -0
  320. package/dist/utils/remotion.d.ts +210 -0
  321. package/dist/utils/remotion.d.ts.map +1 -0
  322. package/dist/utils/remotion.js +731 -0
  323. package/dist/utils/remotion.js.map +1 -0
  324. package/dist/utils/subtitle.d.ts +65 -0
  325. package/dist/utils/subtitle.d.ts.map +1 -0
  326. package/dist/utils/subtitle.js +135 -0
  327. package/dist/utils/subtitle.js.map +1 -0
  328. package/dist/utils/subtitle.test.d.ts +2 -0
  329. package/dist/utils/subtitle.test.d.ts.map +1 -0
  330. package/dist/utils/subtitle.test.js +175 -0
  331. package/dist/utils/subtitle.test.js.map +1 -0
  332. package/dist/utils/tty.d.ts +45 -0
  333. package/dist/utils/tty.d.ts.map +1 -0
  334. package/dist/utils/tty.js +172 -0
  335. package/dist/utils/tty.js.map +1 -0
  336. package/package.json +102 -0
  337. package/src/agent/adapters/claude.ts +143 -0
  338. package/src/agent/adapters/gemini.ts +159 -0
  339. package/src/agent/adapters/index.ts +61 -0
  340. package/src/agent/adapters/ollama.ts +231 -0
  341. package/src/agent/adapters/openai.ts +116 -0
  342. package/src/agent/adapters/xai.ts +119 -0
  343. package/src/agent/index.ts +251 -0
  344. package/src/agent/memory/index.ts +151 -0
  345. package/src/agent/prompts/system.ts +106 -0
  346. package/src/agent/tools/ai-editing.ts +845 -0
  347. package/src/agent/tools/ai-generation.ts +1073 -0
  348. package/src/agent/tools/ai-pipeline.ts +1055 -0
  349. package/src/agent/tools/ai.ts +21 -0
  350. package/src/agent/tools/batch.ts +429 -0
  351. package/src/agent/tools/e2e.test.ts +545 -0
  352. package/src/agent/tools/export.ts +184 -0
  353. package/src/agent/tools/filesystem.ts +237 -0
  354. package/src/agent/tools/index.ts +150 -0
  355. package/src/agent/tools/integration.test.ts +775 -0
  356. package/src/agent/tools/media.ts +697 -0
  357. package/src/agent/tools/project.ts +313 -0
  358. package/src/agent/tools/timeline.ts +951 -0
  359. package/src/agent/types.ts +68 -0
  360. package/src/commands/agent.ts +340 -0
  361. package/src/commands/ai-analyze.ts +429 -0
  362. package/src/commands/ai-animated-caption.ts +390 -0
  363. package/src/commands/ai-audio.ts +941 -0
  364. package/src/commands/ai-broll.ts +490 -0
  365. package/src/commands/ai-edit-cli.ts +658 -0
  366. package/src/commands/ai-edit.ts +1542 -0
  367. package/src/commands/ai-fill-gaps.ts +566 -0
  368. package/src/commands/ai-helpers.ts +65 -0
  369. package/src/commands/ai-highlights.ts +1303 -0
  370. package/src/commands/ai-image.ts +761 -0
  371. package/src/commands/ai-motion.ts +347 -0
  372. package/src/commands/ai-narrate.ts +451 -0
  373. package/src/commands/ai-review.ts +309 -0
  374. package/src/commands/ai-script-pipeline-cli.ts +1710 -0
  375. package/src/commands/ai-script-pipeline.ts +1365 -0
  376. package/src/commands/ai-suggest-edit.ts +264 -0
  377. package/src/commands/ai-video-fx.ts +445 -0
  378. package/src/commands/ai-video.ts +915 -0
  379. package/src/commands/ai-viral.ts +595 -0
  380. package/src/commands/ai-visual-fx.ts +601 -0
  381. package/src/commands/ai.test.ts +627 -0
  382. package/src/commands/ai.ts +307 -0
  383. package/src/commands/analyze.ts +282 -0
  384. package/src/commands/audio.ts +644 -0
  385. package/src/commands/batch.test.ts +279 -0
  386. package/src/commands/batch.ts +440 -0
  387. package/src/commands/detect.ts +329 -0
  388. package/src/commands/doctor.ts +237 -0
  389. package/src/commands/edit-cmd.ts +1014 -0
  390. package/src/commands/export.ts +918 -0
  391. package/src/commands/generate.ts +2146 -0
  392. package/src/commands/media.ts +177 -0
  393. package/src/commands/output.ts +142 -0
  394. package/src/commands/pipeline.ts +398 -0
  395. package/src/commands/project.test.ts +127 -0
  396. package/src/commands/project.ts +149 -0
  397. package/src/commands/sanitize.ts +60 -0
  398. package/src/commands/schema.ts +130 -0
  399. package/src/commands/setup.ts +509 -0
  400. package/src/commands/timeline.test.ts +499 -0
  401. package/src/commands/timeline.ts +529 -0
  402. package/src/commands/validate.ts +77 -0
  403. package/src/config/config.test.ts +197 -0
  404. package/src/config/index.ts +125 -0
  405. package/src/config/schema.ts +82 -0
  406. package/src/engine/index.ts +2 -0
  407. package/src/engine/project.test.ts +702 -0
  408. package/src/engine/project.ts +439 -0
  409. package/src/index.ts +146 -0
  410. package/src/utils/api-key.test.ts +41 -0
  411. package/src/utils/api-key.ts +247 -0
  412. package/src/utils/audio.ts +83 -0
  413. package/src/utils/exec-safe.ts +75 -0
  414. package/src/utils/first-run.ts +52 -0
  415. package/src/utils/provider-resolver.ts +56 -0
  416. package/src/utils/remotion.ts +951 -0
  417. package/src/utils/subtitle.test.ts +227 -0
  418. package/src/utils/subtitle.ts +169 -0
  419. package/src/utils/tty.ts +196 -0
  420. package/tsconfig.json +20 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * TTY Input Utilities
3
+ * Handles stdin fallback to /dev/tty for piped environments
4
+ */
5
+ import { createInterface } from "node:readline";
6
+ import { ReadStream } from "node:tty";
7
+ let ttyStream = null;
8
+ /**
9
+ * Get a TTY-capable input stream
10
+ * Falls back to /dev/tty when stdin is piped (e.g., from curl)
11
+ */
12
+ export function getTTYInputStream() {
13
+ if (process.stdin.isTTY) {
14
+ return process.stdin;
15
+ }
16
+ // stdin is not a TTY (piped), open /dev/tty directly
17
+ if (!ttyStream) {
18
+ try {
19
+ // Open /dev/tty as a TTY stream
20
+ const fd = require("fs").openSync("/dev/tty", "r");
21
+ ttyStream = new ReadStream(fd);
22
+ }
23
+ catch {
24
+ // Fallback to stdin if /dev/tty is not available
25
+ console.warn("Warning: Cannot open /dev/tty, interactive input may not work");
26
+ return process.stdin;
27
+ }
28
+ }
29
+ return ttyStream;
30
+ }
31
+ /**
32
+ * Check if we have TTY input available
33
+ */
34
+ export function hasTTY() {
35
+ if (process.stdin.isTTY)
36
+ return true;
37
+ // Try to actually open /dev/tty to verify it's accessible
38
+ try {
39
+ const fs = require("fs");
40
+ const fd = fs.openSync("/dev/tty", "r");
41
+ fs.closeSync(fd);
42
+ return true;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Close the TTY stream if we opened one
50
+ */
51
+ export function closeTTYStream() {
52
+ if (ttyStream) {
53
+ ttyStream.destroy();
54
+ ttyStream = null;
55
+ }
56
+ }
57
+ /**
58
+ * Create a readline interface with TTY support
59
+ */
60
+ export function createTTYInterface(options) {
61
+ const input = getTTYInputStream();
62
+ return createInterface({
63
+ input,
64
+ output: process.stdout,
65
+ terminal: true,
66
+ historySize: options?.historySize ?? 100,
67
+ prompt: options?.prompt ?? "> ",
68
+ });
69
+ }
70
+ /**
71
+ * Prompt for input (single line)
72
+ * Throws in non-TTY environments to prevent hanging.
73
+ */
74
+ export async function prompt(question) {
75
+ if (!hasTTY()) {
76
+ throw new Error("Interactive input required but no TTY available. " +
77
+ "Use command flags to provide values non-interactively.");
78
+ }
79
+ const input = getTTYInputStream();
80
+ const rl = createInterface({
81
+ input,
82
+ output: process.stdout,
83
+ });
84
+ return new Promise((resolve) => {
85
+ rl.question(question, (answer) => {
86
+ rl.close();
87
+ resolve(answer);
88
+ });
89
+ });
90
+ }
91
+ /**
92
+ * Prompt for hidden input (password/API key)
93
+ * Characters are not echoed to terminal
94
+ */
95
+ export async function promptHidden(question) {
96
+ const input = getTTYInputStream();
97
+ return new Promise((resolve) => {
98
+ process.stdout.write(question);
99
+ let value = "";
100
+ // Check if we can use raw mode
101
+ if (typeof input.setRawMode === "function") {
102
+ input.setRawMode(true);
103
+ input.resume();
104
+ input.setEncoding("utf8");
105
+ const onData = (char) => {
106
+ if (char === "\n" || char === "\r" || char === "\u0004") {
107
+ // Enter or EOF
108
+ input.setRawMode(false);
109
+ input.removeListener("data", onData);
110
+ process.stdout.write("\n");
111
+ resolve(value);
112
+ }
113
+ else if (char === "\u0003") {
114
+ // Ctrl+C
115
+ input.setRawMode(false);
116
+ process.stdout.write("\n");
117
+ process.exit(1);
118
+ }
119
+ else if (char === "\u007F" || char === "\b") {
120
+ // Backspace
121
+ if (value.length > 0) {
122
+ value = value.slice(0, -1);
123
+ // Clear character from display
124
+ process.stdout.write("\b \b");
125
+ }
126
+ }
127
+ else if (char >= " ") {
128
+ // Printable character (may be multiple chars when pasting)
129
+ value += char;
130
+ process.stdout.write("*".repeat(char.length)); // Show asterisk for each char
131
+ }
132
+ };
133
+ input.on("data", onData);
134
+ }
135
+ else {
136
+ // Fallback: no raw mode available, input will be visible
137
+ const rl = createInterface({ input, output: process.stdout });
138
+ rl.question("", (answer) => {
139
+ rl.close();
140
+ resolve(answer);
141
+ });
142
+ }
143
+ });
144
+ }
145
+ /**
146
+ * Prompt for selection from a list (1-based index)
147
+ */
148
+ export async function promptSelect(question, options, defaultIndex = 0) {
149
+ // Display options
150
+ for (let i = 0; i < options.length; i++) {
151
+ const marker = i === defaultIndex ? "→" : " ";
152
+ console.log(` ${marker} ${i + 1}. ${options[i]}`);
153
+ }
154
+ console.log();
155
+ const answer = await prompt(question);
156
+ const index = parseInt(answer, 10) - 1;
157
+ if (isNaN(index) || index < 0 || index >= options.length) {
158
+ return defaultIndex;
159
+ }
160
+ return index;
161
+ }
162
+ /**
163
+ * Prompt for yes/no confirmation
164
+ */
165
+ export async function promptConfirm(question, defaultYes = true) {
166
+ const hint = defaultYes ? "(Y/n)" : "(y/N)";
167
+ const answer = await prompt(`${question} ${hint}: `);
168
+ if (answer === "")
169
+ return defaultYes;
170
+ return answer.toLowerCase().startsWith("y");
171
+ }
172
+ //# sourceMappingURL=tty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../src/utils/tty.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "@vibeframe/cli",
3
+ "version": "0.27.0",
4
+ "description": "VibeFrame CLI - natural language video editing from the terminal",
5
+ "private": false,
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/vericontext/vibeframe.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/vericontext/vibeframe/issues"
14
+ },
15
+ "keywords": [
16
+ "vibeframe",
17
+ "cli",
18
+ "video-editing",
19
+ "ai",
20
+ "ffmpeg",
21
+ "commander"
22
+ ],
23
+ "type": "module",
24
+ "bin": {
25
+ "vibe": "./dist/index.js"
26
+ },
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "import": "./src/index.ts",
32
+ "types": "./src/index.ts"
33
+ },
34
+ "./engine": {
35
+ "import": "./src/engine/index.ts",
36
+ "types": "./src/engine/index.ts"
37
+ },
38
+ "./commands/export": {
39
+ "import": "./src/commands/export.ts",
40
+ "types": "./src/commands/export.ts"
41
+ },
42
+ "./commands/ai-edit": {
43
+ "import": "./src/commands/ai-edit.ts",
44
+ "types": "./src/commands/ai-edit.ts"
45
+ },
46
+ "./commands/ai-analyze": {
47
+ "import": "./src/commands/ai-analyze.ts",
48
+ "types": "./src/commands/ai-analyze.ts"
49
+ },
50
+ "./commands/ai-review": {
51
+ "import": "./src/commands/ai-review.ts",
52
+ "types": "./src/commands/ai-review.ts"
53
+ },
54
+ "./commands/ai-image": {
55
+ "import": "./src/commands/ai-image.ts",
56
+ "types": "./src/commands/ai-image.ts"
57
+ },
58
+ "./commands/ai-script-pipeline": {
59
+ "import": "./src/commands/ai-script-pipeline.ts",
60
+ "types": "./src/commands/ai-script-pipeline.ts"
61
+ },
62
+ "./commands/ai-highlights": {
63
+ "import": "./src/commands/ai-highlights.ts",
64
+ "types": "./src/commands/ai-highlights.ts"
65
+ },
66
+ "./commands/ai-narrate": {
67
+ "import": "./src/commands/ai-narrate.ts",
68
+ "types": "./src/commands/ai-narrate.ts"
69
+ }
70
+ },
71
+ "scripts": {
72
+ "build": "tsc",
73
+ "dev": "tsc --watch",
74
+ "start": "tsx src/index.ts",
75
+ "lint": "eslint --ext .ts,.tsx src/",
76
+ "test": "vitest"
77
+ },
78
+ "dependencies": {
79
+ "@anthropic-ai/sdk": "^0.39.0",
80
+ "@google/generative-ai": "^0.21.0",
81
+ "@vibeframe/ai-providers": "workspace:*",
82
+ "@vibeframe/core": "workspace:*",
83
+ "chalk": "^5.3.0",
84
+ "commander": "^12.0.0",
85
+ "dotenv": "^17.2.3",
86
+ "image-size": "^2.0.2",
87
+ "music-metadata": "^11.11.1",
88
+ "openai": "^4.77.0",
89
+ "ora": "^8.0.1",
90
+ "yaml": "^2.3.4"
91
+ },
92
+ "devDependencies": {
93
+ "@types/node": "^20.11.0",
94
+ "@vitest/coverage-v8": "1",
95
+ "tsx": "^4.21.0",
96
+ "typescript": "^5.3.3",
97
+ "vitest": "^1.2.2"
98
+ },
99
+ "engines": {
100
+ "node": ">=20"
101
+ }
102
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Claude LLM Adapter with tool_use
3
+ */
4
+
5
+ import Anthropic from "@anthropic-ai/sdk";
6
+ import type { LLMAdapter } from "./index.js";
7
+ import type {
8
+ ToolDefinition,
9
+ LLMResponse,
10
+ AgentMessage,
11
+ ToolCall,
12
+ LLMProvider,
13
+ } from "../types.js";
14
+
15
+ export class ClaudeAdapter implements LLMAdapter {
16
+ readonly provider: LLMProvider = "claude";
17
+ private client: Anthropic | null = null;
18
+ private model: string = "claude-sonnet-4-6";
19
+
20
+ async initialize(apiKey: string): Promise<void> {
21
+ this.client = new Anthropic({ apiKey });
22
+ }
23
+
24
+ isInitialized(): boolean {
25
+ return this.client !== null;
26
+ }
27
+
28
+ setModel(model: string): void {
29
+ this.model = model;
30
+ }
31
+
32
+ async chat(
33
+ messages: AgentMessage[],
34
+ tools: ToolDefinition[]
35
+ ): Promise<LLMResponse> {
36
+ if (!this.client) {
37
+ throw new Error("Claude adapter not initialized");
38
+ }
39
+
40
+ // Extract system message
41
+ const systemMessage = messages.find((m) => m.role === "system");
42
+ const systemPrompt = systemMessage?.content || "";
43
+
44
+ // Convert messages to Claude format
45
+ const claudeMessages: Anthropic.MessageParam[] = [];
46
+
47
+ for (const msg of messages) {
48
+ if (msg.role === "system") continue;
49
+
50
+ if (msg.role === "user") {
51
+ claudeMessages.push({
52
+ role: "user",
53
+ content: msg.content,
54
+ });
55
+ } else if (msg.role === "assistant") {
56
+ const content: Anthropic.ContentBlockParam[] = [];
57
+
58
+ if (msg.content) {
59
+ content.push({ type: "text", text: msg.content });
60
+ }
61
+
62
+ if (msg.toolCalls) {
63
+ for (const tc of msg.toolCalls) {
64
+ content.push({
65
+ type: "tool_use",
66
+ id: tc.id,
67
+ name: tc.name,
68
+ input: tc.arguments,
69
+ });
70
+ }
71
+ }
72
+
73
+ if (content.length > 0) {
74
+ claudeMessages.push({
75
+ role: "assistant",
76
+ content,
77
+ });
78
+ }
79
+ } else if (msg.role === "tool") {
80
+ claudeMessages.push({
81
+ role: "user",
82
+ content: [
83
+ {
84
+ type: "tool_result",
85
+ tool_use_id: msg.toolCallId!,
86
+ content: msg.content,
87
+ },
88
+ ],
89
+ });
90
+ }
91
+ }
92
+
93
+ // Convert tools to Claude format
94
+ const claudeTools: Anthropic.Tool[] = tools.map((tool) => ({
95
+ name: tool.name,
96
+ description: tool.description,
97
+ input_schema: {
98
+ type: "object" as const,
99
+ properties: tool.parameters.properties as Record<string, unknown>,
100
+ required: tool.parameters.required,
101
+ },
102
+ }));
103
+
104
+ // Make API call
105
+ const response = await this.client.messages.create({
106
+ model: this.model,
107
+ max_tokens: 4096,
108
+ system: systemPrompt,
109
+ messages: claudeMessages,
110
+ tools: claudeTools.length > 0 ? claudeTools : undefined,
111
+ });
112
+
113
+ // Parse response
114
+ let textContent = "";
115
+ const toolCalls: ToolCall[] = [];
116
+
117
+ for (const block of response.content) {
118
+ if (block.type === "text") {
119
+ textContent += block.text;
120
+ } else if (block.type === "tool_use") {
121
+ toolCalls.push({
122
+ id: block.id,
123
+ name: block.name,
124
+ arguments: block.input as Record<string, unknown>,
125
+ });
126
+ }
127
+ }
128
+
129
+ // Map stop reason
130
+ let finishReason: LLMResponse["finishReason"] = "stop";
131
+ if (response.stop_reason === "tool_use") {
132
+ finishReason = "tool_calls";
133
+ } else if (response.stop_reason === "max_tokens") {
134
+ finishReason = "length";
135
+ }
136
+
137
+ return {
138
+ content: textContent,
139
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
140
+ finishReason,
141
+ };
142
+ }
143
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Gemini LLM Adapter with Function Calling
3
+ */
4
+
5
+ import { GoogleGenerativeAI, SchemaType, type Content, type Part, type Tool as GeminiTool, type FunctionDeclarationSchemaProperty } from "@google/generative-ai";
6
+ import type { LLMAdapter } from "./index.js";
7
+ import type {
8
+ ToolDefinition,
9
+ LLMResponse,
10
+ AgentMessage,
11
+ ToolCall,
12
+ LLMProvider,
13
+ } from "../types.js";
14
+
15
+ export class GeminiAdapter implements LLMAdapter {
16
+ readonly provider: LLMProvider = "gemini";
17
+ private client: GoogleGenerativeAI | null = null;
18
+ private model: string = "gemini-2.5-flash";
19
+
20
+ async initialize(apiKey: string): Promise<void> {
21
+ this.client = new GoogleGenerativeAI(apiKey);
22
+ }
23
+
24
+ isInitialized(): boolean {
25
+ return this.client !== null;
26
+ }
27
+
28
+ setModel(model: string): void {
29
+ this.model = model;
30
+ }
31
+
32
+ async chat(
33
+ messages: AgentMessage[],
34
+ tools: ToolDefinition[]
35
+ ): Promise<LLMResponse> {
36
+ if (!this.client) {
37
+ throw new Error("Gemini adapter not initialized");
38
+ }
39
+
40
+ // Extract system message
41
+ const systemMessage = messages.find((m) => m.role === "system");
42
+ const systemInstruction = systemMessage?.content;
43
+
44
+ // Convert tools to Gemini format
45
+ const geminiTools: GeminiTool[] = tools.length > 0 ? [{
46
+ functionDeclarations: tools.map((tool) => ({
47
+ name: tool.name,
48
+ description: tool.description,
49
+ parameters: {
50
+ type: SchemaType.OBJECT,
51
+ properties: tool.parameters.properties as Record<string, FunctionDeclarationSchemaProperty>,
52
+ required: tool.parameters.required,
53
+ },
54
+ })),
55
+ }] : [];
56
+
57
+ // Get model with tools
58
+ const model = this.client.getGenerativeModel({
59
+ model: this.model,
60
+ systemInstruction,
61
+ tools: geminiTools.length > 0 ? geminiTools : undefined,
62
+ });
63
+
64
+ // Convert messages to Gemini format
65
+ const geminiContents: Content[] = [];
66
+
67
+ for (const msg of messages) {
68
+ if (msg.role === "system") continue;
69
+
70
+ if (msg.role === "user") {
71
+ geminiContents.push({
72
+ role: "user",
73
+ parts: [{ text: msg.content }],
74
+ });
75
+ } else if (msg.role === "assistant") {
76
+ const parts: Part[] = [];
77
+
78
+ if (msg.content) {
79
+ parts.push({ text: msg.content });
80
+ }
81
+
82
+ if (msg.toolCalls) {
83
+ for (const tc of msg.toolCalls) {
84
+ parts.push({
85
+ functionCall: {
86
+ name: tc.name,
87
+ args: tc.arguments,
88
+ },
89
+ });
90
+ }
91
+ }
92
+
93
+ if (parts.length > 0) {
94
+ geminiContents.push({
95
+ role: "model",
96
+ parts,
97
+ });
98
+ }
99
+ } else if (msg.role === "tool") {
100
+ // Gemini expects function responses in user turn
101
+ geminiContents.push({
102
+ role: "user",
103
+ parts: [{
104
+ functionResponse: {
105
+ name: msg.toolCallId!.split(":::")[0] || "unknown", // Extract function name from id
106
+ response: { result: msg.content },
107
+ },
108
+ }],
109
+ });
110
+ }
111
+ }
112
+
113
+ // Make API call
114
+ const result = await model.generateContent({
115
+ contents: geminiContents,
116
+ });
117
+
118
+ const response = result.response;
119
+ const candidate = response.candidates?.[0];
120
+
121
+ if (!candidate) {
122
+ return {
123
+ content: "",
124
+ finishReason: "error",
125
+ };
126
+ }
127
+
128
+ // Parse response
129
+ let textContent = "";
130
+ const toolCalls: ToolCall[] = [];
131
+
132
+ for (const part of candidate.content.parts) {
133
+ if ("text" in part && part.text) {
134
+ textContent += part.text;
135
+ } else if ("functionCall" in part && part.functionCall) {
136
+ const fc = part.functionCall;
137
+ toolCalls.push({
138
+ id: `${fc.name}:::${Date.now()}`,
139
+ name: fc.name,
140
+ arguments: (fc.args || {}) as Record<string, unknown>,
141
+ });
142
+ }
143
+ }
144
+
145
+ // Map finish reason
146
+ let finishReason: LLMResponse["finishReason"] = "stop";
147
+ if (toolCalls.length > 0) {
148
+ finishReason = "tool_calls";
149
+ } else if (candidate.finishReason === "MAX_TOKENS") {
150
+ finishReason = "length";
151
+ }
152
+
153
+ return {
154
+ content: textContent,
155
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
156
+ finishReason,
157
+ };
158
+ }
159
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * LLM Adapter Interface and Factory
3
+ */
4
+
5
+ import type { ToolDefinition, LLMResponse, AgentMessage, LLMProvider } from "../types.js";
6
+
7
+ /**
8
+ * Abstract interface for LLM providers
9
+ */
10
+ export interface LLMAdapter {
11
+ /** Provider name */
12
+ readonly provider: LLMProvider;
13
+
14
+ /** Initialize the adapter with API key */
15
+ initialize(apiKey: string): Promise<void>;
16
+
17
+ /** Check if adapter is initialized */
18
+ isInitialized(): boolean;
19
+
20
+ /** Send messages with tools and get response */
21
+ chat(
22
+ messages: AgentMessage[],
23
+ tools: ToolDefinition[]
24
+ ): Promise<LLMResponse>;
25
+ }
26
+
27
+ /**
28
+ * Factory for creating LLM adapters
29
+ */
30
+ export async function createAdapter(provider: LLMProvider): Promise<LLMAdapter> {
31
+ switch (provider) {
32
+ case "openai": {
33
+ const { OpenAIAdapter } = await import("./openai.js");
34
+ return new OpenAIAdapter();
35
+ }
36
+ case "claude": {
37
+ const { ClaudeAdapter } = await import("./claude.js");
38
+ return new ClaudeAdapter();
39
+ }
40
+ case "gemini": {
41
+ const { GeminiAdapter } = await import("./gemini.js");
42
+ return new GeminiAdapter();
43
+ }
44
+ case "ollama": {
45
+ const { OllamaAdapter } = await import("./ollama.js");
46
+ return new OllamaAdapter();
47
+ }
48
+ case "xai": {
49
+ const { XAIAdapter } = await import("./xai.js");
50
+ return new XAIAdapter();
51
+ }
52
+ default:
53
+ throw new Error(`Unknown provider: ${provider}`);
54
+ }
55
+ }
56
+
57
+ export { OpenAIAdapter } from "./openai.js";
58
+ export { ClaudeAdapter } from "./claude.js";
59
+ export { GeminiAdapter } from "./gemini.js";
60
+ export { OllamaAdapter } from "./ollama.js";
61
+ export { XAIAdapter } from "./xai.js";