@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,347 @@
1
+ /**
2
+ * @module ai-motion
3
+ * @description Motion graphics render and composite command.
4
+ *
5
+ * ## Commands: vibe ai motion
6
+ * ## Dependencies: Claude, Gemini, Remotion
7
+ *
8
+ * Extracted from ai.ts as part of modularisation.
9
+ * ai.ts re-exports all public types and functions from this module.
10
+ * @see MODELS.md for AI model configuration
11
+ */
12
+
13
+ import { type Command } from 'commander';
14
+ import { resolve } from 'node:path';
15
+ import { existsSync } from 'node:fs';
16
+ import { readFile, writeFile } from 'node:fs/promises';
17
+ import chalk from 'chalk';
18
+ import ora from 'ora';
19
+ import { ClaudeProvider, GeminiProvider } from '@vibeframe/ai-providers';
20
+ import { getApiKey } from '../utils/api-key.js';
21
+
22
+ // ── Motion: exported function for Agent tool ────────────────────────────────
23
+
24
+ export interface MotionCommandOptions {
25
+ description: string;
26
+ duration?: number;
27
+ width?: number;
28
+ height?: number;
29
+ fps?: number;
30
+ style?: string;
31
+ /** If set, render the generated code with Remotion */
32
+ render?: boolean;
33
+ /** Base video to composite the motion graphic onto */
34
+ video?: string;
35
+ /** Image to analyze with Gemini — color/mood/composition fed into Claude prompt */
36
+ image?: string;
37
+ /** Path to existing TSX file to refine instead of generating from scratch */
38
+ fromTsx?: string;
39
+ /**
40
+ * LLM model alias for code generation.
41
+ * sonnet (default) | opus | gemini | gemini-3.1-pro
42
+ */
43
+ model?: string;
44
+ /** Output path (TSX if code-only, WebM/MP4 if rendered) */
45
+ output?: string;
46
+ }
47
+
48
+ export interface MotionCommandResult {
49
+ success: boolean;
50
+ codePath?: string;
51
+ renderedPath?: string;
52
+ compositedPath?: string;
53
+ componentName?: string;
54
+ error?: string;
55
+ }
56
+
57
+ // Map model alias → { provider, modelId }
58
+ const MODEL_MAP: Record<string, { provider: "claude" | "gemini"; modelId: string }> = {
59
+ sonnet: { provider: "claude", modelId: "claude-sonnet-4-6" },
60
+ opus: { provider: "claude", modelId: "claude-opus-4-6" },
61
+ gemini: { provider: "gemini", modelId: "gemini-2.5-pro" },
62
+ "gemini-3.1-pro": { provider: "gemini", modelId: "gemini-3.1-pro-preview" },
63
+ };
64
+
65
+ export async function executeMotion(options: MotionCommandOptions): Promise<MotionCommandResult> {
66
+ const modelAlias = options.model || "sonnet";
67
+ const modelConfig = MODEL_MAP[modelAlias] ?? MODEL_MAP["sonnet"];
68
+ const useGemini = modelConfig.provider === "gemini";
69
+
70
+ const width = options.width || 1920;
71
+ const height = options.height || 1080;
72
+ const fps = options.fps || 30;
73
+ const duration = options.duration || 5;
74
+
75
+ // Resolve API key based on provider
76
+ let apiKey: string | null;
77
+ if (useGemini) {
78
+ apiKey = await getApiKey("GOOGLE_API_KEY", "Google");
79
+ if (!apiKey) return { success: false, error: "GOOGLE_API_KEY required for Gemini motion generation. Run 'vibe setup' or set GOOGLE_API_KEY in .env" };
80
+ } else {
81
+ apiKey = await getApiKey("ANTHROPIC_API_KEY", "Anthropic");
82
+ if (!apiKey) return { success: false, error: "ANTHROPIC_API_KEY required for Claude motion generation. Run 'vibe setup' or set ANTHROPIC_API_KEY in .env" };
83
+ }
84
+
85
+ // Step 0 (optional): Analyze image with Gemini, inject into description
86
+ let enrichedDescription = options.description;
87
+ if (options.image) {
88
+ const geminiApiKey = await getApiKey("GOOGLE_API_KEY", "Google");
89
+ if (!geminiApiKey) {
90
+ return { success: false, error: "GOOGLE_API_KEY required for image analysis (--image). Run 'vibe setup' or set GOOGLE_API_KEY in .env" };
91
+ }
92
+
93
+ const imagePath = resolve(process.cwd(), options.image);
94
+ const imageBuffer = await readFile(imagePath);
95
+
96
+ const gemini = new GeminiProvider();
97
+ await gemini.initialize({ apiKey: geminiApiKey });
98
+
99
+ const analysisResult = await gemini.analyzeImage(imageBuffer, `Analyze this image for motion graphics design purposes. Describe:
100
+ 1. Dominant color palette (exact hex values if possible)
101
+ 2. Subject placement and safe zones (where NOT to put text/graphics)
102
+ 3. Overall mood and atmosphere
103
+ 4. Lighting style (warm/cool, bright/dark, dramatic/soft)
104
+ 5. Key visual elements and their positions
105
+
106
+ Be specific and concise — this analysis will guide a Remotion animation generator.`);
107
+
108
+ if (analysisResult.success && analysisResult.response) {
109
+ enrichedDescription = `${options.description}
110
+
111
+ [Image Analysis Context]
112
+ ${analysisResult.response}
113
+
114
+ Use this image analysis to inform the color palette, typography placement, and overall aesthetic of the motion graphic.`;
115
+ }
116
+ }
117
+
118
+ type MotionResult = Awaited<ReturnType<InstanceType<typeof ClaudeProvider>["generateMotion"]>>;
119
+ let result: MotionResult;
120
+
121
+ if (options.fromTsx) {
122
+ // Refine mode: modify existing TSX instead of generating from scratch
123
+ const tsxPath = resolve(process.cwd(), options.fromTsx);
124
+ if (!existsSync(tsxPath)) {
125
+ return { success: false, error: `TSX file not found: ${tsxPath}` };
126
+ }
127
+ const existingCode = await readFile(tsxPath, "utf-8");
128
+
129
+ if (useGemini) {
130
+ const gemini = new GeminiProvider();
131
+ await gemini.initialize({ apiKey });
132
+ result = await gemini.refineMotion(existingCode, options.description, {
133
+ duration, width, height, fps, model: modelConfig.modelId,
134
+ });
135
+ } else {
136
+ const claude = new ClaudeProvider();
137
+ await claude.initialize({ apiKey });
138
+ result = await claude.refineMotion(existingCode, options.description, {
139
+ duration, width, height, fps,
140
+ });
141
+ }
142
+ } else {
143
+ if (useGemini) {
144
+ const gemini = new GeminiProvider();
145
+ await gemini.initialize({ apiKey });
146
+ result = await gemini.generateMotion(enrichedDescription, {
147
+ duration, width, height, fps,
148
+ style: options.style,
149
+ model: modelConfig.modelId,
150
+ });
151
+ } else {
152
+ const claude = new ClaudeProvider();
153
+ await claude.initialize({ apiKey });
154
+ result = await claude.generateMotion(enrichedDescription, {
155
+ duration, width, height, fps,
156
+ style: options.style as "minimal" | "corporate" | "playful" | "cinematic" | undefined,
157
+ });
158
+ }
159
+ }
160
+
161
+ if (!result.success || !result.component) {
162
+ return { success: false, error: result.error || "Motion generation failed" };
163
+ }
164
+
165
+ const { component } = result;
166
+ const defaultOutput = (options.video || options.image) ? "motion-output.mp4" : options.render ? "motion.webm" : "motion.tsx";
167
+ const outputPath = resolve(process.cwd(), options.output || defaultOutput);
168
+
169
+ // Save TSX code
170
+ const codePath = outputPath.replace(/\.\w+$/, ".tsx");
171
+ await writeFile(codePath, component.code, "utf-8");
172
+
173
+ const shouldRender = options.render || !!options.video || !!options.image;
174
+ if (!shouldRender) {
175
+ return { success: true, codePath, componentName: component.name };
176
+ }
177
+
178
+ // Render (and optionally composite onto video)
179
+ const {
180
+ ensureRemotionInstalled,
181
+ renderMotion,
182
+ wrapComponentWithVideo,
183
+ renderWithEmbeddedVideo,
184
+ wrapComponentWithImage,
185
+ renderWithEmbeddedImage,
186
+ } = await import("../utils/remotion.js");
187
+
188
+ const notInstalled = await ensureRemotionInstalled();
189
+ if (notInstalled) {
190
+ return { success: false, codePath, componentName: component.name, error: notInstalled };
191
+ }
192
+
193
+ const baseVideo = options.video ? resolve(process.cwd(), options.video) : undefined;
194
+ const baseImage = options.image ? resolve(process.cwd(), options.image) : undefined;
195
+
196
+ if (baseVideo) {
197
+ // Embed video inside the component (no transparency needed)
198
+ const videoFileName = "source_video.mp4";
199
+ const wrapped = wrapComponentWithVideo(component.code, component.name, videoFileName);
200
+
201
+ const renderResult = await renderWithEmbeddedVideo({
202
+ componentCode: wrapped.code,
203
+ componentName: wrapped.name,
204
+ width,
205
+ height,
206
+ fps,
207
+ durationInFrames: component.durationInFrames,
208
+ videoPath: baseVideo,
209
+ videoFileName,
210
+ outputPath,
211
+ });
212
+
213
+ if (!renderResult.success) {
214
+ return { success: false, codePath, componentName: component.name, error: renderResult.error };
215
+ }
216
+
217
+ return { success: true, codePath, componentName: component.name, compositedPath: renderResult.outputPath };
218
+ }
219
+
220
+ if (baseImage) {
221
+ // Embed image as background — motion graphic overlaid on top
222
+ const ext = baseImage.split(".").pop() || "png";
223
+ const imageFileName = `source_image.${ext}`;
224
+ const wrapped = wrapComponentWithImage(component.code, component.name, imageFileName);
225
+
226
+ const renderResult = await renderWithEmbeddedImage({
227
+ componentCode: wrapped.code,
228
+ componentName: wrapped.name,
229
+ width,
230
+ height,
231
+ fps,
232
+ durationInFrames: component.durationInFrames,
233
+ imagePath: baseImage,
234
+ imageFileName,
235
+ outputPath,
236
+ });
237
+
238
+ if (!renderResult.success) {
239
+ return { success: false, codePath, componentName: component.name, error: renderResult.error };
240
+ }
241
+
242
+ return { success: true, codePath, componentName: component.name, compositedPath: renderResult.outputPath };
243
+ }
244
+
245
+ // No base media — render standalone
246
+ const renderResult = await renderMotion({
247
+ componentCode: component.code,
248
+ componentName: component.name,
249
+ width,
250
+ height,
251
+ fps,
252
+ durationInFrames: component.durationInFrames,
253
+ outputPath,
254
+ transparent: false,
255
+ });
256
+
257
+ if (!renderResult.success) {
258
+ return { success: false, codePath, componentName: component.name, error: renderResult.error };
259
+ }
260
+
261
+ return { success: true, codePath, componentName: component.name, renderedPath: renderResult.outputPath };
262
+ }
263
+
264
+ /**
265
+ * Register the 'motion' sub-command on the given parent command.
266
+ * Called from ai.ts: registerMotionCommand(aiCommand)
267
+ */
268
+ export function registerMotionCommand(aiCommand: Command): void {
269
+ aiCommand
270
+ .command("motion")
271
+ .description("Generate motion graphics using Claude + Remotion (render & composite)")
272
+ .argument("<description>", "Natural language description of the motion graphic")
273
+ .option("-k, --api-key <key>", "Anthropic API key (or set ANTHROPIC_API_KEY env)")
274
+ .option("-o, --output <path>", "Output file path", "motion.tsx")
275
+ .option("-d, --duration <sec>", "Duration in seconds", "5")
276
+ .option("-w, --width <px>", "Width in pixels", "1920")
277
+ .option("-h, --height <px>", "Height in pixels", "1080")
278
+ .option("--fps <fps>", "Frame rate", "30")
279
+ .option("-s, --style <style>", "Style preset: minimal, corporate, playful, cinematic")
280
+ .option("--render", "Render the generated code with Remotion (output .webm)")
281
+ .option("--video <path>", "Base video to composite the motion graphic onto")
282
+ .option("--image <path>", "Image to analyze with Gemini — color/mood fed into Claude prompt")
283
+ .option("--from-tsx <path>", "Refine an existing TSX file instead of generating from scratch")
284
+ .option("-m, --model <alias>", "LLM model: sonnet (default), opus, gemini, gemini-3.1-pro", "sonnet")
285
+ .action(async (description: string, options) => {
286
+ try {
287
+ const shouldRender = options.render || !!options.video || !!options.image;
288
+
289
+ const spinner = ora("Generating motion graphic...").start();
290
+ if (options.image) {
291
+ spinner.text = "Analyzing image with Gemini...";
292
+ }
293
+
294
+ const result = await executeMotion({
295
+ description,
296
+ duration: parseFloat(options.duration),
297
+ width: parseInt(options.width),
298
+ height: parseInt(options.height),
299
+ fps: parseInt(options.fps),
300
+ style: options.style,
301
+ render: options.render,
302
+ video: options.video,
303
+ image: options.image,
304
+ fromTsx: options.fromTsx,
305
+ model: options.model,
306
+ output: options.output !== "motion.tsx" ? options.output : undefined,
307
+ });
308
+
309
+ if (!result.success) {
310
+ spinner.fail(chalk.red(result.error || "Motion generation failed"));
311
+ if (result.codePath) {
312
+ console.log(chalk.dim(`TSX code saved to: ${result.codePath}`));
313
+ }
314
+ process.exit(1);
315
+ }
316
+
317
+ spinner.succeed(chalk.green("Motion graphic generated"));
318
+
319
+ console.log();
320
+ console.log(chalk.bold.cyan("Motion Graphics Pipeline"));
321
+ console.log(chalk.dim("─".repeat(60)));
322
+
323
+ if (result.codePath) {
324
+ console.log(chalk.green(` Code: ${result.codePath}`));
325
+ }
326
+ if (result.renderedPath) {
327
+ console.log(chalk.green(` Rendered: ${result.renderedPath}`));
328
+ }
329
+ if (result.compositedPath) {
330
+ console.log(chalk.green(` Composited: ${result.compositedPath}`));
331
+ }
332
+
333
+ if (!shouldRender) {
334
+ console.log();
335
+ console.log(chalk.dim("To render, add --render flag or --video <path>:"));
336
+ console.log(chalk.dim(` vibe ai motion "${description}" --render -o motion.webm`));
337
+ console.log(chalk.dim(` vibe ai motion "${description}" --video input.mp4 -o output.mp4`));
338
+ }
339
+
340
+ console.log();
341
+ } catch (error) {
342
+ console.error(chalk.red("Motion generation failed"));
343
+ console.error(error);
344
+ process.exit(1);
345
+ }
346
+ });
347
+ }