hermoso 0.1.529 → 0.1.531

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
@@ -67,7 +67,7 @@ Ask in your own words. The agent picks the tools:
67
67
  - "Compare last week's Google Ads and Meta Ads results and tell me what to pause."
68
68
  - "Schedule this video to TikTok, Instagram Reels and YouTube Shorts for Tuesday at 9am."
69
69
 
70
- **1182 tools.** `tools/list` is always the authoritative set; `hermoso_capabilities` (free) returns the live model
70
+ **1198 tools.** `tools/list` is always the authoritative set; `hermoso_capabilities` (free) returns the live model
71
71
  catalog with exact per-render credit costs plus the full capability map.
72
72
 
73
73
  **No markup on models** on Starter, Pro and Studio. Stop overpaying markups on AI models. Plans: [hermoso.ai/pricing](https://hermoso.ai/pricing).
@@ -78,7 +78,7 @@ website.
78
78
 
79
79
  **Most of it costs nothing.** Publishing and scheduling posts, building and managing paid campaigns, analytics
80
80
  and insights, comments and DMs, connectors, profiles and team seats cost **no credits on any plan**, with no
81
- per-post fee and no seat pricing. The Free plan includes 10 posts a month on up to 3 platforms; every paid plan posts without a limit and runs autopilot. Basic ($9.99 a month) is unlimited posting and Autopilot with no monthly credits: it includes the same 250+ free credits as the Free plan, monthly credits start on Starter, and Autopilot spends credits. Credits are spent only on running an AI model (image, video,
81
+ per-post fee and no seat pricing. The Free plan includes 5 posts a month on up to 3 platforms; every paid plan posts without a limit and runs autopilot. Basic ($19.99 a month) is unlimited posting and Autopilot with no monthly credits: it includes the same 160 free credits as the Free plan, and monthly credits start on Starter. Credits are spent only on running an AI model (image, video,
82
82
  voice, text, planning, post-production) and on Ad Spy research, and posting an ad you already rendered is never a
83
83
  second charge. The one exception is X (Twitter), where posting and reads bill credits per call because X
84
84
  charges per API request (`hermoso_credits` prints the exact credits per X post).
@@ -102,8 +102,8 @@ just download it. Use the one piece you need, or all of it together.
102
102
  ## Install in one command
103
103
 
104
104
  This repo is a plugin marketplace, a Gemini CLI extension and a skills package at once, so a coding agent takes
105
- Hermoso in one line. Every install brings the same five skills (`hermoso-research`, `hermoso-generate`,
106
- `hermoso-ad-from-brand`, `hermoso-product-photoshoot`, `hermoso-marketing`), and the skills drive the `hermoso`
105
+ Hermoso in one line. Every install brings the same six skills (`hermoso-research`, `hermoso-generate`,
106
+ `hermoso-ad-from-brand`, `hermoso-product-photoshoot`, `hermoso-marketing`, `hermoso-edit-timeline`), and the skills drive the `hermoso`
107
107
  CLI through `npx`. No
108
108
  tool list is loaded into your session: a CLI command costs nothing until it runs, and it reaches every tool.
109
109
  The first time, your agent runs `npx -y hermoso auth login`, which opens a browser to sign in.
@@ -252,7 +252,7 @@ Connect, approve with your Hermoso account, and you are done: the full toolset w
252
252
  1. **Get an account** at [app.hermoso.ai](https://app.hermoso.ai). The free tier is included; plans and credits
253
253
  are the same ones the web Studio uses. Or skip the browser entirely and let your agent sign itself up on a paid
254
254
  plan with `POST /v1/signup` (above).
255
- 2. **Install the plugin.** It adds the five Hermoso skills, which drive the `hermoso` CLI through `npx`:
255
+ 2. **Install the plugin.** It adds the six Hermoso skills, which drive the `hermoso` CLI through `npx`:
256
256
 
257
257
  ```bash
258
258
  claude plugin marketplace add hermoso-ai/hermoso && claude plugin install hermoso@hermoso
@@ -276,7 +276,7 @@ your browser (`--no-browser` prints the link on a headless machine). Measured ag
276
276
 
277
277
  Your agent now has the full studio **with your profile's context**: the brand details, products, logos and
278
278
  learned memory you set up in the web app apply automatically (`get_brand` shows what's saved; omit `brand` in
279
- `plan_ad`/`plan_variations` to use it). Renders bill your Hermoso credits, at the same prices as the Studio. Only AI model runs and Ad Spy research spend credits; publishing, scheduling, ads management and analytics cost no credits on any plan (posting to X and reading X data are the one per-call exception, managing X ads is free). The Free plan includes 10 posts a month on up to 3 platforms; every paid plan posts without a limit and runs autopilot. Basic ($9.99 a month) is unlimited posting and Autopilot with no monthly credits: it includes the same 250+ free credits as the Free plan, monthly credits start on Starter, and Autopilot spends credits.
279
+ `plan_ad`/`plan_variations` to use it). Renders bill your Hermoso credits, at the same prices as the Studio. Only AI model runs and Ad Spy research spend credits; publishing, scheduling, ads management and analytics cost no credits on any plan (posting to X and reading X data are the one per-call exception, managing X ads is free). The Free plan includes 5 posts a month on up to 3 platforms; every paid plan posts without a limit and runs autopilot. Basic ($19.99 a month) is unlimited posting and Autopilot with no monthly credits: it includes the same 160 free credits as the Free plan, and monthly credits start on Starter.
280
280
 
281
281
  ## 1. MCP server (stdio), optional in a coding agent
282
282
 
@@ -304,7 +304,7 @@ block entirely if you signed in above; it is there for CI, where the process can
304
304
 
305
305
  Then ask your agent: *“Generate an image ad with Hermoso.”*
306
306
 
307
- ### What the 1182 tools cover
307
+ ### What the 1198 tools cover
308
308
 
309
309
  **Ad spy / research** — `find_competitors`, `competitor_teardown`, `pull_competitor_ads`, `research_ads`; the
310
310
  Meta / Google / LinkedIn ad libraries (`search_meta_ads`, `search_google_ads`, `search_linkedin_ads`); organic
@@ -480,7 +480,7 @@ the package, so they need no key, no network and no sign-in.
480
480
 
481
481
  ## 3. Skills: what a coding agent installs
482
482
 
483
- `skills/` holds five installable skills:
483
+ `skills/` holds six installable skills:
484
484
 
485
485
  | Skill | What it does |
486
486
  | --- | --- |
@@ -489,6 +489,7 @@ the package, so they need no key, no network and no sign-in.
489
489
  | `hermoso-ad-from-brand` | A brand or domain to one on-brand ad, concept and copy included |
490
490
  | `hermoso-product-photoshoot` | A real product photo composited into studio, lifestyle or hero scenes |
491
491
  | `hermoso-marketing` | The whole loop: research, create, publish and schedule, paid campaigns, measure |
492
+ | `hermoso-edit-timeline` | The manual for composing any video edit or transition with `edit_timeline` |
492
493
 
493
494
  They are what every one-command install at the top of this page adds, in Claude Code, Codex, Gemini CLI and
494
495
  through `npx skills add`. From a clone, copying works too:
@@ -24,12 +24,12 @@ export const CHATGPT_ROSTER_FAMILIES = Object.freeze([
24
24
  'bluesky', // publishing
25
25
  'openai_ads', // big-platform ads
26
26
  'reddit_ads', // long tail
27
- 'mixpanel', // analytics
28
27
  ]);
29
28
  // Left out to stay under the cap, in rank order (the first one is the next to get in when room appears).
30
29
  export const CHATGPT_ROSTER_LEFT_OUT = Object.freeze([
31
30
  'x_ads', // long tail
32
31
  'bing_webmaster', // analytics
32
+ 'mixpanel', // analytics
33
33
  'apple_ads', // long tail
34
34
  'pinterest_ads', // long tail
35
35
  'discord', // publishing
package/mcp/client.mjs CHANGED
@@ -460,7 +460,10 @@ export async function connectedProviders() {
460
460
  const shopifyStore = r?.shopifyStore === true ? true : r?.shopifyStore === false ? false : null;
461
461
  // flagsOn (2026-11-03): tools that ship dark and are switched ON on this server (roster-scope.mjs FLAGGED_OFF_TOOLS).
462
462
  const flagsOn = new Set((Array.isArray(r?.flagsOn) ? r.flagsOn : []).filter((n) => typeof n === 'string' && n));
463
- return { connected: new Set(list.filter((p) => typeof p === 'string' && p)), readOk: true, offered, gated, connectLink, withheld, flagsOn, shopifyStore };
463
+ // brand (2026-11-08): which brand this connection resolved to, so a "not connected" refusal can name it and the
464
+ // switch. Absent on an older server or a session login; never invented.
465
+ const brand = r?.brand && typeof r.brand === 'object' && typeof r.brand.profileId === 'string' ? { profileId: r.brand.profileId, name: typeof r.brand.name === 'string' ? r.brand.name : null, shared: !!r.brand.shared, source: String(r.brand.source || '') } : null;
466
+ return { connected: new Set(list.filter((p) => typeof p === 'string' && p)), readOk: true, offered, gated, connectLink, withheld, flagsOn, shopifyStore, brand };
464
467
  } catch { return { connected: new Set(), readOk: false }; }
465
468
  }
466
469
  // Upload raw file BYTES to /api/upload (150MB, persists → returns {url,kind,bytes}). Overrides the JSON content-type so
@@ -161,10 +161,10 @@ export const CREDITS_LOW_NOTE = `The Hermoso account's credit balance is too low
161
161
  const UPSELL_SENTENCE_RE = /\s*(?:please\s+)?(?:upgrade(?:\s+your\s+plan)?\s+or\s+top\s+up|top\s+up|add\s+credits|buy\s+(?:more\s+)?credits|monthly\s+plans\s+have\s+no\s+markup\s+on\s+models)\b[^.!\n]*[.!]?/gi; // the monthly-plan upsell (2026-10-20) is a promotion too: a widget host (ChatGPT) never hears it
162
162
  // ── FREE CREDITS NOT CLAIMED YET (2026-10-25, ChatGPT funnel) ─────────────────────────────────────────────────────
163
163
  // An account whose welcome credits were never added (the one-time check that a person is behind it did not pass
164
- // silently at sign-in) reads 0 credits. Its fix is opening the app once, signed in, which is not a purchase, so it is
164
+ // silently at sign-in) reads 0 credits. Its fix is opening a one-click link once (2026-11-10: signed for the account, no sign-in), which is not a purchase, so it is
165
165
  // said on every host, ChatGPT included. The server marks the refusal (meta.welcomeClaim = {credits, url}).
166
- export const welcomeClaimSentence = (w) => `This account has not received its ${Number(w?.credits) || 0} free credits yet. The user opens ${w?.url} once in a browser, signed in with the same account, and they arrive in a few seconds after a quick check that a person is there (no card).`;
167
- export const welcomeClaimHint = (w) => ({ do: `ask the user to open ${w?.url} once in a browser, signed in with the same account, to receive the ${Number(w?.credits) || 0} free credits; then run the same call again`, why: 'the account never received its free credits: they wait behind a one-time check that a person is behind the account, which runs in the browser' });
166
+ export const welcomeClaimSentence = (w) => `This account has not received its ${Number(w?.credits) || 0} free credits yet. The user opens ${w?.url} once in a browser (one click, no sign-in and no card) and they arrive in a few seconds after a quick check that a person is there.`;
167
+ export const welcomeClaimHint = (w) => ({ do: `ask the user to open ${w?.url} once in a browser (one click, no sign-in) to receive the ${Number(w?.credits) || 0} free credits; then run the same call again`, why: 'the account never received its free credits: they wait behind a one-time check that a person is behind the account, which runs in the browser' });
168
168
  export function neutralCreditsText(msg) {
169
169
  const base = String(msg ?? '').replace(UPSELL_SENTENCE_RE, '').replace(/[ \t]+$/gm, '').replace(/\s*[—–,:-]\s*$/gm, '.').trim();
170
170
  return `${base}${base ? '\n' : ''}${CREDITS_LOW_NOTE}`;