gooseworks 0.5.0-dev.9.d3e7757f → 0.5.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.
Files changed (220) hide show
  1. package/README.md +17 -26
  2. package/dist/auth/device-flow.d.ts +10 -0
  3. package/dist/auth/device-flow.d.ts.map +1 -1
  4. package/dist/auth/device-flow.js +39 -1
  5. package/dist/auth/device-flow.js.map +1 -1
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +3 -1
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/video.d.ts +5 -0
  10. package/dist/commands/video.d.ts.map +1 -0
  11. package/dist/commands/video.js +117 -0
  12. package/dist/commands/video.js.map +1 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +5 -2
  15. package/dist/config.js.map +1 -1
  16. package/dist/environment.d.ts.map +1 -1
  17. package/dist/environment.js +4 -2
  18. package/dist/environment.js.map +1 -1
  19. package/dist/kit/core/bind.d.ts +12 -0
  20. package/dist/kit/core/bind.d.ts.map +1 -0
  21. package/dist/kit/core/bind.js +77 -0
  22. package/dist/kit/core/bind.js.map +1 -0
  23. package/dist/kit/core/canonical.d.ts +30 -0
  24. package/dist/kit/core/canonical.d.ts.map +1 -0
  25. package/dist/kit/core/canonical.js +67 -0
  26. package/dist/kit/core/canonical.js.map +1 -0
  27. package/dist/kit/core/check.d.ts +22 -0
  28. package/dist/kit/core/check.d.ts.map +1 -0
  29. package/dist/kit/core/check.js +53 -0
  30. package/dist/kit/core/check.js.map +1 -0
  31. package/dist/kit/core/device.d.ts +17 -0
  32. package/dist/kit/core/device.d.ts.map +1 -0
  33. package/dist/kit/core/device.js +153 -0
  34. package/dist/kit/core/device.js.map +1 -0
  35. package/dist/kit/core/errors.d.ts +22 -0
  36. package/dist/kit/core/errors.d.ts.map +1 -0
  37. package/dist/kit/core/errors.js +49 -0
  38. package/dist/kit/core/errors.js.map +1 -0
  39. package/dist/kit/core/files.d.ts +49 -0
  40. package/dist/kit/core/files.d.ts.map +1 -0
  41. package/dist/kit/core/files.js +213 -0
  42. package/dist/kit/core/files.js.map +1 -0
  43. package/dist/kit/core/host.d.ts +26 -0
  44. package/dist/kit/core/host.d.ts.map +1 -0
  45. package/dist/kit/core/host.js +10 -0
  46. package/dist/kit/core/host.js.map +1 -0
  47. package/dist/kit/core/log.d.ts +17 -0
  48. package/dist/kit/core/log.d.ts.map +1 -0
  49. package/dist/kit/core/log.js +82 -0
  50. package/dist/kit/core/log.js.map +1 -0
  51. package/dist/kit/core/paths.d.ts +27 -0
  52. package/dist/kit/core/paths.d.ts.map +1 -0
  53. package/dist/kit/core/paths.js +103 -0
  54. package/dist/kit/core/paths.js.map +1 -0
  55. package/dist/kit/core/pieces.d.ts +84 -0
  56. package/dist/kit/core/pieces.d.ts.map +1 -0
  57. package/dist/kit/core/pieces.js +374 -0
  58. package/dist/kit/core/pieces.js.map +1 -0
  59. package/dist/kit/core/progress-reporter.d.ts +30 -0
  60. package/dist/kit/core/progress-reporter.d.ts.map +1 -0
  61. package/dist/kit/core/progress-reporter.js +106 -0
  62. package/dist/kit/core/progress-reporter.js.map +1 -0
  63. package/dist/kit/core/progress.d.ts +22 -0
  64. package/dist/kit/core/progress.d.ts.map +1 -0
  65. package/dist/kit/core/progress.js +90 -0
  66. package/dist/kit/core/progress.js.map +1 -0
  67. package/dist/kit/core/run.d.ts +35 -0
  68. package/dist/kit/core/run.d.ts.map +1 -0
  69. package/dist/kit/core/run.js +850 -0
  70. package/dist/kit/core/run.js.map +1 -0
  71. package/dist/kit/core/save.d.ts +43 -0
  72. package/dist/kit/core/save.d.ts.map +1 -0
  73. package/dist/kit/core/save.js +265 -0
  74. package/dist/kit/core/save.js.map +1 -0
  75. package/dist/kit/core/schema.d.ts +5 -0
  76. package/dist/kit/core/schema.d.ts.map +1 -0
  77. package/dist/kit/core/schema.js +183 -0
  78. package/dist/kit/core/schema.js.map +1 -0
  79. package/dist/kit/core/secrets.d.ts +9 -0
  80. package/dist/kit/core/secrets.d.ts.map +1 -0
  81. package/dist/kit/core/secrets.js +60 -0
  82. package/dist/kit/core/secrets.js.map +1 -0
  83. package/dist/kit/core/style.d.ts +59 -0
  84. package/dist/kit/core/style.d.ts.map +1 -0
  85. package/dist/kit/core/style.js +179 -0
  86. package/dist/kit/core/style.js.map +1 -0
  87. package/dist/kit/core/toolchain.d.ts +52 -0
  88. package/dist/kit/core/toolchain.d.ts.map +1 -0
  89. package/dist/kit/core/toolchain.js +321 -0
  90. package/dist/kit/core/toolchain.js.map +1 -0
  91. package/dist/kit/core/version.d.ts +18 -0
  92. package/dist/kit/core/version.d.ts.map +1 -0
  93. package/dist/kit/core/version.js +33 -0
  94. package/dist/kit/core/version.js.map +1 -0
  95. package/dist/kit/env.d.ts +42 -0
  96. package/dist/kit/env.d.ts.map +1 -0
  97. package/dist/kit/env.js +76 -0
  98. package/dist/kit/env.js.map +1 -0
  99. package/dist/kit/line/client.d.ts +82 -0
  100. package/dist/kit/line/client.d.ts.map +1 -0
  101. package/dist/kit/line/client.js +325 -0
  102. package/dist/kit/line/client.js.map +1 -0
  103. package/dist/kit/line/types.d.ts +178 -0
  104. package/dist/kit/line/types.d.ts.map +1 -0
  105. package/dist/kit/line/types.js +18 -0
  106. package/dist/kit/line/types.js.map +1 -0
  107. package/dist/kit/maker/browser.d.ts +114 -0
  108. package/dist/kit/maker/browser.d.ts.map +1 -0
  109. package/dist/kit/maker/browser.js +547 -0
  110. package/dist/kit/maker/browser.js.map +1 -0
  111. package/dist/kit/maker/encode.d.ts +27 -0
  112. package/dist/kit/maker/encode.d.ts.map +1 -0
  113. package/dist/kit/maker/encode.js +58 -0
  114. package/dist/kit/maker/encode.js.map +1 -0
  115. package/dist/kit/maker/images.d.ts +14 -0
  116. package/dist/kit/maker/images.d.ts.map +1 -0
  117. package/dist/kit/maker/images.js +174 -0
  118. package/dist/kit/maker/images.js.map +1 -0
  119. package/dist/kit/maker/inputs.d.ts +81 -0
  120. package/dist/kit/maker/inputs.d.ts.map +1 -0
  121. package/dist/kit/maker/inputs.js +235 -0
  122. package/dist/kit/maker/inputs.js.map +1 -0
  123. package/dist/kit/maker/make.d.ts +19 -0
  124. package/dist/kit/maker/make.d.ts.map +1 -0
  125. package/dist/kit/maker/make.js +272 -0
  126. package/dist/kit/maker/make.js.map +1 -0
  127. package/dist/kit/maker/page.d.ts +19 -0
  128. package/dist/kit/maker/page.d.ts.map +1 -0
  129. package/dist/kit/maker/page.js +276 -0
  130. package/dist/kit/maker/page.js.map +1 -0
  131. package/dist/kit/maker/parts/html-frames/1.0.0/part.json +183 -0
  132. package/dist/kit/maker/parts/html-frames/src/part.d.ts +3 -0
  133. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -0
  134. package/dist/kit/maker/parts/html-frames/src/part.js +10 -0
  135. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -0
  136. package/dist/kit/maker/runtime.d.ts +7 -0
  137. package/dist/kit/maker/runtime.d.ts.map +1 -0
  138. package/dist/kit/maker/runtime.js +571 -0
  139. package/dist/kit/maker/runtime.js.map +1 -0
  140. package/dist/kit/maker/unzip.d.ts +3 -0
  141. package/dist/kit/maker/unzip.d.ts.map +1 -0
  142. package/dist/kit/maker/unzip.js +133 -0
  143. package/dist/kit/maker/unzip.js.map +1 -0
  144. package/dist/kit/parts/catalog.d.ts +47 -0
  145. package/dist/kit/parts/catalog.d.ts.map +1 -0
  146. package/dist/kit/parts/catalog.js +198 -0
  147. package/dist/kit/parts/catalog.js.map +1 -0
  148. package/dist/kit/parts/fs-safe.d.ts +32 -0
  149. package/dist/kit/parts/fs-safe.d.ts.map +1 -0
  150. package/dist/kit/parts/fs-safe.js +185 -0
  151. package/dist/kit/parts/fs-safe.js.map +1 -0
  152. package/dist/kit/parts/loader.d.ts +50 -0
  153. package/dist/kit/parts/loader.d.ts.map +1 -0
  154. package/dist/kit/parts/loader.js +395 -0
  155. package/dist/kit/parts/loader.js.map +1 -0
  156. package/dist/kit/parts/semver.d.ts +6 -0
  157. package/dist/kit/parts/semver.d.ts.map +1 -0
  158. package/dist/kit/parts/semver.js +44 -0
  159. package/dist/kit/parts/semver.js.map +1 -0
  160. package/dist/program.d.ts.map +1 -1
  161. package/dist/program.js +6 -6
  162. package/dist/program.js.map +1 -1
  163. package/dist/skills/installer.d.ts +22 -0
  164. package/dist/skills/installer.d.ts.map +1 -1
  165. package/dist/skills/installer.js +56 -8
  166. package/dist/skills/installer.js.map +1 -1
  167. package/dist/skills/master-skill.d.ts +11 -70
  168. package/dist/skills/master-skill.d.ts.map +1 -1
  169. package/dist/skills/master-skill.js +120 -2900
  170. package/dist/skills/master-skill.js.map +1 -1
  171. package/dist/skills/package-freshness.d.ts +19 -0
  172. package/dist/skills/package-freshness.d.ts.map +1 -1
  173. package/dist/skills/package-freshness.js +37 -2
  174. package/dist/skills/package-freshness.js.map +1 -1
  175. package/dist/skills/routes.d.ts +7 -2
  176. package/dist/skills/routes.d.ts.map +1 -1
  177. package/dist/skills/routes.js +21 -25
  178. package/dist/skills/routes.js.map +1 -1
  179. package/dist/skills/server-entry-skills.d.ts +14 -0
  180. package/dist/skills/server-entry-skills.d.ts.map +1 -0
  181. package/dist/skills/server-entry-skills.js +119 -0
  182. package/dist/skills/server-entry-skills.js.map +1 -0
  183. package/dist/skills/staging-content.js +1 -1
  184. package/package.json +10 -6
  185. package/skills/goose-ads/SKILL.md +27 -605
  186. package/skills/goose-product-photos/SKILL.md +24 -217
  187. package/skills/goose-video/SKILL.md +23 -610
  188. package/skills/goose-video-local/SKILL.md +3 -1609
  189. package/skills/gooseworks/SKILL.md +58 -529
  190. package/skills/make-custom-video/SKILL.md +23 -725
  191. package/skills/manifest.json +7 -7
  192. package/skills/routes.json +10 -24
  193. package/dist/commands/video-local.d.ts +0 -9
  194. package/dist/commands/video-local.d.ts.map +0 -1
  195. package/dist/commands/video-local.js +0 -83
  196. package/dist/commands/video-local.js.map +0 -1
  197. package/dist/commands/video-save.d.ts +0 -3
  198. package/dist/commands/video-save.d.ts.map +0 -1
  199. package/dist/commands/video-save.js +0 -83
  200. package/dist/commands/video-save.js.map +0 -1
  201. package/dist/lib/video-local-captions.d.ts +0 -83
  202. package/dist/lib/video-local-captions.d.ts.map +0 -1
  203. package/dist/lib/video-local-captions.js +0 -261
  204. package/dist/lib/video-local-captions.js.map +0 -1
  205. package/dist/lib/video-local-runtime.d.ts +0 -8
  206. package/dist/lib/video-local-runtime.d.ts.map +0 -1
  207. package/dist/lib/video-local-runtime.js +0 -201
  208. package/dist/lib/video-local-runtime.js.map +0 -1
  209. package/dist/lib/video-save-mcp.d.ts +0 -9
  210. package/dist/lib/video-save-mcp.d.ts.map +0 -1
  211. package/dist/lib/video-save-mcp.js +0 -162
  212. package/dist/lib/video-save-mcp.js.map +0 -1
  213. package/dist/lib/video-save.d.ts +0 -77
  214. package/dist/lib/video-save.d.ts.map +0 -1
  215. package/dist/lib/video-save.js +0 -440
  216. package/dist/lib/video-save.js.map +0 -1
  217. package/dist/skills/custom-video-skill.d.ts +0 -3
  218. package/dist/skills/custom-video-skill.d.ts.map +0 -1
  219. package/dist/skills/custom-video-skill.js +0 -6
  220. package/dist/skills/custom-video-skill.js.map +0 -1
@@ -1,230 +1,37 @@
1
1
  ---
2
2
  name: goose-product-photos
3
3
  slug: goose-product-photos
4
- description: >
5
- GooseWorks Product Photos — turn a brand's product images into publish-ready photography
6
- (clean studio shots, lifestyle scenes, on-model looks) while keeping the product faithful
7
- (silhouette, materials, logo, colorway). You pick a brand + product and submit; the GooseWorks
8
- backend runs the SAME server-side pipeline the Product Photos studio uses (compose → generate →
9
- judge → auto-retry) and bills credits. Use when the user says "make product photos", "shoot my
10
- product", "studio/lifestyle/on-model photo of <product>", "generate product photography", or
11
- references a product to photograph. Unlike goose-ads (ad creative) this produces clean PRODUCT
12
- photos that can then feed the ad workflow.
4
+ description: Make product photos (studio, lifestyle or on a model) of a brand's real products with GooseWorks in this chat. Start with brand_read and follow the next_step in every answer.
13
5
  category: ads
14
- version: 0.3.0
6
+ version: 1.0.0
15
7
  author: GooseWorks
16
- tags: [gooseworks, ads, product-photos, photoshoot, product, ecommerce, studio, lifestyle, on-model]
17
8
  ---
18
9
 
19
- # GooseWorks Product Photos — branded product photography
10
+ # GooseWorks product photos
20
11
 
21
- The GooseWorks Product Photos skill. You **pick a brand + product and submit one generation**;
22
- the **backend** runs the whole pipeline (compose the shot prompt → generate → judge for product
23
- fidelity → auto-retry a few times for free) and stores the results. You do NOT
24
- generate images, call a model, or manage files — this is the exact same workflow the Product
25
- Photos studio uses, so the skill and the app can never drift. The point is to **enrich a brand's
26
- usable product imagery** — approved photos join the brand kit and can then feed the ad workflow
27
- (`goose-ads`).
12
+ Use GooseWorks to photograph the customer's physical products, here in this chat. A software
13
+ screen or an app is not a product photo.
28
14
 
29
- It shoots a **physical catalog product** (apparel, beauty, consumer goods). A software
30
- screenshot or an app mockup is not a product photo: that is an image edit, not this skill.
15
+ - Offer the brand's real products from brand_read; never describe one you can't see. A product
16
+ that isn't listed yet: brand_update adds it from its page. A photo the customer sends:
17
+ media_upload.
18
+ - photos_generate makes the photos: get its price first, tell the customer the credit total, and
19
+ make them only after their yes. Show a person only when the customer asks for one and confirms
20
+ they have the rights.
21
+ - Follow the photos with photos_read until they are ready.
22
+ - Keep or drop photos with media_update. Only kept photos join the brand kit and reach ads.
31
23
 
32
- ## How to talk to the customer (applies to every message you send them)
33
-
34
- The customer is a marketer or founder, not an engineer. Everything in this skill about tools,
35
- fields, files, polling, models and pipeline steps is for YOU. Never pass it on to them.
36
-
37
- - **Say what they get and what they need to decide, never how it's made.**
38
- Bad: "Checking the media-proxy helpers for voiceover timestamps and lipsync." / "Generated with
39
- gpt-image-2 at high quality, mouth closed, passes QC."
40
- Good: "Recording the voices now." / "Here are your two hosts."
41
- - **Never mention** tool, file or field names, ids, JSON, commands, scripts, installed software,
42
- uploads, model or vendor names, timings in seconds or frames, retries, polling, internal statuses
43
- or your own quality checks. Fix what you can quietly. If they ask how something works, explain it
44
- simply.
45
- - **Update them only at milestones they care about**: choices confirmed, script and voices done,
46
- visuals done, ready to review, finished. One short line each, then stay quiet until the next
47
- milestone. No update for setup, downloads, uploads or saving.
48
- - **Money is in credits, with a number**: "the full video uses about N credits". Never "the cheap
49
- pieces" or "the expensive render".
50
- - **Problems:** say what it means for them and what they can do, in one or two sentences. No error
51
- codes or stack traces. Only raise a problem that changes something for them.
52
- - **Use their words**: script, voice, hook, scene, host, ending, logo, the product shot.
53
- - **No filler**: no "Great question!", "Certainly!", "I hope this helps!", no restating what they
54
- just said at length.
55
-
56
- Example. Instead of a dozen lines about render tools, scripts, uploads and portraits, send:
57
- "Got it: warm tone, home podcast studio, Brielle as the skeptic and Mark as the believer." then
58
- "Script and voices are done (about 34 seconds)." then "Ready for you to review: the script, voices,
59
- both hosts and the ending. You can also review your recipe ingredients in the app: <link>. Say go
60
- here and I'll make the full video (about N credits)."
61
-
62
- ## Use current instructions for new work
63
-
64
- Before a new task in a terminal host, run `gooseworks skills status` once. It compares the
65
- installed entry files, running CLI and published npm release. An older CLI needs a package
66
- upgrade before `gooseworks update`; update alone only uses that CLI's bundled instructions.
67
- Preserve local edits or unknown install provenance. Review/back up before explicitly replacing
68
- modified files; never quietly reinstall over them. If the release check is unavailable, report
69
- that freshness is unknown rather than claiming the local copy is latest.
70
-
71
- For a new recipe run, fetch its package from the connected catalog. Retain the returned
72
- `version` / `contentHash` and every dependency's hash with the saved package. When reusing a
73
- saved fetch JSON, `gooseworks fetch <slug> --saved-package <file>` returns the current package
74
- and a hash comparison without changing that file. With MCP, if the advertised `catalog_fetch`
75
- schema accepts them, send `saved_content_hash` and `saved_dependency_hashes`; otherwise fetch
76
- normally and compare the returned hashes yourself. Missing hashes mean unknown, not current.
77
- The server cannot inspect a client's saved files; hash metadata does not certify later edits.
78
- Fetch current packages into a new run directory and report stale saved instructions. Preserve
79
- an existing approved run's recorded package; changing that harness requires a reviewed change
80
- and approval before spending. Hosted installed snapshots use the existing Skills Update action.
81
- Skill content and a host's cached MCP tool schemas are separate: refreshing one does not refresh
82
- the other. Check the actual advertised tools before using new fields.
83
-
84
- ## No GooseWorks tools in this session? Call them through the CLI
85
-
86
- The GooseWorks tools named here (for example `account_whoami`, `brand_onboarding`,
87
- `brand_read`) normally come from the GooseWorks connector. If they are not registered in this
88
- session but you have a shell with the `gooseworks` CLI signed in (a cloud sandbox such as
89
- ChatGPT agent, Meta AI or Grok), call the same tool from the shell:
90
-
91
- ```bash
92
- npx gooseworks tool <name> '<arguments as a JSON object>'
93
- ```
94
-
95
- - Run `npx gooseworks tool --list` once first. It prints the server's rules for using the tools
96
- and every tool name; `npx gooseworks tool <name> --schema` shows one tool's arguments.
97
- - The result prints as JSON. When a tool answers with a one-line summary, the fields you act on
98
- (such as `next_step` and ids) follow under "Data:". It exits 1 when the tool reports an error.
99
- - Nothing renders as a widget here, so tell the user the result in plain words.
100
- - The same rules apply as over the connector: state the credit total and get the user's yes
101
- before paid work.
102
- - If it says you are not logged in, run `npx gooseworks login --device --no-wait`, show the
103
- user the link and code it prints, and run `npx gooseworks login --device` once they approve.
104
-
105
- When the tools are registered in this session, call them directly instead.
106
-
107
- ## Prerequisite — the GooseWorks connector tools
108
-
109
- Everything below runs through the GooseWorks connector's tools, by the names this skill uses.
110
- Match on the tool name: a coding agent may show a server prefix (for example
111
- `mcp__gooseworks__photos_generate`), a chat app may not.
112
-
113
- If a tool named here is missing, the GooseWorks connection or its tool list is stale: ask the
114
- user to reconnect or refresh GooseWorks in their app's connector settings. Installing or
115
- updating the `gooseworks` CLI never fixes a missing connector tool, so never send a chat-app
116
- user to a terminal for it. Only a terminal coding agent (Claude Code, Codex, Cursor) that has no
117
- GooseWorks tools at all connects them, in that terminal, with `gooseworks install --mcp` plus
118
- `--claude`, `--codex` or `--cursor`, then a restart.
119
-
120
- Older notes or skill copies may name tools the connector no longer lists. Use the tool this skill
121
- names instead; `catalog_fetch { type: "skill", slug: "gooseworks-guide" }` maps every old name.
122
-
123
- ## Start from the brand context — don't re-ask what it already answers
124
-
125
- If the `gooseworks` router handed you brand context, USE IT. If you were invoked directly, call
126
- `brand_read { brand_id, sections: ["summary","kit","products","learnings"] }` yourself first, then
127
- `knowledge_search { brand_id, query: "<the shoot, in the user's words>" }` for saved rules and past
128
- feedback (an archived photo's reason is saved as a `dont` rule). They answer most of the setup
129
- questions below, so **do not ask the user for them**:
130
-
131
- - **Which product?** — the context's `products` are the real catalog entries. Offer them; never
132
- invent a product or ask the user to describe one you can already see.
133
- - **What does it look like / what is it made of?** — grounded in the product's stored images and
134
- description. Never guess a material, colorway, or silhouette.
135
- - **What vibe / who is it for?** — the context's voice, positioning, and audience already say. Let
136
- them shape the scene and styling instead of asking "what mood do you want?".
137
- - **Brand look** — logo, colors, and fonts are owned by the backend research pass. Read them, never
138
- re-derive them.
139
-
140
- Ask only for the genuinely open choices: the shot `category`, how many photos, quality, and
141
- whether a human model is wanted (which needs explicit consent — see the rules).
142
-
143
- ## Credits — state the total, then get a yes
144
-
145
- - One token authenticates the tools and resolves your org; never print it. Omit `target`.
146
- - **Quote first.** Call `photos_generate` with the exact arguments you will submit plus
147
- `dry_run: true`. It reserves nothing and returns `creditsPerOutput` and `totalCredits`. Pass
148
- `count` and `quality` explicitly in both calls so the quote matches the run.
149
- - **Nothing paid runs without the user's explicit yes in this chat, given after you state that
150
- credit total.** Then submit the same call without `dry_run`.
151
- - The submit reserves the quoted credits and bills only the photos that pass the judge:
152
- **automatic retries are free**, and a photo the judge can't get right (`flagged`) is shown but
153
- **never billed**. The balance is `credits.available_credits` from `account_whoami`. If the
154
- wallet is short, say so plainly with the total and the balance, and stop.
155
-
156
- ## The tools
157
-
158
- **Pick the brand + product**
159
- - `brand_read` with no `brand_id` — the user's brands (each row's `id` is the `brand_id`).
160
- - `brand_read { brand_id, sections: ["products"], products_query: "<name>" }` — the brand's
161
- imported products in `products.items`; a product's `id` is the `product_id` to shoot.
162
- `products_query` matches name / type / variant / SKU / description.
163
- - Import a product that isn't in the catalog yet (free):
164
- `brand_update { brand_id, patch: { products: [{ import_url, import_kind, name? }] } }`.
165
- `import_kind` is `product_url` (a single product page), `shopify_store` (a store URL → imports
166
- the catalog), or `image_url` (a direct image; also needs `name`). It returns `jobs[]`: poll
167
- `job_get { job_id, kind: "product_import" }` until it finishes, then read the products again.
168
- To add a photo the user attached to an existing product:
169
- `media_upload { brand_id, scope: "product", scope_id: <product_id>, kind: "reference", source: { type: "bytes", filename, content_base64 } }`.
170
-
171
- **Generate**
172
- - `photos_generate { brand_id, product_id, variant_id?, category, controls?, prompt?, count,
173
- quality, reference_image_urls?, attestation_accepted?, dry_run? }` — **the one call that makes
174
- photos** (and, with `dry_run: true`, its free quote). `category` is `apparel` | `beauty` |
175
- `cpg` (seeds sensible scene/framing defaults). `count` is 1, 2, 4, or 8; `quality` is
176
- `low` | `medium` | `high`. Omit `controls` to use the category preset; pass `prompt` as
177
- free-text steering **added on top of** the settings (it doesn't replace them). Returns the
178
- generation with its `id` **immediately**.
179
- **If you request a human model** (`controls.model.presence` is not `none`) you MUST pass
180
- `attestation_accepted: true` to confirm the user has the rights for model imagery.
181
- - `photos_read { brand_id, generation_id }` — poll until `status` is `complete`,
182
- `partial_failure`, or `failed` (`job_get { job_id: <generation id>, kind: "photo_generation" }`
183
- works too). Each `outputs[]` entry has its own `id`, `status` and, once ready, a
184
- `final_image_url`. A `flagged` output is the best attempt but wasn't billed.
185
-
186
- **Use the results**
187
- - `photos_read { brand_id, archived?, product_id?, status? }` — the brand's generated photos
188
- (`archived: false` = active, `true` = archived).
189
- - `photos_update { brand_id, output_id, action: "approve" }` — approve a photo: links it to the
190
- product and makes it available in the **brand kit**, so `goose-ads` can use it. **Photos are
191
- not used anywhere until approved.**
192
- - `photos_update { brand_id, output_id, action: "archive", reason? }` — archive a photo; archived
193
- photos are **excluded** from ad generation, and the reason is saved as a `dont` rule.
194
-
195
- ## Workflow — shoot a product
196
-
197
- 1. **Load the brand context** (`brand_read` + `knowledge_search`, or reuse what the router passed
198
- you) and **resolve the brand + product.** Pick a `product_id` from the catalog you already
199
- know about. If the product genuinely isn't there, import it and poll the import.
200
- 2. **Quote the cost.** `photos_generate` with `dry_run: true` and the exact `brand_id`,
201
- `product_id`, `category`, `count` and `quality` → tell the user the credit total and wait
202
- for their explicit yes.
203
- 3. **Generate.** The same `photos_generate` call without `dry_run` (add `prompt` built from the
204
- brand's voice/positioning you already have — don't interview the user for it). Returns a
205
- generation `id` right away.
206
- 4. **Poll.** `photos_read { brand_id, generation_id }` every ~20-30s until terminal; show each
207
- `final_image_url`.
208
- 5. **Approve the keepers.** Show the results and let the user pick; `photos_update` with
209
- `action: "approve"` the ones they'd publish (that's what puts them in the brand kit for ads),
210
- `action: "archive"` the rest.
24
+ Then follow the next_step in every answer.
211
25
 
212
26
  ## Rules
213
27
 
214
- - **Connector tools only** — a missing tool means the GooseWorks connection is stale: ask the
215
- user to reconnect or refresh GooseWorks. Never send a chat-app user to a terminal or a CLI
216
- install.
217
- - **Never invent product facts.** The backend grounds the shot on the product's real images; don't
218
- describe a product you can't see.
219
- - **Use the brand context instead of interviewing the user.** Product, audience, voice, positioning,
220
- logo/colors/fonts all come from `brand_read` / the brand kit. Ask only for the shot
221
- category, count, quality, and model consent.
222
- - **Ask before spending.** State the dry-run credit total and get the user's explicit yes before
223
- the real `photos_generate` — it reserves credits.
224
- - **Poll, don't re-submit.** A generation that's still `running` is not stuck; re-submitting
225
- double-bills. A `failed` generation may still hold `flagged` photos (shown, never billed):
226
- show those first, and run again only after a new quote and the user's yes.
227
- - **Model imagery needs consent.** Only set a human model when the user asks, and pass
228
- `attestation_accepted: true`.
229
- - **Approval is the hand-off to ads.** Remind the user that only **approved** photos reach the brand
230
- kit / ad workflow; archived ones never do.
28
+ - Talk to marketers: what they get and what they decide, never how it is made.
29
+ - Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.
30
+ - Everything happens in this chat: never ask the customer to install anything or use a CLI, slash command or other app; the only commands are gooseworks video check and gooseworks video make <id>, when a next_step gives them.
31
+ - Money is a credit number, exactly as an answer gives it: never dollars, never your own math.
32
+ - Follow the next_step in every answer; it says what to do now.
33
+ - With a card on screen (display_hint "widget"), add at most one short line; never re-list it or its links.
34
+ - Paid work needs the customer's yes to the credit total first. For video only their click on the plan card counts; you never approve.
35
+ - Before choosing an angle, claim, product or source, or asking a brand fact: brand_read, then knowledge_search for the task.
36
+ - Never invent an offer, a claim or proof.
37
+ - GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.