start-vibing-stacks 2.29.0 → 2.31.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.
- package/dist/setup.js +16 -1
- package/package.json +1 -1
- package/stacks/_shared/ads-agents/README.md +452 -0
- package/stacks/_shared/ads-agents/RESEARCH-REPORT.md +157 -0
- package/stacks/_shared/ads-agents/SKILL.md +210 -0
- package/stacks/_shared/ads-agents/SKILLS-UPDATE-REPORT.md +255 -0
- package/stacks/_shared/ads-agents/agents/audit-budget.md +116 -0
- package/stacks/_shared/ads-agents/agents/audit-compliance.md +131 -0
- package/stacks/_shared/ads-agents/agents/audit-creative.md +127 -0
- package/stacks/_shared/ads-agents/agents/audit-google.md +113 -0
- package/stacks/_shared/ads-agents/agents/audit-meta.md +112 -0
- package/stacks/_shared/ads-agents/agents/audit-tracking.md +134 -0
- package/stacks/_shared/ads-agents/agents/copy-writer.md +188 -0
- package/stacks/_shared/ads-agents/agents/creative-strategist.md +199 -0
- package/stacks/_shared/ads-agents/agents/format-adapter.md +175 -0
- package/stacks/_shared/ads-agents/agents/visual-designer.md +245 -0
- package/stacks/_shared/ads-agents/references/additional-platforms.md +106 -0
- package/stacks/_shared/ads-agents/references/benchmarks.md +257 -0
- package/stacks/_shared/ads-agents/references/bidding-strategies.md +333 -0
- package/stacks/_shared/ads-agents/references/brand-dna-template.md +190 -0
- package/stacks/_shared/ads-agents/references/budget-allocation.md +150 -0
- package/stacks/_shared/ads-agents/references/competitive-intelligence-rules.md +48 -0
- package/stacks/_shared/ads-agents/references/compliance.md +280 -0
- package/stacks/_shared/ads-agents/references/conversion-tracking.md +246 -0
- package/stacks/_shared/ads-agents/references/copy-frameworks.md +187 -0
- package/stacks/_shared/ads-agents/references/funnel-content-copy-rules.md +44 -0
- package/stacks/_shared/ads-agents/references/gaql-notes.md +49 -0
- package/stacks/_shared/ads-agents/references/google-audit.md +217 -0
- package/stacks/_shared/ads-agents/references/google-creative-specs.md +119 -0
- package/stacks/_shared/ads-agents/references/image-providers.md +133 -0
- package/stacks/_shared/ads-agents/references/linkedin-audit.md +141 -0
- package/stacks/_shared/ads-agents/references/linkedin-creative-specs.md +129 -0
- package/stacks/_shared/ads-agents/references/mcp-integration.md +125 -0
- package/stacks/_shared/ads-agents/references/meta-audit.md +141 -0
- package/stacks/_shared/ads-agents/references/meta-creative-specs.md +134 -0
- package/stacks/_shared/ads-agents/references/microsoft-audit.md +158 -0
- package/stacks/_shared/ads-agents/references/microsoft-creative-specs.md +123 -0
- package/stacks/_shared/ads-agents/references/platform-specs.md +276 -0
- package/stacks/_shared/ads-agents/references/scoring-system.md +169 -0
- package/stacks/_shared/ads-agents/references/tiktok-audit.md +165 -0
- package/stacks/_shared/ads-agents/references/tiktok-creative-specs.md +139 -0
- package/stacks/_shared/ads-agents/references/voice-to-style.md +87 -0
- package/stacks/_shared/ads-agents/references/youtube-creative-specs.md +134 -0
- package/stacks/_shared/ads-agents/skills/ads-apple/SKILL.md +225 -0
- package/stacks/_shared/ads-agents/skills/ads-audit/SKILL.md +108 -0
- package/stacks/_shared/ads-agents/skills/ads-budget/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-competitor/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-create/SKILL.md +198 -0
- package/stacks/_shared/ads-agents/skills/ads-creative/SKILL.md +208 -0
- package/stacks/_shared/ads-agents/skills/ads-dna/SKILL.md +245 -0
- package/stacks/_shared/ads-agents/skills/ads-generate/SKILL.md +173 -0
- package/stacks/_shared/ads-agents/skills/ads-google/SKILL.md +192 -0
- package/stacks/_shared/ads-agents/skills/ads-landing/SKILL.md +186 -0
- package/stacks/_shared/ads-agents/skills/ads-linkedin/SKILL.md +200 -0
- package/stacks/_shared/ads-agents/skills/ads-math/SKILL.md +216 -0
- package/stacks/_shared/ads-agents/skills/ads-meta/SKILL.md +167 -0
- package/stacks/_shared/ads-agents/skills/ads-microsoft/SKILL.md +163 -0
- package/stacks/_shared/ads-agents/skills/ads-photoshoot/SKILL.md +220 -0
- package/stacks/_shared/ads-agents/skills/ads-plan/SKILL.md +176 -0
- package/stacks/_shared/ads-agents/skills/ads-test/SKILL.md +199 -0
- package/stacks/_shared/ads-agents/skills/ads-tiktok/SKILL.md +190 -0
- package/stacks/_shared/ads-agents/skills/ads-youtube/SKILL.md +199 -0
- package/stacks/_shared/hooks/pre-tool-use.ts +10 -3
- package/stacks/_shared/hooks/stop-validator.ts +10 -4
- package/stacks/_shared/memories/competitive-intelligence-research.md +115 -0
- package/stacks/_shared/memories/funnel-content-copy.md +81 -0
- package/templates/CLAUDE-python.md +6 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ads-dna
|
|
3
|
+
version: 1.5.0
|
|
4
|
+
description: "Brand DNA extractor for paid advertising. Scans a website URL to extract visual identity, tone of voice, color palette, typography, and imagery style. Outputs brand-profile.json to the current directory. Run before /ads create or /ads generate for brand-consistent creative. Triggers on: brand DNA, brand profile, extract brand, brand identity, brand colors, what is the brand voice, analyze brand, brand style guide."
|
|
5
|
+
user-invokable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ads DNA: Brand DNA Extractor
|
|
9
|
+
|
|
10
|
+
Extracts brand identity from a website and saves it as `brand-profile.json`
|
|
11
|
+
for use by `/ads create`, `/ads generate`, and `/ads photoshoot`.
|
|
12
|
+
|
|
13
|
+
## Quick Reference
|
|
14
|
+
|
|
15
|
+
| Command | What it does |
|
|
16
|
+
|---------|-------------|
|
|
17
|
+
| `/ads dna <url>` | Full brand extraction → `brand-profile.json` |
|
|
18
|
+
| `/ads dna https://acme.com --quick` | Fast extraction (homepage only) |
|
|
19
|
+
|
|
20
|
+
## Process
|
|
21
|
+
|
|
22
|
+
### Step 1: Collect URL
|
|
23
|
+
|
|
24
|
+
If the user hasn't provided a URL, ask:
|
|
25
|
+
> "What website URL should I analyze for brand DNA? (e.g. https://yoursite.com)"
|
|
26
|
+
|
|
27
|
+
### Step 2: Fetch Pages
|
|
28
|
+
|
|
29
|
+
Use the **WebFetch tool** to retrieve each page. For each URL, use this fetch prompt:
|
|
30
|
+
> "Return all visible text content, the full contents of any `<style>` blocks, inline
|
|
31
|
+
> `style=` attributes, `<meta>` tags, Google Fonts `@import` URLs, and any `og:image`
|
|
32
|
+
> values found on this page."
|
|
33
|
+
|
|
34
|
+
Fetch in this order:
|
|
35
|
+
1. **Homepage** (`<url>`)
|
|
36
|
+
2. **About page**: try `<url>/about`, then `<url>/about-us`, then `<url>/our-story`
|
|
37
|
+
3. **Product/Services page**: try `<url>/product`, then `<url>/products`, then `<url>/services`
|
|
38
|
+
|
|
39
|
+
**If `--quick` flag was provided**: fetch the homepage only; skip steps 2 and 3.
|
|
40
|
+
|
|
41
|
+
If a secondary page returns a 404 or redirect error, continue with fewer pages and note:
|
|
42
|
+
"Secondary pages unavailable; extraction based on homepage only. Confidence may be lower."
|
|
43
|
+
|
|
44
|
+
### Step 2b: Capture Brand Screenshots
|
|
45
|
+
|
|
46
|
+
After fetching pages, capture 3 screenshots for comprehensive brand anchoring.
|
|
47
|
+
These serve as visual style references during `/ads generate`; the same approach
|
|
48
|
+
Pomelli uses to anchor ad images to the actual brand aesthetic.
|
|
49
|
+
|
|
50
|
+
Capture the following:
|
|
51
|
+
|
|
52
|
+
1. **Homepage hero section** (above the fold):
|
|
53
|
+
```bash
|
|
54
|
+
python ads-agents/scripts/capture_screenshot.py [url]
|
|
55
|
+
```
|
|
56
|
+
Saves: `./brand-screenshots/{domain}_homepage.png`
|
|
57
|
+
|
|
58
|
+
2. **Product or services page**:
|
|
59
|
+
```bash
|
|
60
|
+
python ads-agents/scripts/capture_screenshot.py [url]/products
|
|
61
|
+
```
|
|
62
|
+
Saves: `./brand-screenshots/{domain}_product.png`
|
|
63
|
+
|
|
64
|
+
3. **About page** (brand personality):
|
|
65
|
+
```bash
|
|
66
|
+
python ads-agents/scripts/capture_screenshot.py [url]/about
|
|
67
|
+
```
|
|
68
|
+
Saves: `./brand-screenshots/{domain}_about.png`
|
|
69
|
+
|
|
70
|
+
If a page is not found or returns an error, skip it gracefully and continue
|
|
71
|
+
with the remaining pages.
|
|
72
|
+
|
|
73
|
+
**If `--quick` flag was provided**: skip screenshot capture entirely.
|
|
74
|
+
|
|
75
|
+
**If capture fails** (Playwright not installed, network error, JS-heavy SPA that times out):
|
|
76
|
+
- Log: `"Screenshot capture skipped; run: python3 -m playwright install chromium"`
|
|
77
|
+
- Continue without screenshots
|
|
78
|
+
- Do NOT set the `screenshots` field in brand-profile.json
|
|
79
|
+
|
|
80
|
+
### Step 3: Extract Brand Elements
|
|
81
|
+
|
|
82
|
+
From the fetched HTML, extract:
|
|
83
|
+
|
|
84
|
+
**Colors:**
|
|
85
|
+
- `og:image` meta tag → analyze dominant colors (note 2-3 prominent hex values)
|
|
86
|
+
- CSS `background-color` on `body`, `header`, `.hero`, `.btn-primary`
|
|
87
|
+
- CSS `color` on `h1`, `h2`, `.btn`
|
|
88
|
+
- CSS `border-color` or `background` on `.cta`, `.button`
|
|
89
|
+
- Identify: primary (most prominent brand color), secondary (supporting colors), background, text
|
|
90
|
+
|
|
91
|
+
**Typography:**
|
|
92
|
+
- `@import url(https://fonts.googleapis.com/...)` → extract font names from URL path
|
|
93
|
+
- CSS `font-family` on `h1`, `h2`, `body`, `.headline`
|
|
94
|
+
- If Google Fonts URL contains `family=Inter:wght@...`, heading_font = "Inter"
|
|
95
|
+
|
|
96
|
+
**Voice:**
|
|
97
|
+
Analyze hero headline, subheadline, About page intro, and CTA button text.
|
|
98
|
+
Score each axis 1-10 using these heuristics:
|
|
99
|
+
|
|
100
|
+
| Signal | Score direction |
|
|
101
|
+
|--------|----------------|
|
|
102
|
+
| Uses "you/your" frequently | formal_casual → casual (+2) |
|
|
103
|
+
| Uses technical jargon | expert_accessible → expert (-2) |
|
|
104
|
+
| Short punchy sentences (≤8 words) | bold_subtle → bold (+2) |
|
|
105
|
+
| Data/stats in hero | rational_emotional → rational (-2) |
|
|
106
|
+
| "Transform", "revolutionize", "disrupt" | traditional_innovative → innovative (+2) |
|
|
107
|
+
| Customer testimonials lead | rational_emotional → emotional (+2) |
|
|
108
|
+
| Industry awards, "trusted by X" | traditional_innovative → traditional (-1) |
|
|
109
|
+
|
|
110
|
+
### Confidence Scoring
|
|
111
|
+
Each voice axis gets a confidence rating based on signal count:
|
|
112
|
+
- **High** (3+ signals): strong evidence for axis position
|
|
113
|
+
- **Medium** (2 signals): moderate evidence, may need validation
|
|
114
|
+
- **Low** (1 signal): weak evidence, treat as estimate
|
|
115
|
+
|
|
116
|
+
Also extract structured data when available: schema.org markup, Open Graph tags (og:title, og:description, og:image), Twitter Card metadata.
|
|
117
|
+
|
|
118
|
+
**Imagery style** (from og:image and any visible hero image descriptions):
|
|
119
|
+
- Photography vs. illustration vs. flat design
|
|
120
|
+
- Subject matter (people, product, abstract, data)
|
|
121
|
+
- Composition style (clean/minimal vs. busy/editorial)
|
|
122
|
+
|
|
123
|
+
**Forbidden elements** (infer from brand positioning):
|
|
124
|
+
- Enterprise/B2B brands → add "cheesy stock photos", "consumer lifestyle imagery"
|
|
125
|
+
- Healthcare → add "unqualified medical claims", "before/after imagery"
|
|
126
|
+
- Finance → add "get rich quick imagery", "unrealistic wealth displays"
|
|
127
|
+
- Consumer brands → usually no forbidden elements
|
|
128
|
+
|
|
129
|
+
### Step 4: Build brand-profile.json
|
|
130
|
+
|
|
131
|
+
Read `ads-agents/references/brand-dna-template.md` for the exact schema.
|
|
132
|
+
|
|
133
|
+
Construct the JSON object following the schema precisely. Use `null` for any
|
|
134
|
+
field that cannot be confidently extracted; do not guess.
|
|
135
|
+
|
|
136
|
+
Example of a low-confidence field:
|
|
137
|
+
```json
|
|
138
|
+
"typography": {
|
|
139
|
+
"heading_font": null,
|
|
140
|
+
"body_font": "system-ui",
|
|
141
|
+
"pairing_descriptor": "system default (Google Fonts not detected)"
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Step 5: Write brand-profile.json
|
|
146
|
+
|
|
147
|
+
Write the JSON to `./brand-profile.json` in the current working directory
|
|
148
|
+
(where the user is running Claude Code).
|
|
149
|
+
|
|
150
|
+
If screenshots were captured successfully in Step 2b, include a `screenshots` field:
|
|
151
|
+
```json
|
|
152
|
+
"screenshots": {
|
|
153
|
+
"homepage": "./brand-screenshots/{domain}_homepage.png",
|
|
154
|
+
"product": "./brand-screenshots/{domain}_product.png",
|
|
155
|
+
"about": "./brand-screenshots/{domain}_about.png"
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
Include only the screenshots that were successfully captured. If a page was not
|
|
159
|
+
found or errored, omit that key. Omit the `screenshots` field entirely if Step 2b
|
|
160
|
+
was skipped or all captures failed.
|
|
161
|
+
|
|
162
|
+
### Step 6: Confirm and Summarize
|
|
163
|
+
|
|
164
|
+
Show the user:
|
|
165
|
+
```
|
|
166
|
+
✓ brand-profile.json saved to ./brand-profile.json
|
|
167
|
+
|
|
168
|
+
Brand DNA Summary:
|
|
169
|
+
Brand: [brand_name]
|
|
170
|
+
Voice: [descriptor 1], [descriptor 2], [descriptor 3]
|
|
171
|
+
Primary Color: [hex]
|
|
172
|
+
Typography: [heading_font] / [body_font]
|
|
173
|
+
Target: [age_range] [profession]
|
|
174
|
+
Screenshots: [N captured (homepage, product, about) in ./brand-screenshots/] OR [skipped]
|
|
175
|
+
|
|
176
|
+
Run `/ads create` to generate campaign concepts from this profile.
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Visual Designer Integration
|
|
180
|
+
|
|
181
|
+
The visual-designer agent uses the most relevant screenshot per concept as a style
|
|
182
|
+
reference when generating images via banana. For example, a product-focused concept
|
|
183
|
+
references the product page screenshot, while a brand awareness concept references
|
|
184
|
+
the homepage or about page screenshot.
|
|
185
|
+
|
|
186
|
+
## Limitations
|
|
187
|
+
|
|
188
|
+
- **Sparse content**: Sites with <200 words of body text produce lower-confidence profiles.
|
|
189
|
+
Note: "Low confidence extraction; limited content available for analysis."
|
|
190
|
+
- **Dynamic sites**: JavaScript-rendered content may not be captured. Playwright is not
|
|
191
|
+
used by default. If the site appears to be SPA/React with no static HTML, note this.
|
|
192
|
+
- **Multi-brand enterprises**: This tool creates one profile per URL. Run separately
|
|
193
|
+
for each brand/product line.
|
|
194
|
+
- **Dark mode sites**: If body background is #333 or darker, swap background/text values.
|
|
195
|
+
- **CSS-in-JS**: Modern React sites may not have extractable CSS. Use og:image colors as fallback.
|
|
196
|
+
|
|
197
|
+
## brand-profile.json Schema
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"schema_version": "1.0",
|
|
202
|
+
"brand_name": "string",
|
|
203
|
+
"website_url": "string",
|
|
204
|
+
"extracted_at": "ISO-8601",
|
|
205
|
+
"voice": {
|
|
206
|
+
"formal_casual": 1-10,
|
|
207
|
+
"rational_emotional": 1-10,
|
|
208
|
+
"playful_serious": 1-10,
|
|
209
|
+
"bold_subtle": 1-10,
|
|
210
|
+
"traditional_innovative": 1-10,
|
|
211
|
+
"expert_accessible": 1-10,
|
|
212
|
+
"descriptors": ["adjective1", "adjective2", "adjective3"]
|
|
213
|
+
},
|
|
214
|
+
"colors": {
|
|
215
|
+
"primary": "#hexcode or null",
|
|
216
|
+
"secondary": ["#hex1", "#hex2"],
|
|
217
|
+
"forbidden": ["#hex or color name"],
|
|
218
|
+
"background": "#hexcode",
|
|
219
|
+
"text": "#hexcode"
|
|
220
|
+
},
|
|
221
|
+
"typography": {
|
|
222
|
+
"heading_font": "Font Name or null",
|
|
223
|
+
"body_font": "Font Name or system-ui",
|
|
224
|
+
"pairing_descriptor": "brief description"
|
|
225
|
+
},
|
|
226
|
+
"imagery": {
|
|
227
|
+
"style": "professional photography | illustration | flat design | mixed",
|
|
228
|
+
"subjects": ["subject1", "subject2"],
|
|
229
|
+
"composition": "brief description",
|
|
230
|
+
"forbidden": ["element1", "element2"]
|
|
231
|
+
},
|
|
232
|
+
"aesthetic": {
|
|
233
|
+
"mood_keywords": ["keyword1", "keyword2", "keyword3"],
|
|
234
|
+
"texture": "minimal | textured | mixed",
|
|
235
|
+
"negative_space": "generous | moderate | dense"
|
|
236
|
+
},
|
|
237
|
+
"brand_values": ["value1", "value2", "value3"],
|
|
238
|
+
"target_audience": {
|
|
239
|
+
"age_range": "e.g. 25-45",
|
|
240
|
+
"profession": "brief description",
|
|
241
|
+
"pain_points": ["pain1", "pain2"],
|
|
242
|
+
"aspirations": ["aspiration1", "aspiration2"]
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ads-generate
|
|
3
|
+
version: 1.5.0
|
|
4
|
+
description: "AI image generation for paid ad creatives. Reads campaign-brief.md and brand-profile.json to produce platform-sized ad images using banana-claude. Requires banana-claude (v1.4.1+) with nanobanana-mcp configured. Triggers on: generate ads, create images, make ad creatives, generate visuals, create ad images, generate campaign images, make the images, generate from brief."
|
|
5
|
+
user-invokable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ads Generate: AI Ad Image Generator
|
|
9
|
+
|
|
10
|
+
Generates platform-sized ad creative images from your campaign brief and brand
|
|
11
|
+
profile. Uses banana-claude as the image generation provider.
|
|
12
|
+
|
|
13
|
+
## Quick Reference
|
|
14
|
+
|
|
15
|
+
| Command | What it does |
|
|
16
|
+
|---------|-------------|
|
|
17
|
+
| `/ads generate` | Generate all images from campaign-brief.md |
|
|
18
|
+
| `/ads generate --platform meta` | Generate Meta assets only |
|
|
19
|
+
| `/ads generate --prompt "text" --ratio 9:16` | Standalone generation without brief |
|
|
20
|
+
|
|
21
|
+
## Environment Setup
|
|
22
|
+
|
|
23
|
+
**Required before running:**
|
|
24
|
+
|
|
25
|
+
- Requires banana-claude (v1.4.1+) with nanobanana-mcp configured
|
|
26
|
+
- Run `/banana setup` to configure API key and MCP
|
|
27
|
+
- Fallback: if banana is not available, use `scripts/generate_image.py` (deprecated)
|
|
28
|
+
|
|
29
|
+
If banana-claude is not installed, this skill will display setup instructions
|
|
30
|
+
and stop. It will never fail silently.
|
|
31
|
+
|
|
32
|
+
If banana-claude is unavailable, alternatives include: OpenAI gpt-image-1 ($0.040/image), Stability SD 3.5 ($0.065), or Replicate FLUX.1 Pro ($0.055). Configure via ADS_IMAGE_PROVIDER env var.
|
|
33
|
+
|
|
34
|
+
## Process
|
|
35
|
+
|
|
36
|
+
### Step 1: Verify banana-claude
|
|
37
|
+
|
|
38
|
+
Verify banana-claude is installed (run `/banana setup` to check). If not installed,
|
|
39
|
+
display setup instructions and exit.
|
|
40
|
+
|
|
41
|
+
### Step 2: Locate Source Files
|
|
42
|
+
|
|
43
|
+
Check for:
|
|
44
|
+
- `campaign-brief.md` → primary source for prompts and dimensions
|
|
45
|
+
- `brand-profile.json` → brand color/style injection (optional but recommended)
|
|
46
|
+
|
|
47
|
+
**If campaign-brief.md is found**: Use `## Image Generation Briefs` section as the
|
|
48
|
+
generation job list.
|
|
49
|
+
|
|
50
|
+
**If no campaign-brief.md**: Enter standalone mode (Step 2b).
|
|
51
|
+
|
|
52
|
+
#### Step 2b: Standalone Mode
|
|
53
|
+
|
|
54
|
+
Ask the user:
|
|
55
|
+
1. Generation prompt (what should the image show?)
|
|
56
|
+
2. Target platform (to set correct dimensions)
|
|
57
|
+
3. Output filename (optional)
|
|
58
|
+
|
|
59
|
+
Then skip to Step 5.
|
|
60
|
+
|
|
61
|
+
### Step 3: Read Provider Config
|
|
62
|
+
|
|
63
|
+
Load `ads-agents/references/image-providers.md` to confirm:
|
|
64
|
+
- Active provider pricing (show user the cost estimate)
|
|
65
|
+
- Rate limits for current tier
|
|
66
|
+
- Batch API availability
|
|
67
|
+
|
|
68
|
+
### Step 4: Read Platform Specs
|
|
69
|
+
|
|
70
|
+
For each platform in the campaign brief, load the relevant spec reference:
|
|
71
|
+
- `ads-agents/references/meta-creative-specs.md`
|
|
72
|
+
- `ads-agents/references/google-creative-specs.md`
|
|
73
|
+
- `ads-agents/references/tiktok-creative-specs.md`
|
|
74
|
+
- `ads-agents/references/linkedin-creative-specs.md`
|
|
75
|
+
- `ads-agents/references/youtube-creative-specs.md`
|
|
76
|
+
- `ads-agents/references/microsoft-creative-specs.md`
|
|
77
|
+
|
|
78
|
+
### Step 5: Prepare banana Configuration
|
|
79
|
+
|
|
80
|
+
Create banana brand preset from brand-profile.json if one does not already exist
|
|
81
|
+
at `.banana/presets/{brand-slug}.json`.
|
|
82
|
+
|
|
83
|
+
Select banana domain mode based on campaign brief content:
|
|
84
|
+
- **Product**: e-commerce, packshots
|
|
85
|
+
- **Editorial**: brand awareness, lifestyle
|
|
86
|
+
- **Cinema**: video thumbnails, dramatic
|
|
87
|
+
- **UI/Web**: app install, SaaS
|
|
88
|
+
- **Portrait**: testimonials, people
|
|
89
|
+
|
|
90
|
+
### Step 6: Spawn Visual Designer Agent
|
|
91
|
+
|
|
92
|
+
Spawn the `visual-designer` agent using the Task tool with `context: fork`,
|
|
93
|
+
passing the selected domain mode and preset name.
|
|
94
|
+
|
|
95
|
+
The agent will:
|
|
96
|
+
- Parse the image generation briefs from campaign-brief.md
|
|
97
|
+
- Inject brand colors and mood from brand-profile.json
|
|
98
|
+
- Use banana-claude with the configured domain mode for each asset
|
|
99
|
+
- Save to `./ad-assets/[platform]/[concept]/` directory structure
|
|
100
|
+
- Write `generation-manifest.json`
|
|
101
|
+
|
|
102
|
+
### Step 7: Validate with Format Adapter
|
|
103
|
+
|
|
104
|
+
After the visual-designer completes, spawn the `format-adapter` agent
|
|
105
|
+
with `context: fork` to validate dimensions and report missing formats.
|
|
106
|
+
|
|
107
|
+
### Step 8: Quality Gate
|
|
108
|
+
|
|
109
|
+
Use Claude vision to assess each generated image against the brief (score 1 to 10
|
|
110
|
+
on brand alignment, composition, platform fit). If any image scores below 6,
|
|
111
|
+
regenerate once with an adjusted prompt.
|
|
112
|
+
|
|
113
|
+
Quality Gate Rubric:
|
|
114
|
+
- 9-10: Professional quality, brand-aligned, platform-optimized, no issues
|
|
115
|
+
- 7-8: Good quality, minor composition or brand alignment improvements possible
|
|
116
|
+
- 5-6: Acceptable but needs regeneration. Text readability issues, poor composition, or brand mismatch
|
|
117
|
+
- Below 5: Reject. Regenerate with adjusted prompt
|
|
118
|
+
|
|
119
|
+
### Step 9: Aggregate Costs
|
|
120
|
+
|
|
121
|
+
Read banana cost data from `.banana/costs.json` and include total creative spend
|
|
122
|
+
in generation-manifest.json.
|
|
123
|
+
|
|
124
|
+
### Step 10: Report Results
|
|
125
|
+
|
|
126
|
+
Present a summary:
|
|
127
|
+
```
|
|
128
|
+
Generation complete:
|
|
129
|
+
|
|
130
|
+
Generated assets:
|
|
131
|
+
✓ ./ad-assets/meta/concept-1/feed-1080x1350.png
|
|
132
|
+
✓ ./ad-assets/tiktok/concept-1/vertical-1080x1920.png
|
|
133
|
+
✗ ./ad-assets/google/concept-1/landscape-1200x628.png [error reason]
|
|
134
|
+
|
|
135
|
+
Format validation: See format-report.md
|
|
136
|
+
|
|
137
|
+
Cost: $[N] total creative spend (from .banana/costs.json)
|
|
138
|
+
|
|
139
|
+
Next steps:
|
|
140
|
+
1. Review assets in ./ad-assets/
|
|
141
|
+
2. Check format-report.md for any missing formats
|
|
142
|
+
3. Upload to your ad platform managers
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Cost Transparency
|
|
146
|
+
|
|
147
|
+
Before generating, estimate and show the cost:
|
|
148
|
+
- Count the number of image briefs in campaign-brief.md
|
|
149
|
+
- Show estimated cost based on banana pricing tiers
|
|
150
|
+
- If >$1.00, ask for confirmation before proceeding
|
|
151
|
+
|
|
152
|
+
## Standalone Mode (No campaign-brief.md)
|
|
153
|
+
|
|
154
|
+
When running without a campaign brief:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
Platform target → dimensions used:
|
|
158
|
+
meta-feed → 1080×1350 (4:5)
|
|
159
|
+
meta-reels → 1080×1920 (9:16)
|
|
160
|
+
tiktok → 1080×1920 (9:16)
|
|
161
|
+
google-pmax → 1200×628 (1.91:1)
|
|
162
|
+
linkedin → 1080×1080 (1:1)
|
|
163
|
+
youtube → 1280×720 (16:9)
|
|
164
|
+
youtube-short → 1080×1920 (9:16)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Use `/banana generate` directly with the specified prompt and aspect ratio.
|
|
168
|
+
|
|
169
|
+
## Reference Files
|
|
170
|
+
|
|
171
|
+
- `ads-agents/references/image-providers.md`: provider config, pricing, limits
|
|
172
|
+
- `ads-agents/references/[platform]-creative-specs.md`: per-platform specs
|
|
173
|
+
- `ads-agents/references/brand-dna-template.md`: brand injection schema
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ads-google
|
|
3
|
+
version: 1.6.0
|
|
4
|
+
description: "Google Ads deep analysis covering Search, Performance Max, Display, YouTube, and Demand Gen campaigns. Evaluates 80 checks across conversion tracking, wasted spend, account structure, keywords, ads, and settings. Use when user says Google Ads, Google PPC, search ads, PMax, Performance Max, or Google campaign."
|
|
5
|
+
user-invokable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- Updated: 2026-05-14 | v1.6: AI Max GA + DSA September 2026 auto-upgrade, 7% conversion lift verified (Google blog April 2026), full feature suite (search term matching + text customization + final URL expansion) required for full uplift -->
|
|
9
|
+
|
|
10
|
+
# Google Ads Deep Analysis
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
1. Collect Google Ads account data (export, Change History, Search Terms Report)
|
|
15
|
+
2. **Validate**: confirm data covers ≥30 days and includes Search Terms Report before proceeding
|
|
16
|
+
3. Read `ads-agents/references/google-audit.md` for full 80-check audit
|
|
17
|
+
4. Read `ads-agents/references/benchmarks.md` for Google-specific benchmarks
|
|
18
|
+
5. Read `ads-agents/references/scoring-system.md` for weighted scoring
|
|
19
|
+
6. Evaluate all applicable checks as PASS, WARNING, or FAIL
|
|
20
|
+
7. **Validate**: confirm all 80 checks evaluated before calculating score
|
|
21
|
+
8. Calculate Google Ads Health Score (0-100)
|
|
22
|
+
9. Generate findings report with action plan
|
|
23
|
+
|
|
24
|
+
## What to Analyze
|
|
25
|
+
|
|
26
|
+
### Conversion Tracking (25% weight)
|
|
27
|
+
- Google tag (gtag.js) installed and firing on all pages
|
|
28
|
+
- Enhanced Conversions active (hashed first-party data)
|
|
29
|
+
- Consent Mode v2 implemented (required for EU/EEA)
|
|
30
|
+
- Conversion actions mapped correctly (primary vs secondary)
|
|
31
|
+
- Offline conversion import configured (for lead gen)
|
|
32
|
+
- Server-side tagging via GTM (recommended for accuracy)
|
|
33
|
+
- Attribution model: data-driven preferred (last-click as fallback only)
|
|
34
|
+
- Conversion lag analysis (are conversions still trickling in?)
|
|
35
|
+
|
|
36
|
+
### Wasted Spend (20% weight)
|
|
37
|
+
- Search Terms Report reviewed (last 30 days minimum)
|
|
38
|
+
- Negative keyword coverage adequate (shared lists + campaign-level)
|
|
39
|
+
- Display placement audit (exclude low-quality sites)
|
|
40
|
+
- Invalid click rate within norms (<10%)
|
|
41
|
+
- Broad Match only used with Smart Bidding (NEVER without it)
|
|
42
|
+
- Brand/non-brand campaigns separated
|
|
43
|
+
- Geographic targeting precise (no wasted international spend)
|
|
44
|
+
|
|
45
|
+
**Negative Keyword Rules (critical: bad negatives kill campaigns):**
|
|
46
|
+
- NEVER suggest Broad Match negatives unless explicitly justified; they block too broadly
|
|
47
|
+
- Default to **Exact Match** `[keyword]` for specific irrelevant queries
|
|
48
|
+
- Use **Phrase Match** `"keyword"` for irrelevant intent patterns
|
|
49
|
+
- Source negatives from actual Search Terms Report irrelevant queries, NOT guesses
|
|
50
|
+
- Group into themed lists: Informational (how-to, DIY, what is), Job-seeker (jobs, careers, salary), Competitor (only if intentionally excluded), Free-intent (free, crack, torrent)
|
|
51
|
+
- Recommend **Shared Negative Lists** at the account level, not just campaign-level
|
|
52
|
+
- Review existing negatives for over-blocking (are any negatives accidentally blocking converting queries?)
|
|
53
|
+
|
|
54
|
+
### Account Structure (15% weight)
|
|
55
|
+
- Campaign-level organization follows business logic
|
|
56
|
+
- Ad groups themed tightly (15-20 keywords max per group)
|
|
57
|
+
- RSA ad groups have ≥3 active ads
|
|
58
|
+
- PMax campaigns structured correctly (asset groups, signals)
|
|
59
|
+
- SKAGs evaluated (migrate to themed groups if present)
|
|
60
|
+
- Campaign labels/naming conventions consistent
|
|
61
|
+
|
|
62
|
+
### Keywords (15% weight)
|
|
63
|
+
- Match type strategy appropriate (Exact → Phrase → Broad progression)
|
|
64
|
+
- Quality Score distribution (aim ≥7 average)
|
|
65
|
+
- Low QS keywords flagged (<5 = FAIL, 5-6 = WARNING)
|
|
66
|
+
- Keyword cannibalization check (same keywords in multiple campaigns)
|
|
67
|
+
- Impression share tracked for top keywords
|
|
68
|
+
- Keyword bid adjustments set for devices/locations/audiences
|
|
69
|
+
|
|
70
|
+
### Ads (15% weight)
|
|
71
|
+
- RSA: ≥8 unique headlines, ≥3 descriptions per ad group
|
|
72
|
+
- RSA: ad strength "Good" or "Excellent" (not "Poor" or "Average")
|
|
73
|
+
- Pin usage minimal and strategic (over-pinning reduces RSA flexibility)
|
|
74
|
+
- Ad extensions: sitelinks (≥4), callouts (≥4), structured snippets, image
|
|
75
|
+
- Dynamic keyword insertion used appropriately
|
|
76
|
+
- Ad copy includes CTA, value proposition, differentiators
|
|
77
|
+
|
|
78
|
+
### Settings (10% weight)
|
|
79
|
+
- ECPC (Enhanced CPC) flagged as deprecated. Migrate to full Smart Bidding (tCPA/tROAS/Maximize)
|
|
80
|
+
- Bid strategy appropriate for campaign maturity and goals
|
|
81
|
+
- Budget pacing: no campaigns limited by budget (unless intentional)
|
|
82
|
+
- Ad schedule aligned with business hours/conversion patterns
|
|
83
|
+
- Device bid adjustments set based on performance data
|
|
84
|
+
- Location targeting: "Presence" not "Presence or Interest"
|
|
85
|
+
- Network settings: Search Partners reviewed, Display opt-out for Search
|
|
86
|
+
|
|
87
|
+
## GAQL & Data Accuracy
|
|
88
|
+
|
|
89
|
+
Before analyzing data, read `ads-agents/references/gaql-notes.md` for known GAQL field incompatibilities,
|
|
90
|
+
deduplication patterns, and filter scope best practices. Key rules:
|
|
91
|
+
|
|
92
|
+
- Deduplicate keywords by `(ad_group_id + keyword_text + match_type)` before any analysis
|
|
93
|
+
- Only analyze ENABLED campaigns and ad groups (exclude paused/removed)
|
|
94
|
+
- Filter to keywords with impressions > 0 for theme coherence checks (G03)
|
|
95
|
+
- Apply legacy BMM heuristic: BROAD + Manual CPC = legacy BMM, not intentional broad (G17)
|
|
96
|
+
- Only flag wasted spend on terms with >$10 spend AND 0 conversions (G16)
|
|
97
|
+
- Count shared negative keyword lists alongside campaign-level negatives (G14/G15)
|
|
98
|
+
|
|
99
|
+
## Google Ads MCP Integration (Optional)
|
|
100
|
+
|
|
101
|
+
For automated data collection, connect the [Google Ads MCP server](https://github.com/googleads/google-ads-mcp):
|
|
102
|
+
|
|
103
|
+
- **Tools available**: `search` (GAQL queries), `list_accessible_customers`
|
|
104
|
+
- **Setup**: Configure in `.mcp.json` or Claude Code MCP settings
|
|
105
|
+
- **Customer ID**: Extract from CLAUDE.md under Accounts > Google Ads, or ask the user
|
|
106
|
+
- **Fallback**: If MCP is not configured, fall back to manual data export (the default workflow)
|
|
107
|
+
|
|
108
|
+
When MCP is available, use it to pull Search Terms Reports, keyword data, conversion actions,
|
|
109
|
+
and campaign structure automatically instead of requiring manual exports.
|
|
110
|
+
|
|
111
|
+
## PMax Deep Dive
|
|
112
|
+
|
|
113
|
+
If Performance Max campaigns exist, additionally evaluate:
|
|
114
|
+
- Asset group diversity (text, images, video, feeds)
|
|
115
|
+
- Audience signals configured (custom segments, lists, demographics)
|
|
116
|
+
- URL expansion settings reviewed (opt-out of irrelevant pages)
|
|
117
|
+
- Brand exclusions applied (prevent cannibalizing brand search), available for all advertisers
|
|
118
|
+
- Campaign-level negative keywords now available for ALL advertisers
|
|
119
|
+
- Search themes utilized (2024 feature)
|
|
120
|
+
- Final URL expansion: enabled or disabled with justification
|
|
121
|
+
- Insights tab reviewed (search categories, audience segments)
|
|
122
|
+
|
|
123
|
+
## AI Max for Search (2026 — out of beta)
|
|
124
|
+
|
|
125
|
+
AI Max moved out of beta in April 2026 and layers broad match + keywordless targeting
|
|
126
|
+
on existing Search campaigns. **7% average conversion lift** at similar CPA/ROAS when
|
|
127
|
+
the full feature suite is enabled (search term matching + text customization + final URL
|
|
128
|
+
expansion), per Google internal data April 2026.
|
|
129
|
+
|
|
130
|
+
**DSA upgrade timeline (CONFIRMED):**
|
|
131
|
+
- Voluntary upgrades available now (recommended; preserves manual control)
|
|
132
|
+
- **Auto-upgrades begin September 2026** for all eligible Search campaigns using:
|
|
133
|
+
- Dynamic Search Ads (DSA)
|
|
134
|
+
- Automatically created assets (ACA)
|
|
135
|
+
- Campaign-level broad match setting
|
|
136
|
+
- New DSA creation ends September 2026 (Ads UI, Editor, and API)
|
|
137
|
+
- All upgrades expected to conclude by end of September 2026
|
|
138
|
+
|
|
139
|
+
If AI Max for Search is available/active:
|
|
140
|
+
- Broad Match + AI Max integration evaluated
|
|
141
|
+
- All three AI Max features enabled for full uplift (search term matching, text customization, final URL expansion)
|
|
142
|
+
- Auto-generated headline performance monitored
|
|
143
|
+
- Brand controls, location controls, and text guidelines configured (the "advanced controls" that steer AI precision)
|
|
144
|
+
- Search term categories reviewed for relevance
|
|
145
|
+
- Budget impact assessed (AI Max can shift spend; broader reach)
|
|
146
|
+
- Negative keyword lists reviewed for completeness (AI Max casts wider net; strong negatives are mandatory)
|
|
147
|
+
- DSA campaigns: port historical settings now or wait for September 2026 auto-upgrade
|
|
148
|
+
|
|
149
|
+
## Demand Gen Campaigns
|
|
150
|
+
|
|
151
|
+
Replaced Video Action Campaigns (April 2026). Video + image = 20% more conversions.
|
|
152
|
+
Frequency capping NOT supported.
|
|
153
|
+
|
|
154
|
+
If Demand Gen campaigns exist, evaluate:
|
|
155
|
+
- Video + image asset mix present (combined format drives 20% more conversions)
|
|
156
|
+
- Audience signals configured (custom segments, lookalikes)
|
|
157
|
+
- Conversion tracking aligned with upper/mid-funnel goals
|
|
158
|
+
- Note: frequency capping is not available. Monitor reach vs frequency manually
|
|
159
|
+
|
|
160
|
+
## Key Thresholds
|
|
161
|
+
|
|
162
|
+
| Metric | Pass | Warning | Fail |
|
|
163
|
+
|--------|------|---------|------|
|
|
164
|
+
| Quality Score (avg) | ≥7 | 5-6 | <5 |
|
|
165
|
+
| CTR (Search) | ≥6.66% | 3-6.66% | <3% |
|
|
166
|
+
| CVR (Search) | ≥7.52% | 3-7.52% | <3% |
|
|
167
|
+
| CPC (Search) | ≤$5.26 | $5.26-8.00 | >$8.00 |
|
|
168
|
+
| Wasted Spend | <10% | 10-20% | >20% |
|
|
169
|
+
| Ad Strength | Good+ | Average | Poor |
|
|
170
|
+
| Invalid Clicks | <5% | 5-10% | >10% |
|
|
171
|
+
|
|
172
|
+
## Output
|
|
173
|
+
|
|
174
|
+
### Google Ads Health Score
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
Google Ads Health Score: XX/100 (Grade: X)
|
|
178
|
+
|
|
179
|
+
Conversion Tracking: XX/100 ████████░░ (25%)
|
|
180
|
+
Wasted Spend: XX/100 ██████████ (20%)
|
|
181
|
+
Account Structure: XX/100 ███████░░░ (15%)
|
|
182
|
+
Keywords: XX/100 █████░░░░░ (15%)
|
|
183
|
+
Ads: XX/100 ████████░░ (15%)
|
|
184
|
+
Settings: XX/100 ██████████ (10%)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Deliverables
|
|
188
|
+
- `GOOGLE-ADS-REPORT.md`: Full 80-check findings with pass/warning/fail
|
|
189
|
+
- Wasted spend estimate (monthly $ value)
|
|
190
|
+
- Quick Wins sorted by impact
|
|
191
|
+
- PMax-specific recommendations (if applicable)
|
|
192
|
+
- Keyword health matrix with QS, CTR, CVR per keyword group
|