cue-ai 0.9.2 → 0.9.3

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 (278) hide show
  1. package/CHANGELOG.md +4 -3
  2. package/README.md +148 -170
  3. package/bin/cue-learnings +30 -4
  4. package/bin/cue-review-progress +0 -0
  5. package/bin/cue-review-watch +0 -0
  6. package/dist/cue.js +4328 -3108
  7. package/package.json +1 -1
  8. package/plugins/cue/commands/cue-switch.md +1 -1
  9. package/plugins/cue/commands/cue.md +1 -1
  10. package/profiles/backend/profile.yaml +4 -0
  11. package/profiles/browser/profile.yaml +4 -0
  12. package/profiles/career/profile.yaml +2 -13
  13. package/profiles/commerce/profile.yaml +0 -2
  14. package/profiles/coolify/profile.yaml +0 -1
  15. package/profiles/core/profile.yaml +78 -11
  16. package/profiles/dash-merge-test/profile.yaml +6 -1
  17. package/profiles/designer/profile.yaml +9 -1
  18. package/profiles/dropshipping/profile.yaml +69 -0
  19. package/profiles/frontend/profile.yaml +4 -0
  20. package/profiles/google-ads/profile.yaml +34 -0
  21. package/profiles/google-analytics/profile.yaml +34 -0
  22. package/profiles/google-drive/profile.yaml +34 -0
  23. package/profiles/gstack/profile.yaml +117 -29
  24. package/profiles/marketing/profile.yaml +0 -1
  25. package/profiles/media/README.md +70 -0
  26. package/profiles/media/profile.yaml +104 -0
  27. package/profiles/nano-banana/profile.yaml +52 -0
  28. package/profiles/ops/profile.yaml +1 -2
  29. package/profiles/secops/profile.yaml +3 -0
  30. package/profiles/skill-writer/profile.yaml +15 -0
  31. package/profiles/video/profile.yaml +3 -0
  32. package/profiles/web-frontend-base/profile.yaml +6 -0
  33. package/profiles/webshop/profile.yaml +0 -1
  34. package/profiles/webshop-google/profile.yaml +1 -0
  35. package/profiles/x-growth-bot/profile.yaml +2 -0
  36. package/resources/icons/generate-icons.py +2 -128
  37. package/resources/mcps/configs/claude.sanitized.json +88 -20
  38. package/resources/mcps/configs/claude_runtime.sanitized.json +40 -1
  39. package/resources/mcps/configs/codex.sanitized.json +29 -0
  40. package/resources/skills/skills/career/job-hunter/LICENSE +21 -0
  41. package/resources/skills/skills/career/job-hunter/README.md +323 -0
  42. package/resources/skills/skills/career/job-hunter/SKILL.md +91 -0
  43. package/resources/skills/skills/career/job-hunter/agents/README.md +96 -0
  44. package/resources/skills/skills/career/job-hunter/agents/apply-assessment-prep.md +195 -0
  45. package/resources/skills/skills/career/job-hunter/agents/apply-ats-scan.md +155 -0
  46. package/resources/skills/skills/career/job-hunter/agents/apply-bias-audit.md +224 -0
  47. package/resources/skills/skills/career/job-hunter/agents/apply-cover-letter.md +69 -0
  48. package/resources/skills/skills/career/job-hunter/agents/apply-decode-jd.md +117 -0
  49. package/resources/skills/skills/career/job-hunter/agents/apply-fit-score.md +183 -0
  50. package/resources/skills/skills/career/job-hunter/agents/apply-linkedin-audit.md +74 -0
  51. package/resources/skills/skills/career/job-hunter/agents/apply-linkedin-scrape.md +255 -0
  52. package/resources/skills/skills/career/job-hunter/agents/apply-portfolio-brief.md +123 -0
  53. package/resources/skills/skills/career/job-hunter/agents/apply-reality-check.md +164 -0
  54. package/resources/skills/skills/career/job-hunter/agents/apply-reference-prep.md +150 -0
  55. package/resources/skills/skills/career/job-hunter/agents/apply-rejection-analysis.md +172 -0
  56. package/resources/skills/skills/career/job-hunter/agents/apply-resume.md +70 -0
  57. package/resources/skills/skills/career/job-hunter/agents/apply-skills-gap-filler.md +109 -0
  58. package/resources/skills/skills/career/job-hunter/agents/career-internal.md +94 -0
  59. package/resources/skills/skills/career/job-hunter/agents/career-linkedin-content.md +173 -0
  60. package/resources/skills/skills/career/job-hunter/agents/career-linkedin-scanner.md +262 -0
  61. package/resources/skills/skills/career/job-hunter/agents/career-network-message.md +108 -0
  62. package/resources/skills/skills/career/job-hunter/agents/career-promote.md +102 -0
  63. package/resources/skills/skills/career/job-hunter/agents/career-review.md +71 -0
  64. package/resources/skills/skills/career/job-hunter/agents/interview-debrief.md +117 -0
  65. package/resources/skills/skills/career/job-hunter/agents/interview-mock.md +171 -0
  66. package/resources/skills/skills/career/job-hunter/agents/interview-panel-decoder.md +152 -0
  67. package/resources/skills/skills/career/job-hunter/agents/interview-prep.md +184 -0
  68. package/resources/skills/skills/career/job-hunter/agents/interview-question-bank.md +133 -0
  69. package/resources/skills/skills/career/job-hunter/agents/interview-research.md +148 -0
  70. package/resources/skills/skills/career/job-hunter/agents/offer-compare.md +117 -0
  71. package/resources/skills/skills/career/job-hunter/agents/offer-counteroffer.md +144 -0
  72. package/resources/skills/skills/career/job-hunter/agents/offer-deadline-manager.md +148 -0
  73. package/resources/skills/skills/career/job-hunter/agents/offer-negotiate.md +126 -0
  74. package/resources/skills/skills/career/job-hunter/agents/offer-schedule.md +99 -0
  75. package/resources/skills/skills/career/job-hunter/agents/offer-thankyou.md +80 -0
  76. package/resources/skills/skills/career/job-hunter/agents/search-company-research.md +146 -0
  77. package/resources/skills/skills/career/job-hunter/agents/search-follow-up.md +129 -0
  78. package/resources/skills/skills/career/job-hunter/agents/search-ghost-job-detector.md +152 -0
  79. package/resources/skills/skills/career/job-hunter/agents/search-inbox-scan.md +193 -0
  80. package/resources/skills/skills/career/job-hunter/agents/search-interview-scorecard.md +164 -0
  81. package/resources/skills/skills/career/job-hunter/agents/search-jobs.md +149 -0
  82. package/resources/skills/skills/career/job-hunter/agents/search-momentum-check.md +194 -0
  83. package/resources/skills/skills/career/job-hunter/agents/search-outreach.md +85 -0
  84. package/resources/skills/skills/career/job-hunter/agents/search-referral-finder.md +124 -0
  85. package/resources/skills/skills/career/job-hunter/agents/search-salary.md +96 -0
  86. package/resources/skills/skills/career/job-hunter/agents/search-send-email.md +109 -0
  87. package/resources/skills/skills/career/job-hunter/agents/search-tracker-update.md +127 -0
  88. package/resources/skills/skills/career/job-hunter/inputs/README.md +26 -0
  89. package/resources/skills/skills/career/job-hunter/inputs/apply-linkedin-url.txt +8 -0
  90. package/resources/skills/skills/career/job-hunter/inputs/interview-context.md +24 -0
  91. package/resources/skills/skills/career/job-hunter/inputs/job-description.md +20 -0
  92. package/resources/skills/skills/career/job-hunter/inputs/job-search-criteria.md +36 -0
  93. package/resources/skills/skills/career/job-hunter/inputs/my-linkedin.md +24 -0
  94. package/resources/skills/skills/career/job-hunter/inputs/my-resume.md +28 -0
  95. package/resources/skills/skills/career/job-hunter/inputs/search-outreach-target.md +24 -0
  96. package/resources/skills/skills/career/job-hunter/rules/README.md +37 -0
  97. package/resources/skills/skills/career/job-hunter/rules/writing-rules.md +81 -0
  98. package/resources/skills/skills/design/banana/SKILL.md +375 -0
  99. package/resources/skills/skills/design/banana/references/cost-tracking.md +47 -0
  100. package/resources/skills/skills/design/banana/references/gemini-models.md +236 -0
  101. package/resources/skills/skills/design/banana/references/mcp-tools.md +145 -0
  102. package/resources/skills/skills/design/banana/references/post-processing.md +192 -0
  103. package/resources/skills/skills/design/banana/references/presets.md +69 -0
  104. package/resources/skills/skills/design/banana/references/prompt-engineering.md +481 -0
  105. package/resources/skills/skills/design/banana/scripts/batch.py +97 -0
  106. package/resources/skills/skills/design/banana/scripts/cost_tracker.py +191 -0
  107. package/resources/skills/skills/design/banana/scripts/edit.py +159 -0
  108. package/resources/skills/skills/design/banana/scripts/generate.py +168 -0
  109. package/resources/skills/skills/design/banana/scripts/presets.py +154 -0
  110. package/resources/skills/skills/design/banana/scripts/setup_mcp.py +151 -0
  111. package/resources/skills/skills/design/banana/scripts/validate_setup.py +133 -0
  112. package/resources/skills/skills/gstack/ship/SKILL.md +13 -0
  113. package/resources/skills/skills/media/3d-logo-animation/SKILL.md +59 -0
  114. package/resources/skills/skills/media/action-figure-generator/SKILL.md +48 -0
  115. package/resources/skills/skills/media/ad-creative/SKILL.md +79 -0
  116. package/resources/skills/skills/media/ai-clipping/SKILL.md +194 -0
  117. package/resources/skills/skills/media/ai-clipping/scripts/run-ai-clipping.sh +200 -0
  118. package/resources/skills/skills/media/ai-fight-scene/SKILL.md +132 -0
  119. package/resources/skills/skills/media/amazon-product-listing/SKILL.md +68 -0
  120. package/resources/skills/skills/media/animal-video-generator/SKILL.md +59 -0
  121. package/resources/skills/skills/media/award-ceremony-video/SKILL.md +87 -0
  122. package/resources/skills/skills/media/blog-header/SKILL.md +61 -0
  123. package/resources/skills/skills/media/brand-kit/SKILL.md +72 -0
  124. package/resources/skills/skills/media/brochures/SKILL.md +65 -0
  125. package/resources/skills/skills/media/cartoon-dance-animation/SKILL.md +62 -0
  126. package/resources/skills/skills/media/character-story-video/SKILL.md +84 -0
  127. package/resources/skills/skills/media/chibi-collage-effect/SKILL.md +63 -0
  128. package/resources/skills/skills/media/cinema-director/SKILL.md +93 -0
  129. package/resources/skills/skills/media/cinema-director/scripts/generate-film.sh +78 -0
  130. package/resources/skills/skills/media/color-analysis-board/SKILL.md +71 -0
  131. package/resources/skills/skills/media/core-edit/SKILL.md +48 -0
  132. package/resources/skills/skills/media/core-edit/edit-image.sh +54 -0
  133. package/resources/skills/skills/media/core-edit/enhance-image.sh +191 -0
  134. package/resources/skills/skills/media/core-edit/lipsync.sh +144 -0
  135. package/resources/skills/skills/media/core-edit/video-effects.sh +193 -0
  136. package/resources/skills/skills/media/core-media/SKILL.md +49 -0
  137. package/resources/skills/skills/media/core-media/create-music.sh +169 -0
  138. package/resources/skills/skills/media/core-media/generate-image.sh +161 -0
  139. package/resources/skills/skills/media/core-media/generate-video.sh +137 -0
  140. package/resources/skills/skills/media/core-media/image-to-video.sh +228 -0
  141. package/resources/skills/skills/media/core-media/schema_data.json +18708 -0
  142. package/resources/skills/skills/media/core-media/upload.sh +41 -0
  143. package/resources/skills/skills/media/core-platform/SKILL.md +41 -0
  144. package/resources/skills/skills/media/core-platform/check-result.sh +37 -0
  145. package/resources/skills/skills/media/core-platform/setup.sh +31 -0
  146. package/resources/skills/skills/media/couple-grid-creator/SKILL.md +47 -0
  147. package/resources/skills/skills/media/design-guide/SKILL.md +73 -0
  148. package/resources/skills/skills/media/drone-style-video/SKILL.md +61 -0
  149. package/resources/skills/skills/media/fashion-try-on/SKILL.md +61 -0
  150. package/resources/skills/skills/media/floor-plan-rendering/SKILL.md +56 -0
  151. package/resources/skills/skills/media/freeze-effect-video/SKILL.md +100 -0
  152. package/resources/skills/skills/media/giant-product-showcase/SKILL.md +61 -0
  153. package/resources/skills/skills/media/instagram-post/SKILL.md +58 -0
  154. package/resources/skills/skills/media/interior-design/SKILL.md +61 -0
  155. package/resources/skills/skills/media/interior-design-visualizer/SKILL.md +57 -0
  156. package/resources/skills/skills/media/jewelry-product-video/SKILL.md +61 -0
  157. package/resources/skills/skills/media/kdenlive/SKILL.md +106 -0
  158. package/resources/skills/skills/media/kdenlive/scripts/assemble.sh +57 -0
  159. package/resources/skills/skills/media/kdenlive/scripts/common.sh +30 -0
  160. package/resources/skills/skills/media/kdenlive/scripts/inspect.sh +19 -0
  161. package/resources/skills/skills/media/kdenlive/scripts/reframe.sh +22 -0
  162. package/resources/skills/skills/media/kdenlive/scripts/render.sh +16 -0
  163. package/resources/skills/skills/media/kdenlive/scripts/title-card.sh +25 -0
  164. package/resources/skills/skills/media/keyboard-art-maker/SKILL.md +44 -0
  165. package/resources/skills/skills/media/logo-branding/SKILL.md +70 -0
  166. package/resources/skills/skills/media/logo-creator/SKILL.md +80 -0
  167. package/resources/skills/skills/media/logo-creator/scripts/create-logo.sh +38 -0
  168. package/resources/skills/skills/media/logo-generator/SKILL.md +56 -0
  169. package/resources/skills/skills/media/multi-angle-reshoot/SKILL.md +70 -0
  170. package/resources/skills/skills/media/multi-angle-shots/SKILL.md +73 -0
  171. package/resources/skills/skills/media/music-video/SKILL.md +61 -0
  172. package/resources/skills/skills/media/nano-banana/SKILL.md +80 -0
  173. package/resources/skills/skills/media/nano-banana/scripts/generate-nano-art.sh +54 -0
  174. package/resources/skills/skills/media/one-shot-video/SKILL.md +56 -0
  175. package/resources/skills/skills/media/photo-pack-generator/SKILL.md +205 -0
  176. package/resources/skills/skills/media/photo-pack-generator/scripts/generate-pack.sh +241 -0
  177. package/resources/skills/skills/media/product-ad-cinematic/SKILL.md +78 -0
  178. package/resources/skills/skills/media/product-campaign/SKILL.md +76 -0
  179. package/resources/skills/skills/media/product-showcase-video/SKILL.md +60 -0
  180. package/resources/skills/skills/media/product-video-ad-maker/SKILL.md +59 -0
  181. package/resources/skills/skills/media/rednote-cover/SKILL.md +57 -0
  182. package/resources/skills/skills/media/seedance-2/SKILL.md +632 -0
  183. package/resources/skills/skills/media/seedance-2/scripts/generate-seedance.sh +701 -0
  184. package/resources/skills/skills/media/selfie-with-celebrities/SKILL.md +64 -0
  185. package/resources/skills/skills/media/social-media-video/SKILL.md +277 -0
  186. package/resources/skills/skills/media/social-media-video/scripts/run-social-video.sh +316 -0
  187. package/resources/skills/skills/media/social-pack/SKILL.md +58 -0
  188. package/resources/skills/skills/media/storyboard/SKILL.md +57 -0
  189. package/resources/skills/skills/media/storyboard-to-cooking-video/SKILL.md +143 -0
  190. package/resources/skills/skills/media/talking-baby-video/SKILL.md +57 -0
  191. package/resources/skills/skills/media/ugc-ads-workflow/SKILL.md +70 -0
  192. package/resources/skills/skills/media/ugc-lifestyle-try-on/SKILL.md +65 -0
  193. package/resources/skills/skills/media/ugc-video-factory/SKILL.md +134 -0
  194. package/resources/skills/skills/media/ui-design/SKILL.md +81 -0
  195. package/resources/skills/skills/media/ui-design/scripts/generate-mockup.sh +49 -0
  196. package/resources/skills/skills/media/url-to-design/SKILL.md +61 -0
  197. package/resources/skills/skills/media/workflow/SKILL.md +197 -0
  198. package/resources/skills/skills/media/workflow/scripts/discover-workflow.sh +18 -0
  199. package/resources/skills/skills/media/workflow/scripts/generate-workflow.sh +33 -0
  200. package/resources/skills/skills/media/workflow/scripts/interactive-run.sh +16 -0
  201. package/resources/skills/skills/media/workflow/scripts/list-workflows.sh +20 -0
  202. package/resources/skills/skills/media/workflow/scripts/run-workflow.sh +34 -0
  203. package/resources/skills/skills/media/youtube-shorts/SKILL.md +173 -0
  204. package/resources/skills/skills/media/youtube-shorts/scripts/run-youtube-shorts.sh +141 -0
  205. package/resources/skills/skills/media/youtube-thumbnail/SKILL.md +66 -0
  206. package/resources/skills/skills/meta/cue-developer/references/architecture.md +2 -2
  207. package/resources/skills/skills/meta/cue-usage/SKILL.md +1 -1
  208. package/resources/skills/skills/meta/profile-fit-monitor/SKILL.md +2 -2
  209. package/resources/skills/skills/meta/profile-optimizer/SKILL.md +1 -1
  210. package/resources/skills/skills/meta/profile-suggest/SKILL.md +7 -7
  211. package/resources/skills/skills/meta/profile-summon/SKILL.md +159 -0
  212. package/resources/skills/skills/meta/profile-summon/evals/evals.json +53 -0
  213. package/resources/skills/skills/meta/save-profile/SKILL.md +1 -1
  214. package/resources/skills/skills/meta/skill-reviewer/SKILL.md +3 -0
  215. package/resources/skills/skills/meta/skill-reviewer/references/tdd-for-skills.md +55 -0
  216. package/resources/skills/skills/research/find-skills/SKILL.md +1 -1
  217. package/resources/skills/skills/review/code-review-deep/SKILL.md +20 -0
  218. package/resources/skills/skills/security/trivy-scan/SKILL.md +139 -0
  219. package/resources/skills/skills/security/trivy-scan/scripts/ensure-trivy.sh +21 -0
  220. package/resources/skills/skills/tools/ccusage/SKILL.md +142 -0
  221. package/src/commands/_index.ts +8 -0
  222. package/src/commands/ai.ts +2 -2
  223. package/src/commands/auto-detect.test.ts +74 -0
  224. package/src/commands/auto-detect.ts +9 -7
  225. package/src/commands/cli.test.ts +20 -4
  226. package/src/commands/cli.ts +36 -20
  227. package/src/commands/create-profile.ts +2 -2
  228. package/src/commands/debug.ts +2 -2
  229. package/src/commands/discover.ts +14 -4
  230. package/src/commands/export-docker.ts +1 -1
  231. package/src/commands/features-batch1.test.ts +1 -1
  232. package/src/commands/gates.ts +1 -1
  233. package/src/commands/import-profile.ts +1 -1
  234. package/src/commands/init.ts +15 -11
  235. package/src/commands/install.test.ts +192 -0
  236. package/src/commands/install.ts +610 -0
  237. package/src/commands/launch-handoff.e2e.test.ts +33 -1
  238. package/src/commands/launch.e2e.test.ts +15 -10
  239. package/src/commands/launch.ts +73 -116
  240. package/src/commands/materialize.ts +2 -2
  241. package/src/commands/prune.ts +1 -1
  242. package/src/commands/security-audit.ts +1 -1
  243. package/src/commands/shell.ts +7 -7
  244. package/src/commands/skill-report.ts +1 -1
  245. package/src/commands/skills.ts +3 -3
  246. package/src/commands/snapshot.ts +2 -2
  247. package/src/commands/summon.test.ts +116 -0
  248. package/src/commands/summon.ts +338 -0
  249. package/src/commands/trigger-gaps.ts +1 -1
  250. package/src/commands/use.ts +47 -3
  251. package/src/commands/watch-live.ts +5 -5
  252. package/src/commands/watch.ts +8 -8
  253. package/src/index.ts +2 -0
  254. package/src/lib/active-sessions.test.ts +3 -3
  255. package/src/lib/active-sessions.ts +4 -4
  256. package/src/lib/auto-detect.test.ts +172 -8
  257. package/src/lib/auto-detect.ts +191 -136
  258. package/src/lib/codex-persona-parity.test.ts +58 -0
  259. package/src/lib/companion-detect.test.ts +43 -1
  260. package/src/lib/companion-detect.ts +35 -0
  261. package/src/lib/credentials-sync.test.ts +121 -1
  262. package/src/lib/credentials-sync.ts +95 -1
  263. package/src/lib/cwd-resolver.test.ts +8 -8
  264. package/src/lib/cwd-resolver.ts +2 -2
  265. package/src/lib/dashboard-merge.test.ts +9 -4
  266. package/src/lib/dashboard-server.ts +1 -1
  267. package/src/lib/picker.test.ts +1 -1
  268. package/src/lib/picker.ts +5 -5
  269. package/src/lib/profile-merge.test.ts +8 -0
  270. package/src/lib/profile-names.test.ts +3 -3
  271. package/src/lib/runtime-install.ts +166 -0
  272. package/src/lib/runtime-materializer.test.ts +137 -0
  273. package/src/lib/runtime-materializer.ts +105 -2
  274. package/src/lib/skill-router.test.ts +38 -0
  275. package/src/lib/skill-router.ts +65 -4
  276. package/profiles/eu-tender-research/README.md +0 -48
  277. package/profiles/eu-tender-research/logo.png +0 -0
  278. package/profiles/eu-tender-research/profile.yaml +0 -108
@@ -0,0 +1,54 @@
1
+ #!/bin/bash
2
+ # muapi.ai Image Editing
3
+ # Usage: ./edit-image.sh --image-url URL --prompt "..." [--model MODEL]
4
+
5
+ set -e
6
+
7
+ IMAGE_URL=""
8
+ IMAGE_FILE=""
9
+ PROMPT=""
10
+ MODEL="flux-kontext-pro"
11
+ ASPECT_RATIO="1:1"
12
+ NUM_IMAGES=1
13
+ ASYNC=false
14
+ JSON_ONLY=false
15
+ JQ_EXPR=""
16
+ TIMEOUT=300
17
+
18
+ while [[ $# -gt 0 ]]; do
19
+ case $1 in
20
+ --image-url) IMAGE_URL="$2"; shift 2 ;;
21
+ --file|-f) IMAGE_FILE="$2"; shift 2 ;;
22
+ --prompt|-p) PROMPT="$2"; shift 2 ;;
23
+ --model|-m) MODEL="$2"; shift 2 ;;
24
+ --aspect-ratio) ASPECT_RATIO="$2"; shift 2 ;;
25
+ --num-images) NUM_IMAGES="$2"; shift 2 ;;
26
+ --async) ASYNC=true; shift ;;
27
+ --timeout) TIMEOUT="$2"; shift 2 ;;
28
+ --json) JSON_ONLY=true; shift ;;
29
+ --jq) JQ_EXPR="$2"; shift 2 ;;
30
+ --help|-h)
31
+ echo "Usage: ./edit-image.sh --image-url URL --prompt \"...\" [options]"
32
+ echo ""
33
+ muapi image models
34
+ exit 0 ;;
35
+ *) shift ;;
36
+ esac
37
+ done
38
+
39
+ if [ -z "$PROMPT" ]; then echo "Error: --prompt is required" >&2; exit 1; fi
40
+
41
+ # Auto-upload local file if provided
42
+ if [ -n "$IMAGE_FILE" ]; then
43
+ echo "Uploading $(basename "$IMAGE_FILE")..." >&2
44
+ IMAGE_URL=$(bash "$(dirname "$0")/../media/upload.sh" --file "$IMAGE_FILE")
45
+ fi
46
+
47
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url or --file is required" >&2; exit 1; fi
48
+
49
+ ARGS=(--model "$MODEL" --image "$IMAGE_URL" --aspect-ratio "$ASPECT_RATIO" --num-images "$NUM_IMAGES")
50
+ [ "$JSON_ONLY" = true ] && ARGS+=(--output-json)
51
+ [ -n "$JQ_EXPR" ] && ARGS+=(--jq "$JQ_EXPR")
52
+ [ "$ASYNC" = true ] && ARGS+=(--no-wait) || ARGS+=(--wait)
53
+
54
+ muapi image edit "$PROMPT" "${ARGS[@]}"
@@ -0,0 +1,191 @@
1
+ #!/bin/bash
2
+ # muapi.ai Image Enhancement (one-click operations)
3
+ # Usage: ./enhance-image.sh --op upscale --image-url URL
4
+
5
+ set -e
6
+
7
+ MUAPI_BASE="https://api.muapi.ai/api/v1"
8
+
9
+ OP=""
10
+ IMAGE_URL=""
11
+ IMAGE_FILE=""
12
+ FACE_URL=""
13
+ FACE_FILE=""
14
+ MASK_URL=""
15
+ MASK_FILE=""
16
+ PROMPT=""
17
+ ASYNC=false
18
+ JSON_ONLY=false
19
+ MAX_WAIT=300
20
+ POLL_INTERVAL=3
21
+
22
+ for arg in "$@"; do
23
+ if [ "$arg" = "--add-key" ]; then
24
+ shift
25
+ KEY_VALUE=""
26
+ if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
27
+ if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
28
+ if [ -n "$KEY_VALUE" ]; then
29
+ grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
30
+ mv .env.tmp .env 2>/dev/null || true
31
+ echo "MUAPI_KEY=$KEY_VALUE" >> .env
32
+ echo "MUAPI_KEY saved to .env" >&2
33
+ fi
34
+ exit 0
35
+ fi
36
+ done
37
+
38
+ if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
39
+
40
+ while [[ $# -gt 0 ]]; do
41
+ case $1 in
42
+ --op) OP="$2"; shift 2 ;;
43
+ --image-url) IMAGE_URL="$2"; shift 2 ;;
44
+ --file) IMAGE_FILE="$2"; shift 2 ;;
45
+ --face-url) FACE_URL="$2"; shift 2 ;;
46
+ --face-file) FACE_FILE="$2"; shift 2 ;;
47
+ --mask-url) MASK_URL="$2"; shift 2 ;;
48
+ --mask-file) MASK_FILE="$2"; shift 2 ;;
49
+ --prompt|-p) PROMPT="$2"; shift 2 ;;
50
+ --async) ASYNC=true; shift ;;
51
+ --timeout) MAX_WAIT="$2"; shift 2 ;;
52
+ --json) JSON_ONLY=true; shift ;;
53
+ --help|-h)
54
+ echo "muapi.ai Image Enhancement" >&2
55
+ echo "" >&2
56
+ echo "Usage: ./enhance-image.sh --op OPERATION --image-url URL" >&2
57
+ echo "" >&2
58
+ echo "Operations (--op):" >&2
59
+ echo " upscale Upscale image resolution" >&2
60
+ echo " background-remove Remove image background" >&2
61
+ echo " face-swap Swap face (requires --face-url)" >&2
62
+ echo " skin-enhance Smooth and enhance skin" >&2
63
+ echo " colorize Colorize black & white photo" >&2
64
+ echo " ghibli Studio Ghibli art style" >&2
65
+ echo " anime Anime style (optional --prompt)" >&2
66
+ echo " extend Extend/outpaint image" >&2
67
+ echo " product-shot Clean product shot background" >&2
68
+ echo " product-photo Professional product photography (requires --prompt)" >&2
69
+ echo " object-erase Erase object (requires --mask-url or --mask-file index)" >&2
70
+ echo "" >&2
71
+ echo "File Inputs:" >&2
72
+ echo " --file Main image file" >&2
73
+ echo " --face-file Face image for swap" >&2
74
+ echo " --mask-file Mask image for erase" >&2
75
+ exit 0 ;;
76
+ *) shift ;;
77
+ esac
78
+ done
79
+
80
+ if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
81
+ if [ -z "$OP" ]; then echo "Error: --op is required" >&2; exit 1; fi
82
+
83
+ HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
84
+
85
+ # Auto-upload local files
86
+ upload_file() {
87
+ local FPATH="$1"
88
+ if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
89
+ [ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
90
+ local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
91
+ local URL=$(echo "$RESP" | jq -r '.url // empty')
92
+ if [ -z "$URL" ]; then
93
+ local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
94
+ echo "Error: $ERR" >&2; exit 1
95
+ fi
96
+ echo "$URL"
97
+ }
98
+
99
+ if [ -n "$IMAGE_FILE" ]; then IMAGE_URL=$(upload_file "$IMAGE_FILE"); fi
100
+ if [ -n "$FACE_FILE" ]; then FACE_URL=$(upload_file "$FACE_FILE"); fi
101
+ if [ -n "$MASK_FILE" ]; then MASK_URL=$(upload_file "$MASK_FILE"); fi
102
+
103
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url or --file is required" >&2; exit 1; fi
104
+ IMAGE_URL_CLEAN=$(echo "$IMAGE_URL" | tr -d '"')
105
+
106
+ # Map operation to endpoint and payload
107
+ PROMPT_JSON=$(echo "${PROMPT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
108
+
109
+ case $OP in
110
+ upscale)
111
+ ENDPOINT="ai-image-upscale"
112
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
113
+ background-remove)
114
+ ENDPOINT="ai-background-remover"
115
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
116
+ face-swap)
117
+ if [ -z "$FACE_URL" ]; then echo "Error: --face-url is required for face-swap" >&2; exit 1; fi
118
+ FACE_CLEAN=$(echo "$FACE_URL" | tr -d '"')
119
+ ENDPOINT="ai-image-face-swap"
120
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"face_image_url\": \"$FACE_CLEAN\"}" ;;
121
+ skin-enhance)
122
+ ENDPOINT="ai-skin-enhancer"
123
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
124
+ colorize)
125
+ ENDPOINT="ai-color-photo"
126
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
127
+ ghibli)
128
+ ENDPOINT="ai-ghibli-style"
129
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
130
+ anime)
131
+ ENDPOINT="ai-anime-generator"
132
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"prompt\": $PROMPT_JSON}" ;;
133
+ extend)
134
+ ENDPOINT="ai-image-extension"
135
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
136
+ product-shot)
137
+ ENDPOINT="ai-product-shot"
138
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
139
+ product-photo)
140
+ ENDPOINT="ai-product-photography"
141
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"prompt\": $PROMPT_JSON}" ;;
142
+ object-erase)
143
+ if [ -z "$MASK_URL" ]; then echo "Error: --mask-url is required for object-erase" >&2; exit 1; fi
144
+ MASK_CLEAN=$(echo "$MASK_URL" | tr -d '"')
145
+ ENDPOINT="ai-object-eraser"
146
+ PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"mask_url\": \"$MASK_CLEAN\"}" ;;
147
+ *)
148
+ echo "Error: Unknown operation '$OP'" >&2
149
+ echo "Valid: upscale, background-remove, face-swap, skin-enhance, colorize," >&2
150
+ echo " ghibli, anime, extend, product-shot, product-photo, object-erase" >&2
151
+ exit 1 ;;
152
+ esac
153
+
154
+ [ "$JSON_ONLY" = false ] && echo "Submitting $OP to $ENDPOINT..." >&2
155
+
156
+ SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
157
+
158
+ if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
159
+ ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
160
+ [ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
161
+ echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
162
+ fi
163
+
164
+ REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
165
+ if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
166
+ [ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
167
+
168
+ if [ "$ASYNC" = true ]; then
169
+ [ "$JSON_ONLY" = false ] && echo "Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
170
+ echo "$SUBMIT"; exit 0
171
+ fi
172
+
173
+ [ "$JSON_ONLY" = false ] && echo "Processing..." >&2
174
+ ELAPSED=0; LAST_STATUS=""
175
+ while [ $ELAPSED -lt $MAX_WAIT ]; do
176
+ sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
177
+ RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
178
+ STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
179
+ if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS" >&2; LAST_STATUS="$STATUS"; fi
180
+ case $STATUS in
181
+ completed)
182
+ [ "$JSON_ONLY" = false ] && echo "Done!" >&2
183
+ URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.\(png\|jpg\|jpeg\|webp\)"' | head -1 | tr -d '"')
184
+ [ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Image URL: $URL" >&2
185
+ echo "$RESULT"; exit 0 ;;
186
+ failed)
187
+ ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
188
+ echo "Error: ${ERR:-Enhancement failed}" >&2; echo "$RESULT"; exit 1 ;;
189
+ esac
190
+ done
191
+ echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
@@ -0,0 +1,144 @@
1
+ #!/bin/bash
2
+ # muapi.ai Lipsync
3
+ # Usage: ./lipsync.sh --video-url URL --audio-url URL [--model sync]
4
+
5
+ set -e
6
+
7
+ MUAPI_BASE="https://api.muapi.ai/api/v1"
8
+
9
+ VIDEO_URL=""
10
+ VIDEO_FILE=""
11
+ AUDIO_URL=""
12
+ AUDIO_FILE=""
13
+ MODEL="sync"
14
+ ASYNC=false
15
+ JSON_ONLY=false
16
+ MAX_WAIT=300
17
+ POLL_INTERVAL=5
18
+
19
+ for arg in "$@"; do
20
+ if [ "$arg" = "--add-key" ]; then
21
+ shift
22
+ KEY_VALUE=""
23
+ if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
24
+ if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
25
+ if [ -n "$KEY_VALUE" ]; then
26
+ grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
27
+ mv .env.tmp .env 2>/dev/null || true
28
+ echo "MUAPI_KEY=$KEY_VALUE" >> .env
29
+ echo "MUAPI_KEY saved to .env" >&2
30
+ fi
31
+ exit 0
32
+ fi
33
+ done
34
+
35
+ if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
36
+
37
+ while [[ $# -gt 0 ]]; do
38
+ case $1 in
39
+ --video-url) VIDEO_URL="$2"; shift 2 ;;
40
+ --video-file) VIDEO_FILE="$2"; shift 2 ;;
41
+ --audio-url) AUDIO_URL="$2"; shift 2 ;;
42
+ --audio-file) AUDIO_FILE="$2"; shift 2 ;;
43
+ --model|-m) MODEL="$2"; shift 2 ;;
44
+ --async) ASYNC=true; shift ;;
45
+ --timeout) MAX_WAIT="$2"; shift 2 ;;
46
+ --json) JSON_ONLY=true; shift ;;
47
+ --help|-h)
48
+ echo "muapi.ai Lipsync" >&2
49
+ echo "" >&2
50
+ echo "Usage: ./lipsync.sh --video-url URL --audio-url URL [options]" >&2
51
+ echo "" >&2
52
+ echo "Models (--model):" >&2
53
+ echo " sync Sync Labs — high quality (default)" >&2
54
+ echo " latent LatentSync — open source" >&2
55
+ echo " creatify Creatify — fast" >&2
56
+ echo " veed Veed — reliable" >&2
57
+ echo "" >&2
58
+ echo "File Inputs:" >&2
59
+ echo " --video-file Local video file" >&2
60
+ echo " --audio-file Local audio file" >&2
61
+ exit 0 ;;
62
+ *) shift ;;
63
+ esac
64
+ done
65
+
66
+ if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
67
+
68
+ # Auto-upload local files
69
+ upload_file() {
70
+ local FPATH="$1"
71
+ if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
72
+ [ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
73
+ local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
74
+ local URL=$(echo "$RESP" | jq -r '.url // empty')
75
+ if [ -z "$URL" ]; then
76
+ local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
77
+ echo "Error: $ERR" >&2; exit 1
78
+ fi
79
+ echo "$URL"
80
+ }
81
+
82
+ if [ -n "$VIDEO_FILE" ]; then VIDEO_URL=$(upload_file "$VIDEO_FILE"); fi
83
+ if [ -n "$AUDIO_FILE" ]; then AUDIO_URL=$(upload_file "$AUDIO_FILE"); fi
84
+
85
+ if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url or --video-file is required" >&2; exit 1; fi
86
+ if [ -z "$AUDIO_URL" ]; then echo "Error: --audio-url or --audio-file is required" >&2; exit 1; fi
87
+
88
+ HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
89
+
90
+ VIDEO_CLEAN=$(echo "$VIDEO_URL" | tr -d '"')
91
+ AUDIO_CLEAN=$(echo "$AUDIO_URL" | tr -d '"')
92
+
93
+ case $MODEL in
94
+ sync) ENDPOINT="sync-lipsync" ;;
95
+ latent) ENDPOINT="latentsync-video" ;;
96
+ creatify) ENDPOINT="creatify-lipsync" ;;
97
+ veed) ENDPOINT="veed-lipsync" ;;
98
+ *)
99
+ echo "Error: Unknown model '$MODEL'" >&2
100
+ echo "Valid: sync, latent, creatify, veed" >&2
101
+ exit 1 ;;
102
+ esac
103
+
104
+ PAYLOAD="{\"video_url\": \"$VIDEO_CLEAN\", \"audio_url\": \"$AUDIO_CLEAN\"}"
105
+
106
+ [ "$JSON_ONLY" = false ] && echo "Submitting lipsync (model: $MODEL)..." >&2
107
+
108
+ SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
109
+
110
+ if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
111
+ ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
112
+ [ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
113
+ echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
114
+ fi
115
+
116
+ REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
117
+ if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
118
+ [ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
119
+
120
+ if [ "$ASYNC" = true ]; then
121
+ [ "$JSON_ONLY" = false ] && echo "Lipsync takes 30–120s. Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
122
+ echo "$SUBMIT"; exit 0
123
+ fi
124
+
125
+ [ "$JSON_ONLY" = false ] && echo "Processing lipsync (30–120s)..." >&2
126
+ ELAPSED=0; LAST_STATUS=""
127
+ while [ $ELAPSED -lt $MAX_WAIT ]; do
128
+ sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
129
+ RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
130
+ STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
131
+ if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS (${ELAPSED}s)" >&2; LAST_STATUS="$STATUS"; fi
132
+ case $STATUS in
133
+ completed)
134
+ [ "$JSON_ONLY" = false ] && echo "" >&2
135
+ [ "$JSON_ONLY" = false ] && echo "Lipsync complete!" >&2
136
+ URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.mp4"' | head -1 | tr -d '"')
137
+ [ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Video URL: $URL" >&2
138
+ echo "$RESULT"; exit 0 ;;
139
+ failed)
140
+ ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
141
+ echo "Error: ${ERR:-Lipsync failed}" >&2; echo "$RESULT"; exit 1 ;;
142
+ esac
143
+ done
144
+ echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
@@ -0,0 +1,193 @@
1
+ #!/bin/bash
2
+ # muapi.ai Video Effects
3
+ # Usage: ./video-effects.sh --op face-swap --video-url URL --face-url URL
4
+
5
+ set -e
6
+
7
+ MUAPI_BASE="https://api.muapi.ai/api/v1"
8
+
9
+ OP=""
10
+ VIDEO_URL=""
11
+ VIDEO_FILE=""
12
+ IMAGE_URL=""
13
+ IMAGE_FILE=""
14
+ FACE_URL=""
15
+ FACE_FILE=""
16
+ AUDIO_URL=""
17
+ AUDIO_FILE=""
18
+ PROMPT=""
19
+ EFFECT=""
20
+ ASYNC=false
21
+ JSON_ONLY=false
22
+ MAX_WAIT=300
23
+ POLL_INTERVAL=5
24
+
25
+ for arg in "$@"; do
26
+ if [ "$arg" = "--add-key" ]; then
27
+ shift
28
+ KEY_VALUE=""
29
+ if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
30
+ if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
31
+ if [ -n "$KEY_VALUE" ]; then
32
+ grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
33
+ mv .env.tmp .env 2>/dev/null || true
34
+ echo "MUAPI_KEY=$KEY_VALUE" >> .env
35
+ echo "MUAPI_KEY saved to .env" >&2
36
+ fi
37
+ exit 0
38
+ fi
39
+ done
40
+
41
+ if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
42
+
43
+ while [[ $# -gt 0 ]]; do
44
+ case $1 in
45
+ --op) OP="$2"; shift 2 ;;
46
+ --video-url) VIDEO_URL="$2"; shift 2 ;;
47
+ --video-file) VIDEO_FILE="$2"; shift 2 ;;
48
+ --image-url) IMAGE_URL="$2"; shift 2 ;;
49
+ --image-file) IMAGE_FILE="$2"; shift 2 ;;
50
+ --face-url) FACE_URL="$2"; shift 2 ;;
51
+ --face-file) FACE_FILE="$2"; shift 2 ;;
52
+ --audio-url) AUDIO_URL="$2"; shift 2 ;;
53
+ --audio-file) AUDIO_FILE="$2"; shift 2 ;;
54
+ --prompt|-p) PROMPT="$2"; shift 2 ;;
55
+ --effect) EFFECT="$2"; shift 2 ;;
56
+ --async) ASYNC=true; shift ;;
57
+ --timeout) MAX_WAIT="$2"; shift 2 ;;
58
+ --json) JSON_ONLY=true; shift ;;
59
+ --help|-h)
60
+ echo "muapi.ai Video Effects" >&2
61
+ echo "" >&2
62
+ echo "Operations (--op):" >&2
63
+ echo " wan-effects Wan AI effects on image (--image-url, --prompt)" >&2
64
+ echo " video-effect Named effect on video (--video-url, --effect)" >&2
65
+ echo " image-effect Named effect on image (--image-url, --effect)" >&2
66
+ echo " dance Dance animation (--image-url, --audio-url)" >&2
67
+ echo " face-swap Face swap in video (--video-url, --face-url)" >&2
68
+ echo " dress-change Change outfit (--image-url, --prompt)" >&2
69
+ echo " luma-modify Modify video with prompt (--video-url, --prompt)" >&2
70
+ echo " luma-reframe Reframe video (--video-url, --prompt)" >&2
71
+ echo " vidu-reference Vidu character reference (--image-url, --prompt)" >&2
72
+ echo "" >&2
73
+ echo "File Inputs:" >&2
74
+ echo " --video-file Local video file" >&2
75
+ echo " --image-file Local image file" >&2
76
+ echo " --face-file Local face image file" >&2
77
+ echo " --audio-file Local audio file" >&2
78
+ exit 0 ;;
79
+ *) shift ;;
80
+ esac
81
+ done
82
+
83
+ if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
84
+ if [ -z "$OP" ]; then echo "Error: --op is required" >&2; exit 1; fi
85
+
86
+ HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
87
+ PROMPT_JSON=$(echo "${PROMPT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
88
+ EFFECT_JSON=$(echo "${EFFECT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
89
+
90
+ clean_url() { echo "$1" | tr -d '"'; }
91
+
92
+ # Auto-upload local files
93
+ upload_file() {
94
+ local FPATH="$1"
95
+ if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
96
+ [ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
97
+ local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
98
+ local URL=$(echo "$RESP" | jq -r '.url // empty')
99
+ if [ -z "$URL" ]; then
100
+ local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
101
+ echo "Error: $ERR" >&2; exit 1
102
+ fi
103
+ echo "$URL"
104
+ }
105
+
106
+ if [ -n "$VIDEO_FILE" ]; then VIDEO_URL=$(upload_file "$VIDEO_FILE"); fi
107
+ if [ -n "$IMAGE_FILE" ]; then IMAGE_URL=$(upload_file "$IMAGE_FILE"); fi
108
+ if [ -n "$FACE_FILE" ]; then FACE_URL=$(upload_file "$FACE_FILE"); fi
109
+ if [ -n "$AUDIO_FILE" ]; then AUDIO_URL=$(upload_file "$AUDIO_FILE"); fi
110
+
111
+ case $OP in
112
+ wan-effects)
113
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
114
+ ENDPOINT="generate_wan_ai_effects"
115
+ PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
116
+ video-effect)
117
+ if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
118
+ ENDPOINT="video-effects"
119
+ PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"effect\": $EFFECT_JSON}" ;;
120
+ image-effect)
121
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
122
+ ENDPOINT="image-effects"
123
+ PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"effect\": $EFFECT_JSON}" ;;
124
+ dance)
125
+ if [ -z "$IMAGE_URL" ] || [ -z "$AUDIO_URL" ]; then
126
+ echo "Error: --image-url and --audio-url are required for dance" >&2; exit 1
127
+ fi
128
+ ENDPOINT="ai-dance-effects"
129
+ PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"audio_url\": \"$(clean_url "$AUDIO_URL")\"}" ;;
130
+ face-swap)
131
+ if [ -z "$VIDEO_URL" ] || [ -z "$FACE_URL" ]; then
132
+ echo "Error: --video-url and --face-url are required for face-swap" >&2; exit 1
133
+ fi
134
+ ENDPOINT="ai-video-face-swap"
135
+ PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"face_image_url\": \"$(clean_url "$FACE_URL")\"}" ;;
136
+ dress-change)
137
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
138
+ ENDPOINT="ai-dress-change"
139
+ PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
140
+ luma-modify)
141
+ if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
142
+ ENDPOINT="luma-modify-video"
143
+ PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"prompt\": $PROMPT_JSON}" ;;
144
+ luma-reframe)
145
+ if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
146
+ ENDPOINT="luma-flash-reframe"
147
+ PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"prompt\": $PROMPT_JSON}" ;;
148
+ vidu-reference)
149
+ if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
150
+ ENDPOINT="vidu-q1-reference"
151
+ PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
152
+ *)
153
+ echo "Error: Unknown operation '$OP'" >&2; exit 1 ;;
154
+ esac
155
+
156
+ [ "$JSON_ONLY" = false ] && echo "Submitting $OP to $ENDPOINT..." >&2
157
+
158
+ SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
159
+
160
+ if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
161
+ ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
162
+ [ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
163
+ echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
164
+ fi
165
+
166
+ REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
167
+ if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
168
+ [ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
169
+
170
+ if [ "$ASYNC" = true ]; then
171
+ [ "$JSON_ONLY" = false ] && echo "Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
172
+ echo "$SUBMIT"; exit 0
173
+ fi
174
+
175
+ [ "$JSON_ONLY" = false ] && echo "Processing..." >&2
176
+ ELAPSED=0; LAST_STATUS=""
177
+ while [ $ELAPSED -lt $MAX_WAIT ]; do
178
+ sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
179
+ RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
180
+ STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
181
+ if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS (${ELAPSED}s)" >&2; LAST_STATUS="$STATUS"; fi
182
+ case $STATUS in
183
+ completed)
184
+ [ "$JSON_ONLY" = false ] && echo "Done!" >&2
185
+ URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.\(mp4\|gif\|png\|jpg\)"' | head -1 | tr -d '"')
186
+ [ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Result URL: $URL" >&2
187
+ echo "$RESULT"; exit 0 ;;
188
+ failed)
189
+ ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
190
+ echo "Error: ${ERR:-Operation failed}" >&2; echo "$RESULT"; exit 1 ;;
191
+ esac
192
+ done
193
+ echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: muapi-media-generation
3
+ version: 0.1.0
4
+ description: Generate AI images, videos, music, and audio from the terminal via muapi.ai — supports 100+ models including Flux, Midjourney v7, Kling 3.0, Veo3, and Suno V5
5
+ ---
6
+
7
+ # 🎨 MuAPI Media Generation
8
+
9
+ **Schema-driven generation primitives for images, videos, and audio.**
10
+
11
+ Generate professional-grade media directly from the terminal using 100+ state-of-the-art AI models. All scripts are powered by `schema_data.json` for dynamic model and endpoint resolution.
12
+
13
+ ## Available Scripts
14
+
15
+ | Script | Description | Default Model |
16
+ | :--- | :--- | :--- |
17
+ | `generate-image.sh` | Text-to-image generation | `flux-dev` |
18
+ | `generate-video.sh` | Text-to-video generation | `minimax-pro` |
19
+ | `image-to-video.sh` | Animate a static image into video | `kling-pro` |
20
+ | `create-music.sh` | Music creation, remix, extend, text/video-to-audio | Suno V5 |
21
+ | `upload.sh` | Upload local files to CDN for use with other skills | — |
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ # Generate an image
27
+ bash generate-image.sh --prompt "a sunset over mountains" --model flux-dev --view
28
+
29
+ # Generate a video
30
+ bash generate-video.sh --prompt "ocean waves at golden hour" --model minimax-pro --view
31
+
32
+ # Animate an image
33
+ bash image-to-video.sh --image-url "https://..." --prompt "camera slowly pans right" --model kling-pro
34
+
35
+ # Create music
36
+ bash create-music.sh --style "lo-fi hip hop" --prompt "chill beats for studying"
37
+
38
+ # Upload a local file
39
+ bash upload.sh --file ./my-image.jpg
40
+ ```
41
+
42
+ ## Common Flags
43
+
44
+ All scripts support: `--async`, `--view`, `--json`, `--timeout N`, `--help`
45
+
46
+ ## Requirements
47
+
48
+ - `MUAPI_KEY` environment variable (set via `core/platform/setup.sh`)
49
+ - `curl`, `jq`, `python3`