hermoso 0.1.397 → 0.1.400

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Hermoso — MCP, CLI & Skills
1
+ # Hermoso: MCP, CLI & Skills
2
2
 
3
- Run your whole marketing operation from **any AI agent**: Claude Code, Claude.ai, Cursor, Codex, or your own
3
+ **Marketing on autopilot**, run from **any AI agent**: Claude Code, Claude.ai, Cursor, Codex, or your own
4
4
  scripts. Research the ads already winning in a market, generate finished image & video ads (your real product
5
5
  composited in, copy + CTA included), publish them to your own social channels, and build & manage the ad
6
6
  campaigns behind them, all over [MCP](https://modelcontextprotocol.io) tools, a CLI, or installable Claude skills.
@@ -8,6 +8,10 @@ campaigns behind them, all over [MCP](https://modelcontextprotocol.io) tools, a
8
8
  **906 tools.** `tools/list` is always the authoritative set; `hermoso_capabilities` (free) returns the live model
9
9
  catalog with exact per-render credit costs plus the full capability map.
10
10
 
11
+ **A Chrome extension too.** [Hermoso: save and clone ads](https://chromewebstore.google.com/detail/hermoso-save-and-clone-ad/kmknkbldeilchhblbfddfnfbadmgcklc)
12
+ saves any ad to your swipefile in one click, clones it for your brand, and pulls any company's ads from its
13
+ website.
14
+
11
15
  **Most of it costs nothing.** Publishing and scheduling posts, building and managing paid campaigns, analytics
12
16
  and insights, comments and DMs, connectors, profiles and team seats are **free on every plan**, with no
13
17
  per-post or per-channel fee and no seat pricing. Credits are spent only on running an AI model (image, video,
@@ -19,8 +23,8 @@ charges per API request.
19
23
  Pinterest Ads, Snapchat Ads, Microsoft Advertising, Apple Search Ads, ChatGPT Ads and AppLovin Ads, plus
20
24
  product feeds in Google Merchant Center. Publishing and scheduling — **ten** channels: Facebook, Instagram,
21
25
  Threads, TikTok, YouTube, X, LinkedIn, Pinterest, Bluesky and Telegram. Messaging: WhatsApp (you message a
22
- person, so it is not an eleventh publishing channel) and Instagram DM automations (a keyword comment, a DM, a
23
- story reply or an ig.me link gets an automatic private reply). Ad research: the Meta, Google and LinkedIn ad libraries plus organic TikTok,
26
+ person, so it is not an eleventh publishing channel) and DM automations on Instagram, Facebook Pages and
27
+ Messenger, and X (a keyword comment, a DM, a story reply or an ig.me / m.me link gets an automatic reply). Ad research: the Meta, Google and LinkedIn ad libraries plus organic TikTok,
24
28
  Instagram, YouTube, Threads and Reddit. Analytics: Google Analytics 4, Google Search Console and every
25
29
  connected platform's own post and campaign insights. Files: Google Drive, Sheets, Docs and OneDrive.
26
30
 
@@ -254,9 +258,18 @@ take** with native synchronized audio. `hermoso_capabilities` is the live list
254
258
  exact credit cost of every tier — and naming that model in `model` is how you get it, since an unnamed render is
255
259
  routed by a narrower auto-pool.
256
260
 
261
+ **Ads Studio** (`make_static_ads`): pick products and a count and get a batch of finished static ads in one call,
262
+ each a different selling angle and a different layout, with your real product photo and logo laid on. The product
263
+ catalog it draws from (`list_products`, `add_product`, `refresh_products`, `update_product`, `remove_product`) is a
264
+ cache of each product's live page, so names, photos and prices come from the page itself.
265
+
266
+ **Swap a person into any video** (`recast_hook`, `recast_motion`): keep the scene, the cuts and the sound and change
267
+ who is on screen, using your own photo, a saved creator or an AI person (in the web Studio you can describe a presenter in words).
268
+ Real faces from your own photos need a paid plan; AI people work on every plan.
269
+
257
270
  **Raw model playground** — the full catalog (30+ image / video / voice / writing models, each with its exact
258
271
  per-render credit cost) with no ad framing: `generate_image` / `generate_video` with `useBrand:false`,
259
- `generate_voice`, `generate_text`.
272
+ `generate_voice`, `generate_text`. The image default is Nano Banana 2.1.
260
273
 
261
274
  **Publish to your own channels** — **ten** of them: Facebook, Instagram and Threads (`post_to_meta`), TikTok
262
275
  (`post_to_tiktok`), YouTube (`post_to_youtube` + `update_youtube_video`, `youtube_video_insights`, comments
@@ -297,6 +310,12 @@ DMed you, and a DM saying STOP opts that person out. Facebook is free like Insta
297
310
  automation is charged in credits for every mention, reply or DM X delivers plus each reply or DM sent, and running out
298
311
  of credits stops its X rules.
299
312
 
313
+ **Autopilot posting** (`set_post_refill`, `get_post_refill`, `run_post_refill`): say how often, where and what
314
+ about ("2 posts a day on Instagram and Bluesky about our slow-morning routine, let me review first") and Hermoso
315
+ makes new posts from your brand and fills your calendar. Pick review first (each batch waits for your approval,
316
+ edit or redo) or post automatically (straight onto the schedule, still pullable). It follows the notes you leave and
317
+ writes from what has worked on each channel. Credits are used only when a post is made.
318
+
300
319
  **Run the ads** — full campaign trees, built paused and read back before anything is reported, with every spend
301
320
  change confirm-gated, on **twelve** platforms: **Meta**, **Google Ads**, **LinkedIn Ads**, **Reddit Ads**,
302
321
  **Pinterest Ads**, **Microsoft Advertising**, **ChatGPT Ads** (OpenAI's Advertiser API), **X Ads**, **TikTok Ads**,
package/mcp/tools.mjs CHANGED
@@ -21186,7 +21186,7 @@ function memoryNoteVerdict(text) {
21186
21186
 
21187
21187
  server.registerTool('recast_motion', {
21188
21188
  title: 'Recast motion',
21189
- description: "Motion transfer: re-perform a clip's motion, camera and timing with YOUR character, product, clothes or place; the clip's sound is kept. image (+ images, named @Image1, @Image2… in prompt) supply who and what. engine auto (default): a person clip recast with photos of people -> h3 (H3 Max Recast: ≤4 photos, one per person, 5-30s, no shot over 15s, keeps the set, light, cuts and every beat); otherwise seedance (Seedance 2.5, ≤9 pictures, 4-30s, keeps the set and every beat; a person clip needs it to be our render or faceRoute, else wan ≤15s / kling). kling = Kling Motion Control (ONE picture, its background becomes the set, 3-30s); wan = Wan 3.0 Prime (≤9 pictures, keeps the set, ≤15s). Billed per output second; ~5 min for 5s; dryRun quotes it.",
21189
+ description: "Motion transfer: re-perform a clip's motion, camera and timing with YOUR character, product, clothes or place; sound kept. image (+ images, @Image1, @Image2… in prompt) = who and what. engine auto (default), a person clip recast with people: one photo (talking, dance or full-body) or an AI person made from words, ≤15s -> wan (on the beat, keeps set and framing, follows every blink and mouth shape); several photos (one per person) or >15s -> h3 (H3 Max Recast: ≤4 photos, one per person, 5-30s, no shot over 15s, keeps set, light, cuts; engine h3 picks it by name); otherwise seedance (Seedance 2.5, ≤9 pictures, 4-30s, keeps set and beats; a person clip only if our render or faceRoute, else wan/kling). kling = Kling Motion Control (ONE picture, its background becomes the set, 3-30s); wan = Wan 3.0 Prime (≤9 pictures, keeps the set, ≤15s). Billed per output second, ~5 min per 5s; dryRun quotes.",
21190
21190
  inputSchema: {
21191
21191
  image: z.string().optional().describe('who performs it: the actor/character image URL (@Image1). Required on kling. No one yet: generate_image a portrait of an AI person from words (no reference photo) and pass its url, or a saved / preset creator’s portrait (list_creators). ' + LIKENESS_TERMS),
21192
21192
  images: z.array(z.string()).max(8).optional().describe('seedance/wan: more pictures, @Image2…: a character, product, outfit or place'),
@@ -21196,14 +21196,19 @@ function memoryNoteVerdict(text) {
21196
21196
  resolution: z.enum(['480p', '720p', '1080p']).optional().describe('seedance and wan default 1080p; h3 takes 720p or 1080p, default the clip’s own'),
21197
21197
  orientation: z.enum(['video', 'image']).optional().describe("kling only: which aspect to keep: the video's (default) or the image's"),
21198
21198
  faceRoute: z.enum(['face_lane']).optional().describe(FACE_ROUTE_CLIP_DESC),
21199
+ dryRun: z.boolean().optional().describe('return the credits this exact job would hold and the engine auto picks, without rendering'),
21199
21200
  tier: z.enum(['pro', 'standard']).optional().describe("kling only: 'pro' (default): 1080p and real hand-object interaction. 'standard': about 25% fewer credits and faster, but 720p, and it tends to mime a held object with empty hands. hermoso_capabilities lists the exact credits for both"),
21200
21201
  },
21201
21202
  outputSchema: { ...JOB_OUT },
21202
21203
  annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
21203
- }, wrap(async ({ image, images, video, prompt = '', engine, resolution, orientation = 'video', tier, faceRoute }) => {
21204
+ }, wrap(async ({ image, images, video, prompt = '', engine, resolution, orientation = 'video', tier, faceRoute, dryRun }) => {
21204
21205
  const more = Array.isArray(images) ? (await Promise.all(images.slice(0, 8).map(toRef))).filter(Boolean) : [];
21205
21206
  if (!image && !more.length && !String(prompt || '').trim()) return { content: [{ type: 'text', text: 'Pass image (who performs it), images, or a prompt saying who or what performs the clip.' }], isError: true };
21206
- const r = await renderJob('motion', { ...(image ? { image: await toRef(image) } : {}), ...(more.length ? { images: more } : {}), video, prompt, orientation, engine: engine || 'auto', ...(resolution ? { resolution } : {}), ...(tier ? { tier } : {}), ...(faceRoute === 'face_lane' ? { faceRoute } : {}) }, 'Motion recast');
21207
+ const _in = { ...(image ? { image: await toRef(image) } : {}), ...(more.length ? { images: more } : {}), video, prompt, orientation, engine: engine || 'auto', ...(resolution ? { resolution } : {}), ...(tier ? { tier } : {}), ...(faceRoute === 'face_lane' ? { faceRoute } : {}) };
21208
+ // dryRun (2026-10-06): the description has promised "dryRun quotes" while the schema had no such field, so zod dropped
21209
+ // it and an agent asking for a price got a PAID render. Now a quote: the worker's own hold, nothing queued.
21210
+ if (dryRun) { const q = await quoteJob('motion', _in); return ok(`${quoteText(q, 'This motion recast')}${q?.label ? ` Engine: ${String(q.label).replace(/^Motion transfer · /, '')}.` : ''}`, { raw: q }); }
21211
+ const r = await renderJob('motion', _in, 'Motion recast');
21207
21212
  const p = renderPayload(r) || {};
21208
21213
  return okVideo(`Recast video: ${r.url}${r.model ? ` (${r.model})` : ''}${p.note ? `\n${p.note}` : ''}`, r);
21209
21214
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hermoso",
3
- "version": "0.1.397",
3
+ "version": "0.1.400",
4
4
  "mcpName": "io.github.hermoso-ai/hermoso",
5
5
  "description": "Marketing on autopilot, run from your own AI agent. 906 tools. Publishing, scheduling, ad campaign management, comments, DMs and analytics cost no credits on every plan; credits are only for generating creative and for Ad Spy research. AD PLATFORMS: Meta, Google Ads, TikTok Ads, LinkedIn Ads, Reddit Ads, X Ads, Pinterest Ads, Snapchat Ads, Microsoft Advertising, Apple Search Ads, ChatGPT Ads and AppLovin Ads, plus product feeds in Google Merchant Center. PUBLISHING AND SCHEDULING: Facebook, Instagram, Threads, TikTok, YouTube, X, LinkedIn, Pinterest, Bluesky and Telegram. INSTAGRAM DM AUTOMATIONS: a keyword comment, a DM, a story reply or an ig.me link gets an automatic private reply from the brand. AD RESEARCH: the Meta, Google and LinkedIn ad libraries plus organic TikTok, Instagram, YouTube, Threads and Reddit. ANALYTICS: Google Analytics 4, Google Search Console and every connected platform's own post and campaign insights. Also brand onboarding, 50+ image and video generation models, ad scoring, competitor teardowns, Google Drive and OneDrive, a CLI and installable Claude skills.",
6
6
  "type": "module",