gooseworks 0.3.14 → 0.3.16
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 +52 -2
- package/dist/auth/attribution.d.ts +14 -0
- package/dist/auth/attribution.d.ts.map +1 -0
- package/dist/auth/attribution.js +37 -0
- package/dist/auth/attribution.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +4 -4
- package/dist/auth/oauth-server.d.ts.map +1 -1
- package/dist/auth/oauth-server.js +8 -8
- package/dist/auth/oauth-server.js.map +1 -1
- package/dist/commands/call.d.ts.map +1 -1
- package/dist/commands/call.js +6 -5
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/install.js +1 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/log.d.ts +15 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +121 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +10 -4
- package/dist/commands/login.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +228 -143
- package/dist/skills/master-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/goose-ads/SKILL.md +106 -102
- package/skills/goose-product-photos/SKILL.md +105 -0
- package/skills/goose-video/SKILL.md +24 -1
- package/skills/gooseworks/SKILL.md +98 -40
|
@@ -26,12 +26,10 @@ function getMasterSkillContent() {
|
|
|
26
26
|
name: gooseworks
|
|
27
27
|
slug: gooseworks
|
|
28
28
|
description: >
|
|
29
|
-
GooseWorks
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
Reach for it when you need data at scale, sources behind auth, or a specific provider — not as
|
|
34
|
-
a replacement for your built-in web search/fetch on quick, one-off lookups.
|
|
29
|
+
GooseWorks growth coworker and specialist-skill router. Research brands, customers, competitors,
|
|
30
|
+
creators, markets, and prospects; analyze ads and performance; create ads, product photos,
|
|
31
|
+
graphics, and video; search and scrape public web and social data; find and enrich leads.
|
|
32
|
+
Use it as the single GooseWorks entry point for brand growth, B2B, sales, research, and GTM work.
|
|
35
33
|
category: general
|
|
36
34
|
version: 1.0.0
|
|
37
35
|
author: GooseWorks
|
|
@@ -40,7 +38,7 @@ tags: [gooseworks, data, scraping, search, reddit, twitter, linkedin, email, peo
|
|
|
40
38
|
|
|
41
39
|
# GooseWorks
|
|
42
40
|
|
|
43
|
-
You have access to GooseWorks —
|
|
41
|
+
You have access to GooseWorks — an AI coworker with specialist skills for research, analysis, creative work, lead generation, enrichment, and public web/social data. Use the right specialist when the request needs brand context, a managed creative workflow, data at scale, a source behind authentication, or a specific provider.
|
|
44
42
|
|
|
45
43
|
This skill is also the **parent router** for the GooseWorks family. Data/GTM work you handle here (see "How to Use"); specialized work you hand off to a dedicated \`goose-*\` skill.
|
|
46
44
|
|
|
@@ -53,6 +51,8 @@ Before anything else, check whether the request belongs to a specialized domain.
|
|
|
53
51
|
| Remix/make an ad, research a brand for ads, OR analyze ad performance — Meta/Google ad campaigns, creative fatigue, CAC/lead quality, competitor ad intel, ad angles & hooks | **\`goose-ads\`** | Installed locally as an entry skill. Just use it. If unavailable, run \`gooseworks install --claude\`. |
|
|
54
52
|
| Charts, infographics, slides, social graphics, branded visual designs from a style/format | **\`goose-graphics\`** | If installed locally, use it. Otherwise \`gooseworks fetch goose-graphics\` (or \`gooseworks install --claude --with goose-graphics\`). |
|
|
55
53
|
| Make a **video** ad — remix a video ad template (e.g. iMessage chat-reveal), or "make the video for project <id>" | **\`goose-video\`** | Installed locally as an entry skill. Just use it. If unavailable, run \`gooseworks install --claude\`. |
|
|
54
|
+
| Make **product photos** — studio, lifestyle, marketplace, social, or on-model product photography | **\`goose-product-photos\`** | Installed locally as an entry skill. Just use it. If unavailable, run \`gooseworks install --claude\`. |
|
|
55
|
+
| Animate an approved static ad or product image | **\`animate-image\`** | Fetch with \`gooseworks fetch animate-image\` and follow its GooseWorks MCP workflow. |
|
|
56
56
|
| Anything else — scraping, research, lead gen, enrichment, any data lookup | (stay here) | Follow "How to Use" below. |
|
|
57
57
|
|
|
58
58
|
Examples — all of these route to \`goose-ads\`, not the data flow: "remix this ad with project id 123", "make an ad for my product", "research my brand", "why is my Meta campaign underperforming", "which creatives should I cut".
|
|
@@ -61,58 +61,114 @@ Examples — all of these route to \`goose-ads\`, not the data flow: "remix this
|
|
|
61
61
|
|
|
62
62
|
All commands below auto-load credentials from \`~/.gooseworks/credentials.json\`. If a command exits with "Not logged in", tell the user to run: \`npx gooseworks login\`. To log out: \`npx gooseworks logout\`.
|
|
63
63
|
|
|
64
|
-
###
|
|
64
|
+
### Choose the available runtime — MCP first, then CLI
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
\`
|
|
66
|
+
Skills may describe a managed provider request as an environment-neutral operation with
|
|
67
|
+
\`provider\`, \`method\`, \`path\`, and optional \`query\` or \`body\`. Execute the operation through
|
|
68
|
+
the first available runtime:
|
|
69
|
+
|
|
70
|
+
1. If the matching GooseWorks MCP tool is registered, use it. For ScrapeCreators, pass the
|
|
71
|
+
operation directly to \`call_data_provider\`. This is the preferred path in ChatGPT, Cowork,
|
|
72
|
+
and other terminal-free clients. Do not shell out and do not ask for a separate provider key.
|
|
73
|
+
2. Otherwise, if a local terminal and the \`gooseworks\` CLI are available, translate the same
|
|
74
|
+
operation into \`gooseworks call <provider> <path>\` with its method, query, and body options.
|
|
75
|
+
3. Otherwise, follow the provider dependency's direct-key path only when the user has supplied
|
|
76
|
+
their own key. If no runtime is available, explain what connection is missing; never pretend
|
|
77
|
+
the provider call ran.
|
|
78
|
+
|
|
79
|
+
The same selection applies to catalog and account operations. When the CLI is unavailable but the
|
|
80
|
+
\`mcp__gooseworks__*\` tools are connected, use these equivalents:
|
|
68
81
|
- \`gooseworks search <q>\` → the **\`search_skills\`** MCP tool.
|
|
69
82
|
- \`gooseworks fetch <slug>\` → the **\`fetch_skill\`** MCP tool (same content/scripts/files/deps).
|
|
70
83
|
- \`gooseworks credits\` → the **\`get_ad_credits\`** MCP tool.
|
|
71
84
|
|
|
72
|
-
Discovery
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
Discovery, skill fetching, and ScrapeCreators-backed Brand Growth workflows work fully CLI-free
|
|
86
|
+
this way. Task skills own the endpoint and analysis workflow; this runtime rule owns how the same
|
|
87
|
+
provider operation is executed.
|
|
75
88
|
|
|
76
89
|
To check credit balance:
|
|
77
90
|
\`\`\`bash
|
|
78
91
|
gooseworks credits
|
|
79
92
|
\`\`\`
|
|
80
93
|
|
|
81
|
-
##
|
|
94
|
+
## Common company onboarding
|
|
95
|
+
|
|
96
|
+
Onboarding is voluntary and happens inside the current coding agent. Run it when the user explicitly says **\`/gooseworks onboard me\`**, or ask for one missing answer when it is necessary for the task in front of you. **Never force an existing user through onboarding after an update.**
|
|
97
|
+
|
|
98
|
+
The CLI and GooseWorks Ads share one brand-scoped questionnaire through these MCP tools:
|
|
99
|
+
|
|
100
|
+
- \`list_ad_brands\` and \`create_ad_brand\` — select or create the company/brand.
|
|
101
|
+
- \`get_brand_onboarding { brand_id }\` — load completed answers and \`missing_fields\` before asking anything.
|
|
102
|
+
- \`update_brand_onboarding { brand_id, ...answers }\` — save each group of answers and the final first-task choice.
|
|
103
|
+
|
|
104
|
+
If these tools are unavailable, tell the user that onboarding needs the GooseWorks MCP connection. Do not send them to another UI and do not fall back to a separate context record.
|
|
105
|
+
|
|
106
|
+
### Resume rules
|
|
107
|
+
|
|
108
|
+
1. Run \`list_ad_brands\`. If there are multiple brands, ask which one to use.
|
|
109
|
+
2. If there is no brand, ask for the company or brand website, research it, and use \`create_ad_brand { name, website_url }\`. If the domain matches an existing brand, reuse it.
|
|
110
|
+
3. Call \`get_brand_onboarding\` and ask only the returned missing questions.
|
|
111
|
+
4. Save after each small group so an interrupted interview can resume.
|
|
112
|
+
5. If the record is complete, confirm the brand and continue; do not repeat the interview.
|
|
82
113
|
|
|
83
|
-
|
|
114
|
+
### Shared questions and answer values
|
|
84
115
|
|
|
85
|
-
|
|
86
|
-
- \`update_user_context\` — save it (partial update; only the fields you pass are touched).
|
|
116
|
+
Use the host's native question controls. Keep the labels below; the values in backticks are the stable values accepted by \`update_brand_onboarding\`.
|
|
87
117
|
|
|
88
|
-
|
|
118
|
+
1. **What is your role?** Founder / Business Owner · C-Suite · VP / Director · Performance / Growth Marketing · Brand / Content Marketing · Creative / Design · Agency · Consultant / Freelancer · Other.
|
|
119
|
+
2. **How much do you spend on paid ads right now?** \`zero\` · \`under_10k\` · \`10k_30k\` · \`30k_100k\` · \`100k_plus\`.
|
|
120
|
+
3. **What are your goals?** Multi-select: create ads \`make_creatives\` · analyze ads \`analyze_ads\` · manage/optimize ads \`ai_manage\` · competitor or customer research \`research_competitors\` · creators and social trends \`creators_trends\` · content \`content_growth\` · lead generation \`lead_generation\` · data work \`data_work\` · work with an expert team \`expert_team\`.
|
|
121
|
+
4. **Who makes your ad creatives right now?** and **Who manages your ads right now?** Use the shared values returned in the tool schema. Skip both when ad spend is \`zero\` and no advertising goal was selected.
|
|
122
|
+
5. **Which platforms or channels do you use or want help with?** Multi-select: \`meta\` · \`tiktok\` · \`google\` · \`chatgpt\` · \`x\` · \`linkedin\` · \`reddit\` · \`other\`.
|
|
123
|
+
6. **Where did you find GooseWorks?** Use the shared discovery-source values returned in the tool schema.
|
|
89
124
|
|
|
90
|
-
|
|
125
|
+
Do not add CLI-only questions about business type, products, or audience. Infer them from the website and ask one clarification only when the research is materially uncertain.
|
|
91
126
|
|
|
92
|
-
|
|
127
|
+
### Research while onboarding
|
|
93
128
|
|
|
94
|
-
|
|
95
|
-
1. **What's your company's website?** → \`company_website\`
|
|
96
|
-
2. **What's your role?** → \`role\`
|
|
97
|
-
3. **What are you hoping to use Goose skills for?** (multi-select — pick any): generate ad creatives · research and run ads end-to-end · finding influencers · data scraping (social / ads / reddit) · finding leads & emails · something else → \`use_cases\` (array)
|
|
98
|
-
4. **What high-priority growth / marketing tasks would you like help with right now?** The more context they share, the better you can help. → \`goals\`
|
|
129
|
+
Do useful setup work, not only form collection:
|
|
99
130
|
|
|
100
|
-
|
|
131
|
+
1. Fetch \`brand-research\` and research the website, products/services, audiences, competitors, offers, and messaging evidence.
|
|
132
|
+
2. Reuse existing Brand Kit/Core data. For an ecommerce store, import the relevant catalog with \`import_product\` and poll \`get_product_import\` rather than submitting duplicates.
|
|
133
|
+
3. When ads are relevant, offer to import existing creative. This is optional.
|
|
134
|
+
4. Suggest evidence-backed messaging angles. Approval is optional and never blocks completion.
|
|
135
|
+
5. Show the researched profile for confirmation: products/services, audience, competitors, imported ads, and suggested angles. Clearly label uncertainty.
|
|
101
136
|
|
|
102
|
-
|
|
103
|
-
1. **Route each answer to the RIGHT tool first — don't blindly search one catalog. Match their use-cases to domains (same routing as "Route to the right skill FIRST" above):**
|
|
104
|
-
- **Make / edit / analyze ADS** (generate ad creatives, research & run ads) → the **\`goose-ads\`** skill (brand research + template remix). Do NOT \`gooseworks search\` for these — ad creation is NOT in the data catalog.
|
|
105
|
-
- **VIDEO ads** → **\`goose-video\`**. **Charts / slides / graphics** → **\`goose-graphics\`**.
|
|
106
|
-
- **GTM / DATA** (finding leads & emails, influencers, scraping social / ads / reddit, enrichment, competitor intel) → run \`gooseworks search "<that task>"\` (free) and recommend the REAL skill slugs it returns.
|
|
107
|
-
Recommend specific, real things BY NAME — never a from-memory playbook, never a skill you assume exists; if a GTM search returns nothing relevant, say so.
|
|
108
|
-
2. **Ground it in THEIR business.** If they gave a company website, read it with your web tools to infer their actual product + ICP, so suggestions are about their company — not a template. (For ad work, prefer \`goose-ads\`'s own brand research over a raw read.)
|
|
109
|
-
3. **Be honest about cost.** Data / lead / enrichment / ad-generation skills bill GooseWorks credits — say so, and estimate before running anything (\`gooseworks credits\` to check balance).
|
|
110
|
-
4. **Offer to start ONE concrete play** built from the ROUTED skill (\`goose-ads\` for ads, a real searched skill for GTM) and ask for the one or two inputs it needs.
|
|
137
|
+
### First task
|
|
111
138
|
|
|
112
|
-
|
|
139
|
+
Finish with **What do you want to do first?**
|
|
113
140
|
|
|
114
|
-
|
|
115
|
-
|
|
141
|
+
- Connect my tools and data — \`connect_tools\`
|
|
142
|
+
- Research customers, competitors, creators, or trends — \`research\`
|
|
143
|
+
- Analyze ads, content, landing pages, or performance — \`analyze\`
|
|
144
|
+
- Create ads, product images, or social content — \`create\`
|
|
145
|
+
|
|
146
|
+
Save the choice as \`first_task\`, then start that job. If the user already stated a concrete job, save the matching value and start without showing the menu.
|
|
147
|
+
|
|
148
|
+
## Brand Growth discovery
|
|
149
|
+
|
|
150
|
+
Brand Growth is a collection inside the normal skill catalog, not a command or installable pack. Use these known routes when relevant, while preserving all existing B2B, sales, research, lead-generation, and data behavior:
|
|
151
|
+
|
|
152
|
+
| Job | Skill |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| Brand foundation | \`brand-research\` |
|
|
155
|
+
| Competitor ads | \`competitor-ad-intelligence\` |
|
|
156
|
+
| Customer language and angles | \`comment-mining\` → \`ad-angle-miner\` |
|
|
157
|
+
| Competitor social content | \`competitor-social-research\` |
|
|
158
|
+
| Creator discovery and evaluation | \`influencer-prospecting\` |
|
|
159
|
+
| Trends and outlier posts | \`trend-discovery\`, \`outlier-post-finder\` |
|
|
160
|
+
| Social listening and product demand | \`social-listening-brief\`, \`product-demand-research\` |
|
|
161
|
+
| Meta performance, policy, and landing-page match | \`meta-ads-analyzer\`, \`meta-ad-policy-checker\`, \`ad-to-landing-page-auditor\` |
|
|
162
|
+
| Static ads | \`goose-ads\` / \`remix-graphic-ad-from-reference\` |
|
|
163
|
+
| Product photos | \`goose-product-photos\` |
|
|
164
|
+
| Graphics and animation | \`goose-graphics\`, \`animate-image\` |
|
|
165
|
+
|
|
166
|
+
Fetch the named public skill before following it. Provider helpers such as \`scrapecreators-api\` and \`transcript-intelligence\` are dependencies, not user-facing results.
|
|
167
|
+
|
|
168
|
+
For a multi-part request, repeat this routing check before each new job. Fetch and follow the
|
|
169
|
+
closest outcome skill first (for example, \`comment-mining\`, \`creator-profile-teardown\`, or
|
|
170
|
+
\`content-repurposing\`) before calling provider APIs or improvising a workflow. Provider calls
|
|
171
|
+
collect inputs for the outcome skill; they do not replace it.
|
|
116
172
|
|
|
117
173
|
## How to Use
|
|
118
174
|
|
|
@@ -152,6 +208,7 @@ Follow the instructions in the skill's \`content\` field. **Save ALL files from
|
|
|
152
208
|
> - **Credentials (only needed before running Python scripts, NOT before gooseworks commands):** replace the python one-liner exports with \`eval $(gooseworks env)\`. Skip entirely if you are only using \`gooseworks call\` — it loads credentials automatically.
|
|
153
209
|
> - **Orthogonal run:** replace \`curl ... /v1/proxy/orthogonal/run ... -d '{"api":"X","path":"/Y","body":{...}}'\` with \`gooseworks call X /Y --body='{...}'\`
|
|
154
210
|
> - **Direct proxy:** replace \`curl ... /v1/proxy/<provider>/<path> ... -d '{...}'\` with \`gooseworks call <provider> <path> --body='{...}'\`
|
|
211
|
+
> - **ScrapeCreators:** call its first-party GooseWorks proxy directly with \`gooseworks call scrapecreators <path> --query='{...}'\`. Use ScrapeCreators' official OpenAPI for endpoint parameters; do not use Orthogonal as its endpoint catalog. GET is the default; add \`--method POST --body='{...}'\` only for an official POST operation.
|
|
155
212
|
> - **Orthogonal search:** replace \`curl ... /v1/proxy/orthogonal/search ... -d '{"prompt":"..."}'\` with \`gooseworks orthogonal find "..."\`
|
|
156
213
|
|
|
157
214
|
1. Save each script from \`scripts\` to \`/tmp/gooseworks-scripts/<slug>/scripts/\` — **NEVER save scripts into the user's project directory**
|
|
@@ -190,9 +247,10 @@ gooseworks call hunter /v2/email-finder --query='{"domain":"stripe.com","first_n
|
|
|
190
247
|
- Output: JSON response data, followed by a \`Cost: <N> credits\` line when applicable
|
|
191
248
|
- **Always tell the user the cost** after each call
|
|
192
249
|
|
|
193
|
-
The same \`gooseworks call\` command also handles direct-proxy providers (apify, apollo, crustdata):
|
|
250
|
+
The same \`gooseworks call\` command also handles direct-proxy providers (apify, apollo, crustdata, scrapecreators):
|
|
194
251
|
\`\`\`bash
|
|
195
252
|
gooseworks call apify acts/parseforge~reddit-posts-scraper/runs --body='{"subreddit":"ClaudeAI"}'
|
|
253
|
+
gooseworks call scrapecreators /v2/instagram/post/comments --query='{"url":"https://www.instagram.com/p/POST_ID/"}'
|
|
196
254
|
\`\`\`
|
|
197
255
|
|
|
198
256
|
### Workflow
|
|
@@ -223,7 +281,7 @@ The \`gooseworks\` CLI sends authenticated requests (Bearer \`GOOSEWORKS_API_KEY
|
|
|
223
281
|
| \`$GOOSEWORKS_API_BASE/v1/proxy/orthogonal/search\` | POST | \`gooseworks orthogonal find\` |
|
|
224
282
|
| \`$GOOSEWORKS_API_BASE/v1/proxy/orthogonal/details\` | POST | \`gooseworks orthogonal describe\` |
|
|
225
283
|
| \`$GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run\` | POST | \`gooseworks call\` (orthogonal-routed providers) |
|
|
226
|
-
| \`$GOOSEWORKS_API_BASE/v1/proxy/{apify,apollo,crustdata}/*\` | Various | \`gooseworks call\` (direct-proxy providers) |
|
|
284
|
+
| \`$GOOSEWORKS_API_BASE/v1/proxy/{apify,apollo,crustdata,scrapecreators}/*\` | Various | \`gooseworks call\` (direct-proxy providers; ScrapeCreators uses its managed first-party key) |
|
|
227
285
|
|
|
228
286
|
## Security & Privacy
|
|
229
287
|
|
|
@@ -264,8 +322,8 @@ function getGooseAdsSkillContent() {
|
|
|
264
322
|
name: goose-ads
|
|
265
323
|
slug: goose-ads
|
|
266
324
|
description: >
|
|
267
|
-
GooseWorks ads skill — create, edit, AND analyze ad creative.
|
|
268
|
-
|
|
325
|
+
GooseWorks ads skill — create, edit, AND analyze ad creative. Turn an approved source ad
|
|
326
|
+
into a branded ad for the user's product, edit/re-roll an existing creative,
|
|
269
327
|
research a brand for ads, OR analyze ad performance (Meta/Google campaign diagnostics,
|
|
270
328
|
creative fatigue, CAC & lead quality, competitor ad intelligence, ad angles & hooks). Use
|
|
271
329
|
when the user says "remix this ad", references a static ad template id/slug, asks to "make
|
|
@@ -274,7 +332,7 @@ description: >
|
|
|
274
332
|
app uses) — credits are reserved and billed server-side. Analytics recipes are fetched from
|
|
275
333
|
goose-skills on demand.
|
|
276
334
|
category: ads
|
|
277
|
-
version: 2.
|
|
335
|
+
version: 2.4.0
|
|
278
336
|
author: GooseWorks
|
|
279
337
|
tags: [gooseworks, ads, remix, static-ad, brand, creative, image, analytics, meta-ads, performance]
|
|
280
338
|
---
|
|
@@ -284,7 +342,7 @@ tags: [gooseworks, ads, remix, static-ad, brand, creative, image, analytics, met
|
|
|
284
342
|
The GooseWorks ads skill. Two jobs:
|
|
285
343
|
|
|
286
344
|
1. **Create / edit ad creative** — a **thin wrapper** over the backend's single generation
|
|
287
|
-
workflow. You pick the brand +
|
|
345
|
+
workflow. You pick the brand + approved source ad(s) and submit ONE batch; the **backend** runs the
|
|
288
346
|
whole pipeline (compose → generate → persist → judge), reserves and bills credits, and
|
|
289
347
|
stores the renders. You do NOT generate images, call FAL, manage render rows, or upload
|
|
290
348
|
files — those are gone. This is the exact same workflow the GooseWorks ads app uses, so the
|
|
@@ -308,74 +366,63 @@ no HTTP/file fallback — the REST ad endpoints are session-cookie-only and reje
|
|
|
308
366
|
message and stop) and bills only the images that actually complete. Call
|
|
309
367
|
\`estimate_remix_batch\` first to tell the user the cost; \`gooseworks credits\` shows balance.
|
|
310
368
|
|
|
311
|
-
##
|
|
369
|
+
## Live MCP contract — inspect it before asking
|
|
312
370
|
|
|
313
|
-
|
|
314
|
-
|
|
371
|
+
The currently registered MCP tool schemas are the source of truth for inputs, supported choices,
|
|
372
|
+
and defaults. Do not copy an exhaustive input list from this skill or rely on remembered fields.
|
|
315
373
|
|
|
316
|
-
|
|
317
|
-
- \`ratios\`: **["4:5"]** (Meta feed vertical)
|
|
318
|
-
- \`engine\`: **"gpt_image_2"**
|
|
319
|
-
- \`quality\`: **"medium"**
|
|
320
|
-
- \`preserve_source_styling\`: **ASK the user** — "Keep original" (the template's own
|
|
321
|
-
colours/fonts → \`preserve_source_styling: true\`) vs "Match brand" (restyle to the brand
|
|
322
|
-
palette/fonts → \`preserve_source_styling: false\`). This mirrors the app's Styling control.
|
|
323
|
-
**The default is "Keep original"** — if the user doesn't answer or doesn't care, send \`true\`.
|
|
374
|
+
Before each tool call:
|
|
324
375
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
376
|
+
1. Inspect the live schema for the tool you are about to use.
|
|
377
|
+
2. Fill required inputs already known from the Brand Kit, selected source, or conversation.
|
|
378
|
+
3. Ask the user only for required inputs that cannot be inferred and for choices that materially
|
|
379
|
+
change the result. Do not turn every optional field into a questionnaire.
|
|
380
|
+
4. Omit unspecified optional settings so the backend applies its current app defaults.
|
|
381
|
+
5. If the live schema conflicts with this workflow, follow the live schema and report the drift
|
|
382
|
+
with \`log_cli_event\`.
|
|
328
383
|
|
|
329
384
|
## The generation tools (the new, single-workflow surface)
|
|
330
385
|
|
|
331
|
-
- \`submit_remix_batch
|
|
332
|
-
|
|
333
|
-
that makes ads.** \`items\` is \`[{ template_id, variants?, ratios? }]\` (≤20 templates).
|
|
386
|
+
- \`submit_remix_batch\` — **the one call that makes ads.** Inspect its live schema and supply
|
|
387
|
+
the required brand/source inputs plus any choices the user explicitly made.
|
|
334
388
|
Returns the batch with a \`links\` block (\`brand_url\` + per-creative \`app_url\`). If the brand's
|
|
335
389
|
research isn't finished yet the batch comes back \`status: "queued"\` — it auto-runs the moment
|
|
336
390
|
research completes; tell the user it'll appear shortly, don't error.
|
|
337
|
-
- \`estimate_remix_batch
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
resolve (submit would 404 on it); don't quote a cost that silently dropped a bad id.
|
|
341
|
-
- \`get_remix_batch { batch_id }\` — poll status. Returns each creative with its renders and
|
|
391
|
+
- \`estimate_remix_batch\` — cost preview. Reserves nothing. Use it to quote the cost first and
|
|
392
|
+
check whether every selected source resolved before submitting.
|
|
393
|
+
- \`get_remix_batch\` — poll status. Returns each creative with its renders and
|
|
342
394
|
\`completed\`/\`failed\`/\`pending\` counts, plus \`links\`. A creative is done when its \`pending\` is 0
|
|
343
395
|
— NOT when \`current_render_url\` is set (during a regenerate that field still points at the prior
|
|
344
396
|
image). Each render carries \`age_seconds\` (since queued) and \`elapsed_seconds\` (time generating):
|
|
345
397
|
use them to tell a slow-but-healthy render from a stuck one. A render only failed when its
|
|
346
398
|
\`status\` is \`"failed"\` — never assume a stall and re-submit, that double-bills.
|
|
347
|
-
- \`list_brand_creatives
|
|
399
|
+
- \`list_brand_creatives\` — the brand's gallery feed (newest
|
|
348
400
|
first) + \`brand_url\`. Alternative poll target; also use to show everything made for a brand.
|
|
349
|
-
- \`surprise_me_templates
|
|
350
|
-
|
|
351
|
-
|
|
401
|
+
- \`surprise_me_templates\` — the **"Surprise me" recommender**. Picks
|
|
402
|
+
remixable Community creations (SAME logic as the web /create "Surprise me" button), shuffled
|
|
403
|
+
so picks stay fresh. It does not use the retired curated third-party catalog.
|
|
352
404
|
Returns the picked templates (id, slug, title, image, ratio) AND a ready-to-open \`create_url\`
|
|
353
405
|
(the /create page with \`cli=true\` and the picks pre-selected). This is how you recommend
|
|
354
406
|
templates — do NOT hand-pick from the raw catalog yourself (see "Picking templates" below).
|
|
355
|
-
- \`regenerate_creative
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
- \`set_creative_feedback { render_id, rating?, comment?, reasons? }\` — record the user's reaction
|
|
361
|
-
to a generated image (the SAME happy/neutral/sad + comment + reason chips the app captures). Use
|
|
362
|
-
it whenever the user reacts ("love this one" / "the logo is wrong"). \`render_id\` is a RENDER id
|
|
363
|
-
from \`get_remix_batch\` / \`list_brand_creatives\`, not a project/batch id. \`reasons\` are quick
|
|
364
|
-
chips (wrong_product, brand_or_logo_wrong, off_brand, text_garbled, weak_copy, ai_or_distorted).
|
|
407
|
+
- \`regenerate_creative\` — edit or re-roll one existing creative through the same pipeline.
|
|
408
|
+
Inspect the live schema to select the supported mode and required source inputs. Returns a
|
|
409
|
+
single-item batch; poll it with \`get_remix_batch\`.
|
|
410
|
+
- \`set_creative_feedback\` — record the user's reaction to a generated image. Use it whenever
|
|
411
|
+
the user reacts; inspect the schema for the current rating and reason choices.
|
|
365
412
|
|
|
366
413
|
### Plan mode — review the plan BEFORE generating (optional)
|
|
367
414
|
|
|
368
415
|
For users who want to approve each ad's plan before spending credits (the app's "Plan it" flow):
|
|
369
416
|
|
|
370
|
-
-
|
|
417
|
+
- Use the approval option exposed by \`submit_remix_batch\` — it composes each creative's plan and PAUSES.
|
|
371
418
|
**No credits are reserved and no image renders** until you approve.
|
|
372
|
-
- \`list_ad_approvals
|
|
419
|
+
- \`list_ad_approvals\` — poll this. While a creative is
|
|
373
420
|
\`composing\`, wait; once \`awaiting_approval\`, show its \`plan\` (composed prompt + refs + quality)
|
|
374
421
|
to the user.
|
|
375
|
-
- \`revise_ad_plan
|
|
422
|
+
- \`revise_ad_plan\` — recompose from a chat steer, still
|
|
376
423
|
free. Poll \`list_ad_approvals\` until it's \`awaiting_approval\` again.
|
|
377
|
-
- \`approve_ad_plan
|
|
378
|
-
|
|
424
|
+
- \`approve_ad_plan\` — approve one creative or the whole batch using the live schema.
|
|
425
|
+
**This is the step that reserves credits and renders.** Then poll
|
|
379
426
|
\`get_remix_batch\` and hand back links as usual.
|
|
380
427
|
|
|
381
428
|
Only offer plan mode when the user asks to review/approve first — the default path generates
|
|
@@ -383,19 +430,23 @@ immediately.
|
|
|
383
430
|
|
|
384
431
|
## Reading the brand & picking inputs (still MCP, read-only)
|
|
385
432
|
|
|
386
|
-
- \`get_brand_kit
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
433
|
+
- \`get_brand_kit\` — read the canonical brand context and available products/assets.
|
|
434
|
+
- \`list_ad_brands\` / \`get_ad_brand\` — find and fetch the active brand.
|
|
435
|
+
- \`list_user_ad_templates\` — list the org's own uploads and
|
|
436
|
+
imported ads. Prefer \`relationship: "self"\` when the user wants to reuse their own ads;
|
|
437
|
+
\`relationship: "competitor"\` is research/inspiration, never proof that the user owns the ad.
|
|
438
|
+
- \`search_ad_templates\` — search remixable Community generations. The
|
|
439
|
+
retired curated third-party catalog is not returned.
|
|
440
|
+
- \`get_static_ad_template\` — resolve a source already owned by
|
|
441
|
+
the org, including an own upload or a snapshotted Community creative. It does not resolve the
|
|
442
|
+
retired curated third-party catalog.
|
|
443
|
+
- \`remix_community_ad\` — turn a selected Community creative into a private remix source before
|
|
444
|
+
submitting it. A Community ad id is an \`ad_project\` id, not a
|
|
395
445
|
template id. Call this FIRST to snapshot it into a private template, then use the returned
|
|
396
446
|
template \`id\` in \`items\`.
|
|
397
|
-
- \`create_user_ad_template
|
|
398
|
-
|
|
447
|
+
- \`create_user_ad_template\` — upload a source image as a private template. Answer any
|
|
448
|
+
ownership/rights input only from the user's explicit confirmation. Never claim rights for a
|
|
449
|
+
competitor ad or an image found online.
|
|
399
450
|
- \`get_ad_project\` / \`append_project_message\` — inspect a creative / leave a note on its thread.
|
|
400
451
|
|
|
401
452
|
## Keep the brand kit in sync — reconcile, then update (ASK first)
|
|
@@ -406,7 +457,7 @@ tagline, audience, voice, a product's name/price/description, "our logo is X", "
|
|
|
406
457
|
anymore", a new product photo — treat it as a possible kit update, don't just use it for this one
|
|
407
458
|
ad and forget it:
|
|
408
459
|
|
|
409
|
-
1. **Check it against the kit.** \`get_brand_kit
|
|
460
|
+
1. **Check it against the kit.** Call \`get_brand_kit\` for the active brand and see whether what the user said
|
|
410
461
|
matches, is missing from, or contradicts the kit.
|
|
411
462
|
2. **If it's already in the kit and matches** — nothing to do; proceed.
|
|
412
463
|
3. **If it's new or different — ASK before writing.** Confirm in one line: *"Want me to update
|
|
@@ -414,65 +465,72 @@ ad and forget it:
|
|
|
414
465
|
asked you to change the brand). Don't silently mutate the kit, and don't nag on trivia.
|
|
415
466
|
4. **Persist with the write tools** (partial — only the fields you pass are touched; each edit is
|
|
416
467
|
recorded as a user override that later re-research won't clobber):
|
|
417
|
-
- \`update_brand_kit
|
|
418
|
-
|
|
419
|
-
- \`
|
|
420
|
-
|
|
421
|
-
reference photos.
|
|
468
|
+
- \`update_brand_kit\` — structured brand fields.
|
|
469
|
+
- \`upsert_brand_product\` / \`delete_brand_product\` — products.
|
|
470
|
+
- \`add_brand_product_image\` / \`remove_brand_reference_image\` — product and reference photos.
|
|
471
|
+
Inspect each live schema and send only the fields needed for the confirmed change.
|
|
422
472
|
5. **Confirm what changed** and continue the task. (Logo, colors, and fonts are owned by the
|
|
423
473
|
backend research pass — prefer \`update_ad_brand\` / the research flow for those, not free text.)
|
|
424
474
|
|
|
425
475
|
This is the parity gap the app closes in-product: a brand fact the user gives mid-task should be
|
|
426
476
|
able to flow back into the kit — with their ok — instead of being lost.
|
|
427
477
|
|
|
428
|
-
## Picking
|
|
478
|
+
## Picking source ads — use approved sources, not the retired catalog
|
|
429
479
|
|
|
430
480
|
When the user wants to make ads but has NOT named a specific template (id/slug/Community
|
|
431
481
|
ad/upload), do NOT silently browse the raw catalog and hand-pick for them. Instead run this
|
|
432
482
|
short ask flow — it mirrors the web app and keeps the human in the loop:
|
|
433
483
|
|
|
434
484
|
1. **Ask what kind of ads they want** — the angle/offer/theme/season, the vibe, and which
|
|
435
|
-
product from the brand kit to feature. This shapes both the
|
|
485
|
+
product from the brand kit to feature. This shapes both the source choice and your steering
|
|
436
486
|
\`prompt\`. Keep it to one or two quick questions.
|
|
437
|
-
2. **Ask how to pick
|
|
438
|
-
- **
|
|
439
|
-
|
|
487
|
+
2. **Ask how to pick a source: their own ads, Community, upload, or "Surprise me".**
|
|
488
|
+
- **Their own ads** → use \`list_user_ad_templates\` to load the active brand's own sources and
|
|
489
|
+
let them choose from the results.
|
|
490
|
+
- **Community** → \`search_ad_templates\`, let them choose, then call \`remix_community_ad\`
|
|
491
|
+
before submitting.
|
|
492
|
+
- **Upload** → upload through the workspace and call \`create_user_ad_template\`. If its live
|
|
493
|
+
schema requires an ownership or permission answer, only supply it after explicit confirmation.
|
|
494
|
+
- **Surprise me** (they want you/the app to pick) → call \`surprise_me_templates\` for the active
|
|
495
|
+
brand and hand the user the returned \`create_url\`.
|
|
440
496
|
It opens /create in **CLI mode** with the picks pre-selected, a preview modal, and the
|
|
441
497
|
**copyable remix prompt at the bottom** (in place of the Generate input). They can swap
|
|
442
498
|
picks and copy that prompt. If they'd rather you "just make them" without reviewing in the
|
|
443
499
|
app, you MAY submit the \`surprise_me_templates\` picks directly (skip to submit).
|
|
444
|
-
- **
|
|
500
|
+
- **Browse in the app** → hand the user this URL, with the
|
|
445
501
|
active brand's slug filled in:
|
|
446
502
|
\`https://make.gooseworks.ai/create?brand=<brand-slug>&cli=true\`
|
|
447
503
|
In CLI mode the app shows the copyable remix prompt at the bottom (dismissable / switchable
|
|
448
|
-
back to the UI composer). They browse
|
|
449
|
-
3. **
|
|
450
|
-
4. **Close the loop.** When the user **pastes back the copyable remix prompt** from the app
|
|
504
|
+
back to the UI composer). They browse the available own/Community sources and copy the prompt.
|
|
505
|
+
3. **Close the loop.** When the user **pastes back the copyable remix prompt** from the app
|
|
451
506
|
(it names the brand + the templates they chose), THAT is your cue to generate: resolve the
|
|
452
|
-
named
|
|
507
|
+
named source(s), inspect \`submit_remix_batch\`, and collect only its unresolved required inputs.
|
|
453
508
|
|
|
454
|
-
If the user already named
|
|
455
|
-
|
|
509
|
+
If the user already named an owned source (id/slug), a Community ad, or an upload, skip the source
|
|
510
|
+
choice. Competitor ads may inform the angle or structure, but describe them as inspiration, never
|
|
511
|
+
claim ownership, and never attest rights for the user.
|
|
456
512
|
|
|
457
513
|
## Workflow — make ads from a template
|
|
458
514
|
|
|
459
|
-
1. **Resolve the brand.** \`list_ad_brands\` by name/site
|
|
515
|
+
1. **Resolve the brand.** Use \`list_ad_brands\` by name/site, then call \`get_brand_kit\` for the
|
|
516
|
+
selected brand. If the
|
|
460
517
|
kit's \`researchStatus\` isn't \`complete\`, you can still submit (the batch queues and runs when
|
|
461
518
|
research finishes) — just tell the user. Use the kit to pick \`product_name\` (a real entry from
|
|
462
519
|
\`products[]\`, not a guess) and, if the user supplied product photos, \`reference_image_urls\`.
|
|
463
|
-
2. **Pick the
|
|
464
|
-
|
|
520
|
+
2. **Pick the source ad(s) via the ask flow above.** Once you have concrete ids:
|
|
521
|
+
call \`get_static_ad_template\` for each.
|
|
465
522
|
For a Community ad, \`remix_community_ad\` first; for an uploaded image, \`create_user_ad_template\`
|
|
466
523
|
first.
|
|
467
524
|
3. **(Optional) Craft the steering prompt.** The \`prompt\` is OPTIONAL — this is where the skill
|
|
468
525
|
adds value: turn the user's intent (from step 1) into a concise steering note (e.g. tone,
|
|
469
526
|
season, emphasis). Don't over-specify; the backend pipeline + brand kit handle palette, fonts,
|
|
470
527
|
product swap.
|
|
471
|
-
4. **
|
|
472
|
-
5. **Submit ONE batch.** \`submit_remix_batch
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
6. **Poll until done.** \`get_remix_batch
|
|
528
|
+
4. **Quote the cost.** Inspect and call \`estimate_remix_batch\`, then tell the user.
|
|
529
|
+
5. **Submit ONE batch.** Inspect the current \`submit_remix_batch\` schema, fill known required
|
|
530
|
+
inputs, ask only for unresolved user decisions, and omit unspecified optional settings. Keep
|
|
531
|
+
the returned \`batch_id\` and \`links\`.
|
|
532
|
+
6. **Poll until done.** Call \`get_remix_batch\` for the returned batch (or use
|
|
533
|
+
\`list_brand_creatives\`) every ~20-30s
|
|
476
534
|
until every creative's \`pending\` is 0. Most images finish in a few minutes; text-heavy templates
|
|
477
535
|
and \`quality: high\` take longer. Read each render's \`elapsed_seconds\` rather than guessing — a
|
|
478
536
|
render that's still \`running\` is healthy; do NOT re-submit thinking it stalled (that double-bills).
|
|
@@ -481,17 +539,14 @@ for template choice — they've chosen — but still confirm the styling default
|
|
|
481
539
|
|
|
482
540
|
## Workflow — edit an existing ad
|
|
483
541
|
|
|
484
|
-
User wants to tweak a creative they already made → \`regenerate_creative
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
\`prompt\` = the change.
|
|
489
|
-
- "run exactly this prompt on the product" → \`mode: "exact"\`, \`source_render_id\` + \`prompt\`.
|
|
490
|
-
Then poll with \`get_remix_batch\` and hand back the links, same as above.
|
|
542
|
+
User wants to tweak a creative they already made → use \`regenerate_creative\`. Infer whether they
|
|
543
|
+
want another take, a targeted edit, or an exact instructed change from their request. Then inspect
|
|
544
|
+
the live schema, ask only for any required source or instruction that is still missing, submit,
|
|
545
|
+
poll with \`get_remix_batch\`, and hand back the links.
|
|
491
546
|
|
|
492
547
|
## Brand research
|
|
493
548
|
|
|
494
|
-
Prefer the backend's result: \`get_brand_kit
|
|
549
|
+
Prefer the backend's result: call \`get_brand_kit\` for the selected brand. If \`researchStatus\` is
|
|
495
550
|
\`complete\`, REUSE it — never re-research.
|
|
496
551
|
|
|
497
552
|
**The split — backend owns visuals, you own the qualitative depth:**
|
|
@@ -508,9 +563,10 @@ Prefer the backend's result: \`get_brand_kit { brand_id }\`. If \`researchStatus
|
|
|
508
563
|
|
|
509
564
|
**CLI brand-research flow:**
|
|
510
565
|
|
|
511
|
-
1.
|
|
566
|
+
1. Inspect and call \`create_ad_brand\` with the known brand identity and website, then keep its id
|
|
567
|
+
and slug. The brand comes back with
|
|
512
568
|
\`research_status: "pending"\` (light pass in flight).
|
|
513
|
-
2. **Wait for the backend light pass:** poll \`get_brand_kit
|
|
569
|
+
2. **Wait for the backend light pass:** poll \`get_brand_kit\` for that brand until \`researchStatus\`
|
|
514
570
|
is \`complete\` (usually <60s). Now the kit has authoritative logo/colors/fonts + a baseline.
|
|
515
571
|
At this point generation is already unblocked — but do the deep pass to make it good.
|
|
516
572
|
3. **Deep research locally:** \`gooseworks fetch brand-research\` and follow its phases. **Ground
|
|
@@ -524,10 +580,10 @@ Prefer the backend's result: \`get_brand_kit { brand_id }\`. If \`researchStatus
|
|
|
524
580
|
(\`brandType\` ∈ product | saas | service | agency | restaurant | fashion | beauty | fitness |
|
|
525
581
|
finance | education | health). Only URLs already in our storage for product images.
|
|
526
582
|
- **Do NOT set logo / colors / fonts here** — the backend light pass already owns those.
|
|
527
|
-
5. **Persist it:** \`finalize_brand_research
|
|
583
|
+
5. **Persist it:** call \`finalize_brand_research\` for the brand. It merges \`kit-patch.json\` into the kit
|
|
528
584
|
NON-CLOBBERINGLY (it will NOT overwrite the backend's visuals or any user edit), then re-confirms
|
|
529
585
|
\`research_status: complete\`.
|
|
530
|
-
6. **Verify:** \`get_brand_kit
|
|
586
|
+
6. **Verify:** call \`get_brand_kit\` again and confirm the qualitative fields you wrote are present
|
|
531
587
|
before generating.
|
|
532
588
|
|
|
533
589
|
**If the brand has NO website**, the backend light pass can't run (nothing to fetch) — do the whole
|
|
@@ -567,23 +623,29 @@ run through the \`gooseworks\` CLI (\`gooseworks fetch\` / \`gooseworks call\`),
|
|
|
567
623
|
each creative's \`app_url\`), copied verbatim. Never end on just "done" or a file path.
|
|
568
624
|
- **Quote cost before generating** when it's non-trivial (use \`estimate_remix_batch\`), and
|
|
569
625
|
relay \`insufficient_credits\` plainly if the submit is rejected — don't retry blindly.
|
|
570
|
-
- **
|
|
571
|
-
|
|
572
|
-
\`surprise_me_templates\`;
|
|
626
|
+
- **Use approved source paths.** If the user didn't name a source, run the ask flow (own ads,
|
|
627
|
+
Community, upload, Surprise me, or browse in the app). "Surprise me" goes through
|
|
628
|
+
\`surprise_me_templates\`; browsing uses \`/create?brand=<slug>&cli=true\`. Never use the retired
|
|
629
|
+
curated third-party catalog.
|
|
573
630
|
Generate when they paste the app's copyable remix prompt back (or submit the surprise picks
|
|
574
631
|
directly if they'd rather not review).
|
|
575
|
-
- **
|
|
632
|
+
- **Treat competitor ads as inspiration** — never attest rights, imply ownership, or promise to
|
|
633
|
+
copy a competitor's distinctive expression.
|
|
576
634
|
- **Reconcile brand facts into the kit** — when the user states or changes something brand-level
|
|
577
635
|
mid-task, check it against \`get_brand_kit\` and, with their ok, persist it via \`update_brand_kit\`
|
|
578
636
|
/ \`upsert_brand_product\` / \`add_brand_product_image\` so it sticks for future ads. Ask first;
|
|
579
637
|
never silently mutate the kit.
|
|
580
|
-
- **Record feedback** — when the user reacts to a generated image,
|
|
581
|
-
\`set_creative_feedback
|
|
582
|
-
- **Plan mode is opt-in** — only
|
|
583
|
-
|
|
638
|
+
- **Record feedback** — when the user reacts to a generated image, inspect and call
|
|
639
|
+
\`set_creative_feedback\` so the quality loop learns.
|
|
640
|
+
- **Plan mode is opt-in** — only use the live approval option, then \`list_ad_approvals\` and
|
|
641
|
+
\`approve_ad_plan\`, when the user wants to review before spending credits; otherwise generate
|
|
584
642
|
immediately.
|
|
585
643
|
- **Don't busy-loop** — poll \`get_remix_batch\` on a sensible interval (~20-30s); a \`queued\`
|
|
586
644
|
batch is waiting on research and will start on its own.
|
|
645
|
+
- **Report problems so we can fix them** — when a batch fails/is rejected and you can't resolve it,
|
|
646
|
+
a required brand input/asset is missing, or a recipe/instruction is ambiguous or contradictory,
|
|
647
|
+
call the **\`log_cli_event\`** MCP tool (\`event_type\`: \`error\`/\`blocker\`/\`missing_input\`/\`confusion\`,
|
|
648
|
+
with the real error + step in \`details\`) so the team gets visibility. Still tell the user too.
|
|
587
649
|
`;
|
|
588
650
|
}
|
|
589
651
|
/**
|
|
@@ -646,6 +708,26 @@ says to shell out, use the MCP equivalent:
|
|
|
646
708
|
- \`gooseworks credits\` → the **\`get_ad_credits\`** MCP tool.
|
|
647
709
|
- \`gooseworks doctor\` → do the manual toolchain check in the preflight below.
|
|
648
710
|
|
|
711
|
+
## Report problems so we can fix them (telemetry — do this, don't skip it)
|
|
712
|
+
|
|
713
|
+
If anything blocks or degrades this run — a media/proxy call fails or errors, a required input or
|
|
714
|
+
asset is missing, a recipe instruction is ambiguous or contradictory, the render toolchain won't set
|
|
715
|
+
up, or you hit a bug you can't work around — **report it** so the team gets visibility and can fix
|
|
716
|
+
the skill. It's fire-and-forget, never counts against you, and never blocks your work.
|
|
717
|
+
|
|
718
|
+
- **First, set a stable run id** so every event (yours + the auto-logged media calls) groups together:
|
|
719
|
+
\`export GW_RUN_ID="vid-<project_or_batch_id>"\` (and \`export GW_SKILL="<recipe-slug>"\`) in the
|
|
720
|
+
shell you render from. The media proxies read \`GW_RUN_ID\` automatically.
|
|
721
|
+
- **CLI present →** \`gooseworks log "<what happened>" --event-type <type> --level error --details '{"error":"...","step":"...","model":"..."}'\`
|
|
722
|
+
- **No CLI (cowork / headless) →** the **\`log_cli_event\`** MCP tool with the same fields (pass \`run_id\`).
|
|
723
|
+
- \`--event-type\`: \`api_failure\` (a proxy/model call failed) · \`missing_input\` · \`blocker\` ·
|
|
724
|
+
\`confusion\` (unclear/contradictory instruction) · \`error\` (a bug) · \`step\`/\`info\` (progress notes).
|
|
725
|
+
- Put the **real error text + the step you were on** in \`--details\`. Paid FAL/ElevenLabs calls
|
|
726
|
+
ALREADY auto-log their own failures, so focus your manual logs on what the proxy can't see:
|
|
727
|
+
missing inputs, confusing/contradictory recipe instructions, toolchain/setup failures, and bugs.
|
|
728
|
+
- Logging is FOR US — it does not replace telling the user. When a problem blocks the run, still
|
|
729
|
+
explain it to the user (and ask if you need a decision); just also \`log\` it so we can fix the skill.
|
|
730
|
+
|
|
649
731
|
## Prerequisite — MCP + a render toolchain (Phase 0 preflight)
|
|
650
732
|
|
|
651
733
|
- The \`mcp__gooseworks__*\` tools are REQUIRED. If they're unavailable, stop and tell the user
|
|
@@ -1015,7 +1097,10 @@ path. (\`fal-storage-proxy\` may 404 depending on the install; don't block on it
|
|
|
1015
1097
|
- **Verify a real, non-empty MP4** (watch it) before marking the render complete.
|
|
1016
1098
|
- **Reuse the brand** when its research is complete; never re-research.
|
|
1017
1099
|
- On a hard error (auth/quota/model/timeout) set the render \`failed\` with a short
|
|
1018
|
-
\`error_message\` and stop — don't ship the source unchanged.
|
|
1100
|
+
\`error_message\` and stop — don't ship the source unchanged. **Also \`log\` it** (\`gooseworks log\`
|
|
1101
|
+
/ \`log_cli_event\`, \`--event-type api_failure|error\`) so we can see + fix it (see "Report problems").
|
|
1102
|
+
- **Report blockers/bugs/confusing instructions via telemetry** (\`gooseworks log\` or the
|
|
1103
|
+
\`log_cli_event\` MCP tool) — not just to the user. Set \`GW_RUN_ID\` once so events group.
|
|
1019
1104
|
- Always end a successful run with \`app_url\` + \`brand_url\`, verbatim.
|
|
1020
1105
|
`;
|
|
1021
1106
|
}
|