gooseworks 0.2.10 → 0.3.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/README.md CHANGED
@@ -149,6 +149,37 @@ Standalone skills installed with `--with` skip the catalog search step. After `n
149
149
  | Enrichment | Contact enrichment, company research, tech stack |
150
150
  | Monitoring | Newsletter scanning, review site tracking |
151
151
 
152
+ ## Ads creation (`ads-remix`)
153
+
154
+ Alongside the GTM `gooseworks` skill, the CLI installs a **separate** `ads-remix` entry
155
+ skill for creating ad creative — remix a static ad template into a branded ad, or read a
156
+ brand for ads. Claude auto-loads whichever skill matches the task; the two are
157
+ domain-scoped and never merged.
158
+
159
+ ```bash
160
+ gooseworks install --claude --mcp
161
+ ```
162
+
163
+ Then in Claude Code: *"remix template `<id>` for `<your-site>`"*.
164
+
165
+ **The GooseWorks MCP server is REQUIRED for ads.** All brand/project/render reads and
166
+ writes go through the `gooseworks` MCP server (e.g. `get_brand_kit`, `submit_render`).
167
+ `install` registers it with `--mcp` (or `--all`) and verifies it's reachable; if it isn't,
168
+ you'll see a warning — the ads flow will fail without MCP. Re-run
169
+ `gooseworks install --claude --mcp` if needed.
170
+
171
+ Media generation (image edits) is billed to your GooseWorks credits via the media proxy —
172
+ no separate ad-credit balance.
173
+
174
+ ### Keeping skills up to date
175
+
176
+ - **Entry skills** (`gooseworks`, `ads-remix`) are vendored in the CLI. They're (re)installed
177
+ on `install`/`update`, and **refreshed on `login`** — but only when their content actually
178
+ changed (a content-hash stamp skips unchanged ones, so re-running is cheap). Bump the CLI
179
+ (`npx gooseworks@latest …`) to get new entry-skill content.
180
+ - **Recipe skills** (e.g. `remix-graphic-ad-from-reference`) are **fetched live** from
181
+ goose-skills each time they're used, so they're always current — nothing to update.
182
+
152
183
  ## File Layout
153
184
 
154
185
  ### Credentials
@@ -163,7 +194,11 @@ Standalone skills installed with `--with` skip the catalog search step. After `n
163
194
  ```
164
195
  ~/.agents/skills/
165
196
  ├── gooseworks/
166
- └── SKILL.md # GooseWorks skill — teaches your agent to use 100+ data tools
197
+ ├── SKILL.md # GTM skill — teaches your agent to use 100+ data tools
198
+ │ └── .gooseworks-version # content-hash stamp (freshness check; skip rewrite if unchanged)
199
+ ├── ads-remix/
200
+ │ ├── SKILL.md # Ads-creation entry skill (remix + brand context; requires MCP)
201
+ │ └── .gooseworks-version
167
202
  └── goose-graphics/
168
203
  └── SKILL.md # Optional standalone skill installed with --with
169
204
  ```
@@ -173,6 +208,7 @@ Standalone skills installed with `--with` skip the catalog search step. After `n
173
208
  ```
174
209
  ~/.claude/skills/
175
210
  ├── gooseworks → ~/.agents/skills/gooseworks
211
+ ├── ads-remix → ~/.agents/skills/ads-remix
176
212
  └── goose-graphics → ~/.agents/skills/goose-graphics
177
213
  ```
178
214
 
@@ -7,5 +7,15 @@
7
7
  * Returns true if configured, false if skipped (missing mcp_server_url).
8
8
  */
9
9
  export declare function configureClaudeMcp(): boolean;
10
+ /**
11
+ * Verify the GooseWorks MCP server is reachable (its unauthenticated /health
12
+ * endpoint). Ads creation REQUIRES MCP, so install surfaces this loudly. Returns
13
+ * { ok } — never throws. Confirms reachability, not token validity (that surfaces
14
+ * on the first tool call).
15
+ */
16
+ export declare function verifyMcpReachable(timeoutMs?: number): Promise<{
17
+ ok: boolean;
18
+ error?: string;
19
+ }>;
10
20
  export declare function removeClaudeMcp(): void;
11
21
  //# sourceMappingURL=claude-mcp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-mcp.d.ts","sourceRoot":"","sources":["../../src/agents/claude-mcp.ts"],"names":[],"mappings":"AA6CA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAuB5C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAiBtC"}
1
+ {"version":3,"file":"claude-mcp.d.ts","sourceRoot":"","sources":["../../src/agents/claude-mcp.ts"],"names":[],"mappings":"AA6CA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAuB5C;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBnG;AAED,wBAAgB,eAAe,IAAI,IAAI,CAiBtC"}
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.configureClaudeMcp = configureClaudeMcp;
37
+ exports.verifyMcpReachable = verifyMcpReachable;
37
38
  exports.removeClaudeMcp = removeClaudeMcp;
38
39
  const fs = __importStar(require("fs"));
39
40
  const path = __importStar(require("path"));
@@ -96,6 +97,36 @@ function configureClaudeMcp() {
96
97
  writeConfig(config);
97
98
  return true;
98
99
  }
100
+ /**
101
+ * Verify the GooseWorks MCP server is reachable (its unauthenticated /health
102
+ * endpoint). Ads creation REQUIRES MCP, so install surfaces this loudly. Returns
103
+ * { ok } — never throws. Confirms reachability, not token validity (that surfaces
104
+ * on the first tool call).
105
+ */
106
+ async function verifyMcpReachable(timeoutMs = 5000) {
107
+ const creds = (0, credentials_1.getCredentials)();
108
+ if (!creds?.mcp_server_url)
109
+ return { ok: false, error: 'no mcp_server_url in credentials' };
110
+ let healthUrl;
111
+ try {
112
+ healthUrl = new URL('/health', creds.mcp_server_url).toString();
113
+ }
114
+ catch {
115
+ return { ok: false, error: `invalid mcp_server_url: ${creds.mcp_server_url}` };
116
+ }
117
+ const controller = new AbortController();
118
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
119
+ try {
120
+ const res = await fetch(healthUrl, { signal: controller.signal });
121
+ return res.ok ? { ok: true } : { ok: false, error: `health check returned ${res.status}` };
122
+ }
123
+ catch (err) {
124
+ return { ok: false, error: err?.message || 'unreachable' };
125
+ }
126
+ finally {
127
+ clearTimeout(timer);
128
+ }
129
+ }
99
130
  function removeClaudeMcp() {
100
131
  try {
101
132
  if (!fs.existsSync(CLAUDE_CONFIG_PATH))
@@ -1 +1 @@
1
- {"version":3,"file":"claude-mcp.js","sourceRoot":"","sources":["../../src/agents/claude-mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-mcp.js","sourceRoot":"","sources":["../../src/agents/claude-mcp.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,oBAAoB,IAAI,OAAO,CA2G9C;AAED,eAAO,MAAM,cAAc,SAAyB,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,oBAAoB,IAAI,OAAO,CAqH9C;AAED,eAAO,MAAM,cAAc,SAAyB,CAAC"}
@@ -74,12 +74,12 @@ Examples:
74
74
  logger.step(1, 3, 'Authenticating...');
75
75
  const creds = await (0, login_1.ensureLoggedIn)(opts.apiBase);
76
76
  logger.success(`Logged in as ${creds.email}`);
77
- // Step 2: Install master skill (clean old skills first)
78
- logger.step(2, 3, 'Installing GooseWorks skill...');
77
+ // Step 2: Install entry skills (clean old skills first)
78
+ logger.step(2, 3, 'Installing GooseWorks skills...');
79
79
  (0, installer_1.removeAllSkills)();
80
- const masterContent = (0, master_skill_1.getMasterSkillContent)();
81
- (0, installer_1.installMasterSkill)(masterContent);
82
- logger.success('Installed GooseWorks skill to ~/.agents/skills/gooseworks/');
80
+ for (const r of (0, installer_1.installManagedEntrySkills)((0, master_skill_1.getEntrySkills)(), { force: true })) {
81
+ logger.success(`Installed ${r.name} skill to ~/.agents/skills/${r.name}/`);
82
+ }
83
83
  for (const slug of opts.with || []) {
84
84
  try {
85
85
  logger.info(`Installing standalone skill ${slug}...`);
@@ -109,6 +109,15 @@ Examples:
109
109
  if (wantMcp) {
110
110
  if ((0, claude_mcp_1.configureClaudeMcp)()) {
111
111
  logger.success("Registered 'gooseworks' MCP server in ~/.claude.json");
112
+ // Ads creation REQUIRES a reachable MCP server — verify and fail loud.
113
+ const mcp = await (0, claude_mcp_1.verifyMcpReachable)();
114
+ if (mcp.ok) {
115
+ logger.success('GooseWorks MCP server reachable');
116
+ }
117
+ else {
118
+ logger.warn(`GooseWorks MCP server NOT reachable (${mcp.error}). Ads creation requires it — ` +
119
+ 'restart Claude Code and check your connection; the ads-remix skill will fail without MCP.');
120
+ }
112
121
  }
113
122
  else {
114
123
  logger.info("Skipped MCP (no mcp_server_url in credentials — older backend?)");
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAmBrB,CAAC;AAEL;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,MAAiB,sDAW9D"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,eAAO,MAAM,YAAY,SAqBrB,CAAC;AAEL;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,MAAiB,sDAW9D"}
@@ -38,8 +38,31 @@ exports.ensureLoggedIn = ensureLoggedIn;
38
38
  const commander_1 = require("commander");
39
39
  const credentials_1 = require("../auth/credentials");
40
40
  const oauth_server_1 = require("../auth/oauth-server");
41
+ const installer_1 = require("../skills/installer");
42
+ const master_skill_1 = require("../skills/master-skill");
43
+ const claude_1 = require("../agents/claude");
44
+ const detect_1 = require("../agents/detect");
41
45
  const logger = __importStar(require("../utils/logger"));
42
46
  const config_1 = require("../config");
47
+ /**
48
+ * Refresh vendored entry skills on login for users who have already set up
49
+ * (`gooseworks` skill present). This is the "update skills on login": it picks up
50
+ * new or content-changed entry skills (e.g. the ads-remix skill) without
51
+ * rewriting unchanged ones, then re-symlinks Claude so the new skill is visible.
52
+ * Bootstrapping a first-time install stays the job of `gooseworks install`.
53
+ */
54
+ function refreshEntrySkillsOnLogin() {
55
+ if (!(0, installer_1.getInstalledSkills)().includes('gooseworks'))
56
+ return;
57
+ const changed = (0, installer_1.installManagedEntrySkills)((0, master_skill_1.getEntrySkills)())
58
+ .filter((r) => r.action === 'installed')
59
+ .map((r) => r.name);
60
+ if (changed.length === 0)
61
+ return;
62
+ logger.success(`Refreshed skills: ${changed.join(', ')}`);
63
+ if ((0, detect_1.isAgentInstalled)('claude'))
64
+ (0, claude_1.configureClaude)();
65
+ }
43
66
  exports.loginCommand = new commander_1.Command('login')
44
67
  .description('Sign in to GooseWorks with Google')
45
68
  .option('--api-base <url>', 'API base URL', config_1.API_BASE)
@@ -47,12 +70,14 @@ exports.loginCommand = new commander_1.Command('login')
47
70
  const existing = (0, credentials_1.getCredentials)();
48
71
  if (existing) {
49
72
  logger.success(`Already logged in as ${existing.email}`);
73
+ refreshEntrySkillsOnLogin();
50
74
  logger.info('Run "gooseworks logout" first to switch accounts.');
51
75
  return;
52
76
  }
53
77
  try {
54
78
  const result = await (0, oauth_server_1.runOAuthFlow)(opts.apiBase);
55
79
  logger.success(`Logged in as ${result.email}`);
80
+ refreshEntrySkillsOnLogin();
56
81
  }
57
82
  catch (err) {
58
83
  const message = err instanceof Error ? err.message : 'Login failed';
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,wCAWC;AA1CD,yCAAoC;AACpC,qDAAqD;AACrD,uDAAoD;AACpD,wDAA0C;AAC1C,sCAAqC;AAExB,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,iBAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,QAAQ,GAAG,IAAA,4BAAc,GAAE,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,wBAAwB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,UAAkB,iBAAQ;IAC7D,MAAM,QAAQ,GAAG,IAAA,4BAAc,GAAE,CAAC;IAClC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,wCAWC;AAjED,yCAAoC;AACpC,qDAAqD;AACrD,uDAAoD;AACpD,mDAAoF;AACpF,yDAAwD;AACxD,6CAAmD;AACnD,6CAAoD;AACpD,wDAA0C;AAC1C,sCAAqC;AAErC;;;;;;GAMG;AACH,SAAS,yBAAyB;IAChC,IAAI,CAAC,IAAA,8BAAkB,GAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO;IACzD,MAAM,OAAO,GAAG,IAAA,qCAAyB,EAAC,IAAA,6BAAc,GAAE,CAAC;SACxD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,CAAC,OAAO,CAAC,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAA,yBAAgB,EAAC,QAAQ,CAAC;QAAE,IAAA,wBAAe,GAAE,CAAC;AACpD,CAAC;AAEY,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,iBAAQ,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,QAAQ,GAAG,IAAA,4BAAc,GAAE,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,wBAAwB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,yBAAyB,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,gBAAgB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,yBAAyB,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,UAAkB,iBAAQ;IAC7D,MAAM,QAAQ,GAAG,IAAA,4BAAc,GAAE,CAAC;IAClC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAY,EAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -52,11 +52,11 @@ exports.updateCommand = new commander_1.Command('update')
52
52
  logger.error('Not logged in. Run "gooseworks login" first.');
53
53
  process.exit(1);
54
54
  }
55
- logger.step(1, 2, 'Updating skill...');
55
+ logger.step(1, 2, 'Updating skills...');
56
56
  (0, installer_1.removeAllSkills)();
57
- const masterContent = (0, master_skill_1.getMasterSkillContent)();
58
- (0, installer_1.installMasterSkill)(masterContent);
59
- logger.success('Updated GooseWorks skill');
57
+ for (const r of (0, installer_1.installManagedEntrySkills)((0, master_skill_1.getEntrySkills)(), { force: true })) {
58
+ logger.success(`Updated ${r.name} skill`);
59
+ }
60
60
  logger.step(2, 2, 'Reconfiguring agents...');
61
61
  if ((0, detect_1.isAgentInstalled)('claude')) {
62
62
  (0, claude_1.configureClaude)();
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,qDAAqD;AACrD,mDAA0E;AAC1E,6CAAmD;AACnD,qDAA0D;AAC1D,2CAAiD;AACjD,6CAA8E;AAC9E,6CAAoD;AACpD,yDAA+D;AAC/D,wDAA0C;AAE7B,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACvC,IAAA,2BAAe,GAAE,CAAC;IAClB,MAAM,aAAa,GAAG,IAAA,oCAAqB,GAAE,CAAC;IAC9C,IAAA,8BAAkB,EAAC,aAAa,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAE7C,IAAI,IAAA,yBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAA,wBAAe,GAAE,CAAC;QAClB,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,IAAA,+BAAkB,GAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAA,yBAAgB,EAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,IAAA,sBAAc,GAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,IAAA,yBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAI,IAAA,kCAAyB,GAAE,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAA,wBAAe,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,qDAAqD;AACrD,mDAAiF;AACjF,6CAAmD;AACnD,qDAA0D;AAC1D,2CAAiD;AACjD,6CAA8E;AAC9E,6CAAoD;AACpD,yDAAwD;AACxD,wDAA0C;AAE7B,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACxC,IAAA,2BAAe,GAAE,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,IAAA,qCAAyB,EAAC,IAAA,6BAAc,GAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAE7C,IAAI,IAAA,yBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAA,wBAAe,GAAE,CAAC;QAClB,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,IAAA,+BAAkB,GAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAA,yBAAgB,EAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,IAAA,sBAAc,GAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,IAAA,yBAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,IAAI,IAAA,kCAAyB,GAAE,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAA,wBAAe,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { EntrySkill } from './master-skill';
1
2
  export interface InstallStandaloneSkillOptions {
2
3
  onProgress?: (progress: {
3
4
  downloaded: number;
@@ -6,6 +7,22 @@ export interface InstallStandaloneSkillOptions {
6
7
  }
7
8
  export declare function getSkillsBasePath(): string;
8
9
  export declare function installMasterSkill(masterSkillMd: string): void;
10
+ /** True when the entry skill is installed AND its stamp matches `content`. */
11
+ export declare function isEntrySkillFresh(name: string, content: string): boolean;
12
+ /** Write one entry skill + its freshness stamp. */
13
+ export declare function installEntrySkill(skill: EntrySkill): void;
14
+ export interface EntrySkillInstallResult {
15
+ name: string;
16
+ action: 'installed' | 'skipped';
17
+ }
18
+ /**
19
+ * Install all vendored entry skills. With `force` (explicit install/update) each
20
+ * is rewritten unconditionally; without it (e.g. refresh-on-login) only missing
21
+ * or content-changed skills are rewritten — unchanged ones are skipped.
22
+ */
23
+ export declare function installManagedEntrySkills(skills: EntrySkill[], { force }?: {
24
+ force?: boolean;
25
+ }): EntrySkillInstallResult[];
9
26
  export declare function installStandaloneSkill(slug: string, options?: InstallStandaloneSkillOptions): Promise<void>;
10
27
  export declare function getInstalledSkills(): string[];
11
28
  export declare function removeAllSkills(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAoCf;AA0CD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAS7C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAQtC"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgBjD,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAeD,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQxE;AAED,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAKzD;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,UAAU,EAAE,EACpB,EAAE,KAAa,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,uBAAuB,EAAE,CAQ3B;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAoCf;AA0CD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAS7C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAQtC"}
@@ -35,12 +35,16 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.getSkillsBasePath = getSkillsBasePath;
37
37
  exports.installMasterSkill = installMasterSkill;
38
+ exports.isEntrySkillFresh = isEntrySkillFresh;
39
+ exports.installEntrySkill = installEntrySkill;
40
+ exports.installManagedEntrySkills = installManagedEntrySkills;
38
41
  exports.installStandaloneSkill = installStandaloneSkill;
39
42
  exports.getInstalledSkills = getInstalledSkills;
40
43
  exports.removeAllSkills = removeAllSkills;
41
44
  const fs = __importStar(require("fs"));
42
45
  const path = __importStar(require("path"));
43
46
  const os = __importStar(require("os"));
47
+ const crypto = __importStar(require("crypto"));
44
48
  const names_1 = require("./names");
45
49
  const SKILLS_BASE = path.join(os.homedir(), '.agents', 'skills');
46
50
  const GOOSE_SKILLS_TREE_URL = 'https://api.github.com/repos/gooseworks-ai/goose-skills/git/trees/main?recursive=1';
@@ -54,6 +58,49 @@ function installMasterSkill(masterSkillMd) {
54
58
  fs.mkdirSync(masterDir, { recursive: true });
55
59
  fs.writeFileSync(path.join(masterDir, 'SKILL.md'), masterSkillMd, 'utf-8');
56
60
  }
61
+ // ── Vendored entry-skill freshness ──────────────────────────────────────────
62
+ // Entry skills (gooseworks, ads-remix) are vendored in the CLI and written to
63
+ // ~/.agents/skills/<name>/. We stamp each install with a content hash so we can
64
+ // skip rewriting an unchanged skill ("already local → don't call") and rewrite
65
+ // only when the vendored content changed ("updated → call again"). Recipe skills
66
+ // are fetched live via `gooseworks fetch`, so they need no stamping.
67
+ const STAMP_FILE = '.gooseworks-version';
68
+ function entryContentHash(content) {
69
+ return crypto.createHash('sha256').update(content, 'utf-8').digest('hex').slice(0, 16);
70
+ }
71
+ /** True when the entry skill is installed AND its stamp matches `content`. */
72
+ function isEntrySkillFresh(name, content) {
73
+ const dir = path.join(SKILLS_BASE, name);
74
+ if (!fs.existsSync(path.join(dir, 'SKILL.md')))
75
+ return false;
76
+ try {
77
+ return fs.readFileSync(path.join(dir, STAMP_FILE), 'utf-8').trim() === entryContentHash(content);
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ /** Write one entry skill + its freshness stamp. */
84
+ function installEntrySkill(skill) {
85
+ const dir = path.join(SKILLS_BASE, skill.name);
86
+ fs.mkdirSync(dir, { recursive: true });
87
+ fs.writeFileSync(path.join(dir, 'SKILL.md'), skill.content, 'utf-8');
88
+ fs.writeFileSync(path.join(dir, STAMP_FILE), entryContentHash(skill.content), 'utf-8');
89
+ }
90
+ /**
91
+ * Install all vendored entry skills. With `force` (explicit install/update) each
92
+ * is rewritten unconditionally; without it (e.g. refresh-on-login) only missing
93
+ * or content-changed skills are rewritten — unchanged ones are skipped.
94
+ */
95
+ function installManagedEntrySkills(skills, { force = false } = {}) {
96
+ return skills.map((skill) => {
97
+ if (!force && isEntrySkillFresh(skill.name, skill.content)) {
98
+ return { name: skill.name, action: 'skipped' };
99
+ }
100
+ installEntrySkill(skill);
101
+ return { name: skill.name, action: 'installed' };
102
+ });
103
+ }
57
104
  async function installStandaloneSkill(slug, options = {}) {
58
105
  if (!/^[a-z0-9][a-z0-9-]*$/.test(slug)) {
59
106
  throw new Error(`invalid skill slug '${slug}'. Use a slug like goose-graphics.`);
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,40 @@
1
1
  /**
2
- * Returns the master SKILL.md content.
3
- * This is the ONLY skill the CLI installs. It teaches the coding agent
4
- * how to discover and use GooseWorks skills on demand via the
5
- * `gooseworks` CLI commands.
2
+ * The CLI installs two vendored ENTRY skills into ~/.agents/skills/:
3
+ * - `gooseworks` — the GTM/data router (getMasterSkillContent)
4
+ * - `ads-remix` — the ads-creation entry/contract (getAdsSkillContent)
5
+ * Each is a separate Claude Code skill; Claude auto-loads whichever matches the
6
+ * task by its description. They are domain-scoped on purpose — do NOT merge them.
7
+ *
8
+ * Recipe skills (remix-graphic-ad-from-reference, brand-research, …) are NOT
9
+ * vendored here — they live in goose-skills and are fetched live on demand via
10
+ * `gooseworks fetch <slug>`, so they're always current.
11
+ */
12
+ export interface EntrySkill {
13
+ /** Install dir name under ~/.agents/skills/ AND the skill `name`. */
14
+ name: string;
15
+ content: string;
16
+ }
17
+ /** Every entry skill the CLI vendors + installs. */
18
+ export declare function getEntrySkills(): EntrySkill[];
19
+ /**
20
+ * Returns the GTM master SKILL.md content (the `gooseworks` entry skill).
21
+ * It teaches the coding agent how to discover and use GooseWorks skills on
22
+ * demand via the `gooseworks` CLI commands.
6
23
  *
7
24
  * The CLI handles credentials loading internally, so the agent does not
8
25
  * need to read ~/.gooseworks/credentials.json or set environment
9
26
  * variables — every command auto-loads the API key.
10
27
  */
11
28
  export declare function getMasterSkillContent(): string;
29
+ /**
30
+ * Returns the ads-remix entry SKILL.md content (the `ads-remix` entry skill).
31
+ *
32
+ * This is the ads-creation runtime contract: it owns the MCP data I/O (brands,
33
+ * projects, renders), the media proxy, and the render lifecycle, and it routes
34
+ * the creative steps to recipe skills fetched on demand from goose-skills.
35
+ * It is SEPARATE from the `gooseworks` GTM skill — different domain, different
36
+ * tools — and Claude loads it when the user wants to remix an ad or research a
37
+ * brand for ads.
38
+ */
39
+ export declare function getAdsSkillContent(): string;
12
40
  //# sourceMappingURL=master-skill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAyI9C"}
1
+ {"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,wBAAgB,cAAc,IAAI,UAAU,EAAE,CAK7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAyI9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAuK3C"}
@@ -1,11 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEntrySkills = getEntrySkills;
3
4
  exports.getMasterSkillContent = getMasterSkillContent;
5
+ exports.getAdsSkillContent = getAdsSkillContent;
6
+ /** Every entry skill the CLI vendors + installs. */
7
+ function getEntrySkills() {
8
+ return [
9
+ { name: 'gooseworks', content: getMasterSkillContent() },
10
+ { name: 'ads-remix', content: getAdsSkillContent() },
11
+ ];
12
+ }
4
13
  /**
5
- * Returns the master SKILL.md content.
6
- * This is the ONLY skill the CLI installs. It teaches the coding agent
7
- * how to discover and use GooseWorks skills on demand via the
8
- * `gooseworks` CLI commands.
14
+ * Returns the GTM master SKILL.md content (the `gooseworks` entry skill).
15
+ * It teaches the coding agent how to discover and use GooseWorks skills on
16
+ * demand via the `gooseworks` CLI commands.
9
17
  *
10
18
  * The CLI handles credentials loading internally, so the agent does not
11
19
  * need to read ~/.gooseworks/credentials.json or set environment
@@ -149,4 +157,182 @@ gooseworks call apify acts/parseforge~reddit-posts-scraper/runs --body='{"subred
149
157
  8. **Prefer \`gooseworks call\` over raw curl** — if it returns an error, first fix the parameters (check types, required fields, format) and retry. Only fall back to raw curl if you have strong reason to believe it is a CLI bug, not a parameter issue.
150
158
  `;
151
159
  }
160
+ /**
161
+ * Returns the ads-remix entry SKILL.md content (the `ads-remix` entry skill).
162
+ *
163
+ * This is the ads-creation runtime contract: it owns the MCP data I/O (brands,
164
+ * projects, renders), the media proxy, and the render lifecycle, and it routes
165
+ * the creative steps to recipe skills fetched on demand from goose-skills.
166
+ * It is SEPARATE from the `gooseworks` GTM skill — different domain, different
167
+ * tools — and Claude loads it when the user wants to remix an ad or research a
168
+ * brand for ads.
169
+ */
170
+ function getAdsSkillContent() {
171
+ return `---
172
+ name: ads-remix
173
+ slug: ads-remix
174
+ description: >
175
+ Create ad creative for GooseWorks — remix a static (image) ad template into a branded
176
+ ad for the user's product, or research a brand for ads. Use when the user says "remix
177
+ this ad", references a static ad template id/slug, asks to "make an ad", or asks to
178
+ "research my brand". Reads the brand kit, creates the brand + project in GooseWorks, and
179
+ generates the final image through the GooseWorks media proxy (billed to GooseWorks credits).
180
+ category: ads
181
+ version: 1.0.0
182
+ author: GooseWorks
183
+ tags: [gooseworks, ads, remix, static-ad, brand, creative, image]
184
+ ---
185
+
186
+ # GooseWorks Ads — remix & brand context
187
+
188
+ Produce ad creative for GooseWorks and sync results back to the app. This skill owns the
189
+ **runtime contract** (auth, credits, the media proxy, and data I/O via the GooseWorks MCP
190
+ server). The **creative steps** live in recipe skills you fetch on demand — read both; this
191
+ file wins on any conflict about the environment.
192
+
193
+ ## Prerequisite — the GooseWorks MCP server is REQUIRED
194
+
195
+ Every brand/project/render read and write goes through the \`mcp__gooseworks__*\` tools. If
196
+ those tools are not available, **stop and tell the user to run \`gooseworks install --claude --mcp\`**
197
+ (and restart Claude Code). Do not try to fake the data layer with files or HTTP — there is no
198
+ fallback. Media generation uses the proxy (below); everything else uses MCP.
199
+
200
+ ## Identity, token, credits
201
+
202
+ - You act as the org's **Ads agent**. One agent-scoped token authenticates both the
203
+ \`gooseworks\` MCP tools and the media proxy. Never print the token.
204
+ - Generation is billed to GooseWorks credits by the media proxy (per call). There is no
205
+ separate ad-credit gate — nothing blocks at "0 ad credits". Still be economical: pick the
206
+ right route once; don't re-render speculatively. The user can run \`gooseworks credits\`.
207
+
208
+ ## Route by the task
209
+
210
+ - **Static (image) ad remix** ("remix this ad / template", a template id/slug) →
211
+ fetch the recipe with \`gooseworks fetch remix-graphic-ad-from-reference\` and follow it.
212
+ - **Brand research** ("research my brand", "set up brand X") → brand research normally runs
213
+ in the GooseWorks backend; just read the result with \`get_brand_kit\`. Only if the user
214
+ explicitly wants the agent to research locally, fetch \`gooseworks fetch brand-research\`
215
+ and follow it.
216
+
217
+ ## Data I/O — the \`gooseworks\` MCP server (use these, not files)
218
+
219
+ - \`get_brand_kit { brand_id }\` — the CANONICAL brand context: structured fields (name,
220
+ description, audience, voice, brandType, valueProps, colors, typography, logoUrl) PLUS
221
+ presigned reference images (product photos, SaaS screenshots). **This is how you read the
222
+ brand — do NOT read raw brand-pack files.**
223
+ - \`list_ad_brands\` / \`get_ad_brand { brand_id }\` — find/fetch a brand by name or id.
224
+ - \`get_static_ad_template { template_id }\` — the source image to remix: \`source_image_url\`
225
+ (a public CDN URL — pass straight to the generator), \`ratio\`, \`slug\`, and replicability
226
+ hints (\`is_replicable\`, \`remix_engine\`, \`replicability_notes\`). \`template_id\` accepts the
227
+ readable slug OR the uuid.
228
+ - \`create_ad_project { brand_id, name, source_static_template_id }\` — create the remix
229
+ project. **Returns \`app_url\` (the project page) AND \`brand_url\` (the brand gallery) — keep
230
+ BOTH; hand them to the user at the end.**
231
+ - \`submit_render { project_id, kind }\` — open a render row (no credit gate). Sequence it
232
+ AFTER a good gen: generate + verify the image FIRST, then \`submit_render\` +
233
+ \`update_render_status\` back-to-back.
234
+ - \`update_render_status { render_id, status, output_url, thumbnail_url }\` — publish the
235
+ result. **\`output_url\` must be DURABLE** — upload the image into the project folder via
236
+ \`get_upload_url\`, then set \`output_url\` to the render-file URL
237
+ (\`/api/ads/projects/<project_id>/render-file?path=working/<name>.png\`), NOT the raw fal CDN
238
+ URL (it expires). On \`complete\` this also returns \`app_url\` + \`brand_url\`.
239
+ - \`set_final_render { project_id, render_id }\` — if you made more than one version, pin the
240
+ best as final. One render → it's the default; skip.
241
+ - \`get_ad_project\` / \`list_directory\` / \`read_file\` / \`get_upload_url\` / \`get_download_url\`
242
+ / \`append_project_message\` — project/file I/O. **For brand/project files you MUST target the
243
+ org's Ads agent — see "File storage" below; do NOT rely on your token's default agent.**
244
+
245
+ ## File storage — write to the org's ADS AGENT, not your token's agent (CRITICAL)
246
+
247
+ Ad files (renders, brand assets) live in the **org's default Ads agent** scope — that is the
248
+ ONLY scope the app serves render-file URLs from. Your token may be pinned to a DIFFERENT agent
249
+ (e.g. your personal/Gmail agent), so if you omit \`target\` on a file op the upload lands in the
250
+ WRONG agent and the app shows "Image not available". This is the #1 way this flow breaks.
251
+
252
+ 1. **Once, at the start:** call \`list_accessible_scopes\` and pick the agent with
253
+ \`is_org_default: true\` (slug \`org-default\`, usually named "Ads agent"). Call its id \`ADS_AGENT\`.
254
+ Do NOT assume your default/pinned agent is the Ads agent — check \`is_org_default\`.
255
+ 2. **Pass \`target: { type: "agent", agent_id: ADS_AGENT }\` on EVERY file op** —
256
+ \`get_upload_url\`, \`get_download_url\`, \`list_directory\`, \`read_file\` — for anything under
257
+ \`agent-config/brands/<slug>/…\`.
258
+ 3. The render-file URL (\`/api/ads/projects/<id>/render-file?path=…\`) resolves against ADS_AGENT,
259
+ so an upload to ADS_AGENT is exactly what the app serves back.
260
+
261
+ ## Workflow — remix a static template
262
+
263
+ 1. **Resolve the brand + read the FULL kit**: \`list_ad_brands\` by name/site →
264
+ \`get_brand_kit { brand_id }\`. If \`researchStatus\` isn't \`complete\`, tell the user it needs
265
+ research first (the app does it on onboarding); only research locally if they ask. **Read the
266
+ whole kit, not a preview** — you need \`colors\` (palette), \`typography\`, \`products[]\`, and
267
+ \`referenceImages[]\` (each tagged \`productName\` + \`kind\`).
268
+ 2. \`get_static_ad_template { template_id }\` → keep \`source_image_url\` + replicability hints.
269
+ 3. \`create_ad_project { brand_id, name, source_static_template_id }\` → keep \`project_id\` +
270
+ both links.
271
+ 4. **Pick the brand inputs to feed the recipe (don't improvise):**
272
+ - **Hero image** — from \`referenceImages\`, NOT a guess. Physical-product brand → the product's
273
+ image (\`kind: "product"\`, hero = its \`imageUrls[0]\`). SaaS/app brand (\`brandType\`
274
+ saas/software/app/platform) → the **app-UI screenshot** (\`kind: "website_screenshot"\` /
275
+ \`screenshotUrls\`). **Never** feed a mascot or logo as the product. Pass ONLY the one relevant
276
+ image for the slot.
277
+ - **Palette** — **default \`template\`** (keep the reference ad's colours). Use **\`brand\`** (the
278
+ kit's \`colors\`) ONLY when the user explicitly asks to "match my brand colours/style" — never
279
+ switch to brand on your own. **Never invent a colour** (don't pull an accent off a logo/mascot):
280
+ colours come only from the reference (\`template\`) or the kit's \`colors\` (\`brand\`).
281
+ - **Fonts** = the kit's \`typography\`.
282
+ 5. \`gooseworks fetch remix-graphic-ad-from-reference\` and follow it to generate the image, passing
283
+ the hero image + palette + fonts you selected above (and \`style_source\`, \`remix_mode\`).
284
+ It **always generates with GPT Image 2** (\`fal-ai/gpt-image-1/edit-image\` via the FAL proxy —
285
+ a billed generation); the HTML/goose-graphics overlay is only an optional text-finishing step,
286
+ never the generator. Verify the output is a real, non-empty image.
287
+ 6. **Only then** \`submit_render { project_id, kind: "full" }\` → \`get_upload_url\` (with
288
+ \`target: ADS_AGENT\`) and PUT the image to
289
+ \`agent-config/brands/<slug>/projects/<id>/working/<name>.png\` →
290
+ **VERIFY it's servable**: \`get_download_url { target: ADS_AGENT, path: <same path> }\` and
291
+ confirm it returns a non-empty file. ONLY after that passes →
292
+ \`update_render_status { render_id, status: "complete", output_url, thumbnail_url }\` (output_url =
293
+ the render-file URL for that path). If you produced more than one usable output, submit EACH as
294
+ its own render, then \`set_final_render\` with the best.
295
+ 7. **Finish by giving the user BOTH links** (\`app_url\` and \`brand_url\`) exactly as returned —
296
+ copy them verbatim, don't reformat or guess.
297
+
298
+ ## Media generation — the GooseWorks FAL proxy
299
+
300
+ The recipe's generation steps call FAL. Your token is NOT a FAL token — call the proxy, not
301
+ \`queue.fal.run\` directly. Get the token with \`eval $(gooseworks env)\` (exports
302
+ \`GOOSEWORKS_API_KEY\`) and use the proxy base \`<api_base>/api/internal/fal-proxy\` (image
303
+ upload: \`<api_base>/api/internal/fal-storage-proxy\`), passing BOTH
304
+ \`?token=$GOOSEWORKS_API_KEY&agent_id=ADS_AGENT\`.
305
+
306
+ **\`agent_id\` is REQUIRED and is the billing target.** Your CLI token is user-scoped (it has no
307
+ pinned agent), so the proxy can't know whose credits to charge unless you tell it. Pass
308
+ \`agent_id=ADS_AGENT\` — the org's Ads agent id you resolved in "File storage" (the
309
+ \`is_org_default: true\` scope). Without it, billable calls (the GPT Image 2 generation) return
310
+ 403 "Agent ID required for billable operations". The proxy verifies you can access that agent and
311
+ bills its credits.
312
+
313
+ **Queue gotcha:** FAL's submit returns \`status_url\`/\`response_url\` pointing at
314
+ \`queue.fal.run\` (the real FAL host). Polling those verbatim 401s forever — rewrite their host
315
+ to the proxy base (keep the path), then re-add \`?token=$GOOSEWORKS_API_KEY&agent_id=ADS_AGENT\`.
316
+ Only the final \`*.fal.media\` result URL is a real public CDN URL you use as-is. Each edit call is
317
+ a real billed generation — get the poll right the first time.
318
+
319
+ ## Rules
320
+
321
+ - **MCP required** — if \`mcp__gooseworks__*\` is unavailable, stop and tell the user to run
322
+ \`gooseworks install --claude --mcp\`.
323
+ - **Always end a successful run with BOTH links** (project \`app_url\` + brand \`brand_url\`).
324
+ Never end on just "done", a file path, or only the project link.
325
+ - **Full product swap (compliance-critical):** every instance of the source product must be
326
+ replaced with the brand's, and no source-brand name/logo or competitor product may survive
327
+ anywhere in the frame.
328
+ - **Verify the render is SERVABLE before marking complete — a successful FAL generation is NOT
329
+ proof.** After uploading, call \`get_download_url { target: ADS_AGENT, path }\` for the file and
330
+ confirm it's non-empty. The bug to prevent is uploading to the wrong agent: if the file isn't
331
+ retrievable from ADS_AGENT, the app will show "Image not available". Do NOT GET the render-file
332
+ URL itself to verify (it's browser/session-scoped and 401s on your token) — verify via
333
+ \`get_download_url\` on ADS_AGENT.
334
+ - On a hard error (auth/quota/model, or a polling timeout), set the render \`failed\` with a
335
+ short \`error_message\` and stop. Don't return the source unchanged.
336
+ `;
337
+ }
152
338
  //# sourceMappingURL=master-skill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AAUA,sDAyIC;AAnJD;;;;;;;;;GASG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuIR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AAkBA,wCAKC;AAWD,sDAyIC;AAYD,gDAuKC;AA7UD,oDAAoD;AACpD,SAAgB,cAAc;IAC5B,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;QACxD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE;KACrD,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuIR,CAAC;AACF,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqKR,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/skills/names.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D"}
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/skills/names.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAO9D"}
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isManagedGooseworksSkill = isManagedGooseworksSkill;
4
4
  function isManagedGooseworksSkill(name) {
5
- return name === 'gooseworks' || name.startsWith('gooseworks-') || name.startsWith('goose-');
5
+ return (name === 'gooseworks' ||
6
+ name === 'ads-remix' ||
7
+ name.startsWith('gooseworks-') ||
8
+ name.startsWith('goose-'));
6
9
  }
7
10
  //# sourceMappingURL=names.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/skills/names.ts"],"names":[],"mappings":";;AAAA,4DAEC;AAFD,SAAgB,wBAAwB,CAAC,IAAY;IACnD,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9F,CAAC"}
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/skills/names.ts"],"names":[],"mappings":";;AAAA,4DAOC;AAPD,SAAgB,wBAAwB,CAAC,IAAY;IACnD,OAAO,CACL,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,WAAW;QACpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gooseworks",
3
- "version": "0.2.10",
3
+ "version": "0.3.0",
4
4
  "description": "GooseWorks CLI — give your coding agent real data tools",
5
5
  "bin": {
6
6
  "gooseworks": "./dist/index.js"