gooseworks 0.3.11 → 0.3.13

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
@@ -93,6 +93,31 @@ npx gooseworks logout
93
93
 
94
94
  Deletes `~/.gooseworks/credentials.json`.
95
95
 
96
+ ### `whoami`
97
+
98
+ Show which account you're currently signed in as. Handy when you have multiple
99
+ GooseWorks accounts and need to confirm the active one before running a command.
100
+ Reads local credentials only — no network call.
101
+
102
+ ```bash
103
+ npx gooseworks whoami
104
+ npx gooseworks whoami --json # machine-readable output
105
+ ```
106
+
107
+ Output:
108
+ ```
109
+ Signed in as you@example.com
110
+ Scope: user
111
+ Agent: 2e32bd49-…
112
+ API base: https://api.gooseworks.ai
113
+ ```
114
+
115
+ To switch accounts, run `gooseworks logout` then `gooseworks login`.
116
+
117
+ > The GooseWorks MCP server exposes the same identity check as the `whoami` tool
118
+ > (email + the exact agent/org the token is pinned to), separate from
119
+ > `list_accessible_scopes`, which lists *every* workspace you can reach.
120
+
96
121
  ### `search`
97
122
 
98
123
  Search the GooseWorks skill catalog.
@@ -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,CAoK9C;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,CAyJ9C;AAED,eAAO,MAAM,cAAc,SAAyB,CAAC"}
@@ -182,23 +182,13 @@ Examples:
182
182
  }
183
183
  }
184
184
  const agentNames = targetAgents.map((a) => a === 'claude' ? 'Claude Code' : a === 'codex' ? 'Codex' : 'Cursor').join(' and ');
185
- logger.done(`Setup complete! Open ${agentNames} and try one of these:`);
186
- logger.info('Data & GTM:');
187
- logger.example('/gooseworks find people who know <linkedin-profile-url>');
188
- logger.example('/gooseworks find leads similar to <linkedin-company-url>');
189
- logger.example('/gooseworks research <company name>');
190
- // goose-ads is a vendored entry skill — always installed, so always shown.
185
+ logger.done(`Setup complete! Open ${agentNames} and pick one to get started:`);
191
186
  console.log('');
192
- logger.info('Ads (create, edit & analyze):');
193
- logger.example('/goose-ads remix template <id-or-url> for <your-product>');
194
- logger.example('/goose-ads make an ad for <your-product>');
195
- logger.example('/goose-ads why is my Meta campaign underperforming?');
196
- // Graphics is a standalone skill — only suggest it if it was installed.
197
- if ((opts.with || []).includes('goose-graphics')) {
198
- console.log('');
199
- logger.info('Graphics:');
200
- logger.example('/goose-graphics make a chart from <data>');
201
- }
187
+ logger.info('New here? Get set up in 30 seconds:');
188
+ logger.example('/gooseworks onboard me');
189
+ console.log('');
190
+ logger.info('Or jump straight into making an ad:');
191
+ logger.example('/goose-ads make an ad for <your brand>');
202
192
  console.log('');
203
193
  });
204
194
  }
@@ -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;AA2CpC,eAAO,MAAM,YAAY,SAuBrB,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;AA+DpC,eAAO,MAAM,YAAY,SAyBrB,CAAC;AAEL;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,MAAiB,sDAc9D"}
@@ -32,10 +32,14 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.loginCommand = void 0;
37
40
  exports.ensureLoggedIn = ensureLoggedIn;
38
41
  const commander_1 = require("commander");
42
+ const open_1 = __importDefault(require("open"));
39
43
  const credentials_1 = require("../auth/credentials");
40
44
  const oauth_server_1 = require("../auth/oauth-server");
41
45
  const installer_1 = require("../skills/installer");
@@ -78,6 +82,23 @@ function syncMcpRegistration() {
78
82
  logger.info(`Synced the gooseworks MCP → ${creds?.mcp_server_url ?? 'the configured server'}`);
79
83
  }
80
84
  }
85
+ /**
86
+ * After a FRESH login, open the onboarding page so the user lands on a "get
87
+ * started" experience and is nudged to run `/gooseworks onboard me` (GOOSE-2596).
88
+ * The `?onboard=true` param is analytics-only today. Only fires on a genuine new
89
+ * login — never when reusing existing creds — so the browser opens at most once.
90
+ * Best-effort: a headless / CI box that can't open a browser just prints the URL.
91
+ */
92
+ function openOnboarding() {
93
+ const url = `${config_1.HUB_URL}/?onboard=true`;
94
+ (0, open_1.default)(url).catch(() => logger.info(`Get started: ${url}`));
95
+ }
96
+ /** Two focused next-steps after auth: onboard, or jump straight into an ad. */
97
+ function showNextSteps() {
98
+ logger.info('Open Claude/Codex and pick one to get started:');
99
+ logger.info(' • New here? Get set up: /gooseworks onboard me');
100
+ logger.info(' • Or make an ad now: /goose-ads make an ad for <your brand>');
101
+ }
81
102
  exports.loginCommand = new commander_1.Command('login')
82
103
  .description('Sign in to GooseWorks with Google')
83
104
  .option('--api-base <url>', 'API base URL', config_1.API_BASE)
@@ -95,6 +116,8 @@ exports.loginCommand = new commander_1.Command('login')
95
116
  logger.success(`Logged in as ${result.email}`);
96
117
  refreshEntrySkillsOnLogin();
97
118
  syncMcpRegistration();
119
+ openOnboarding();
120
+ showNextSteps();
98
121
  }
99
122
  catch (err) {
100
123
  const message = err instanceof Error ? err.message : 'Login failed';
@@ -116,6 +139,9 @@ async function ensureLoggedIn(apiBase = config_1.API_BASE) {
116
139
  logger.error('Failed to save credentials after login');
117
140
  process.exit(1);
118
141
  }
142
+ // Fresh login via an install/other command path — nudge onboarding too, so
143
+ // `gooseworks install --all` on a logged-out machine also opens the page.
144
+ openOnboarding();
119
145
  return creds;
120
146
  }
121
147
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FA,wCAcC;AA5GD,yCAAoC;AACpC,gDAAwB;AACxB,qDAAqD;AACrD,uDAAoD;AACpD,mDAAoF;AACpF,yDAAwD;AACxD,6CAAmD;AACnD,qDAA0D;AAC1D,6CAAoD;AACpD,wDAA0C;AAC1C,sCAA8C;AAE9C;;;;;;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;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB;IAC1B,IAAI,IAAA,+BAAkB,GAAE,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,EAAE,cAAc,IAAI,uBAAuB,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,GAAG,gBAAO,gBAAgB,CAAC;IACvC,IAAA,cAAI,EAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,+EAA+E;AAC/E,SAAS,aAAa;IACpB,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC9D,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;AACpF,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,mBAAmB,EAAE,CAAC;QACtB,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;QAC5B,mBAAmB,EAAE,CAAC;QACtB,cAAc,EAAE,CAAC;QACjB,aAAa,EAAE,CAAC;IAClB,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,2EAA2E;IAC3E,0EAA0E;IAC1E,cAAc,EAAE,CAAC;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * `gooseworks whoami` — show which account the CLI is currently signed in as.
4
+ *
5
+ * Reads `~/.gooseworks/credentials.json` only (no network call), so it works
6
+ * offline and reflects exactly what the CLI + its MCP registration will
7
+ * authenticate as. This is the answer to "I have multiple accounts — which one
8
+ * is active right now?"; use `gooseworks login` / `logout` to switch.
9
+ */
10
+ export declare const whoamiCommand: Command;
11
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,SA0CtB,CAAC"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.whoamiCommand = void 0;
37
+ const commander_1 = require("commander");
38
+ const credentials_1 = require("../auth/credentials");
39
+ const logger = __importStar(require("../utils/logger"));
40
+ /**
41
+ * `gooseworks whoami` — show which account the CLI is currently signed in as.
42
+ *
43
+ * Reads `~/.gooseworks/credentials.json` only (no network call), so it works
44
+ * offline and reflects exactly what the CLI + its MCP registration will
45
+ * authenticate as. This is the answer to "I have multiple accounts — which one
46
+ * is active right now?"; use `gooseworks login` / `logout` to switch.
47
+ */
48
+ exports.whoamiCommand = new commander_1.Command('whoami')
49
+ .description('Show which GooseWorks account you are signed in as')
50
+ .option('--json', 'Output raw JSON')
51
+ .action((opts) => {
52
+ const creds = (0, credentials_1.getCredentials)();
53
+ if (!creds) {
54
+ if (opts.json) {
55
+ console.log(JSON.stringify({ logged_in: false }, null, 2));
56
+ }
57
+ else {
58
+ logger.error('Not logged in. Run "gooseworks login" first.');
59
+ }
60
+ process.exit(1);
61
+ }
62
+ const scope = creds.scope_type ?? 'agent';
63
+ if (opts.json) {
64
+ console.log(JSON.stringify({
65
+ logged_in: true,
66
+ email: creds.email,
67
+ scope_type: scope,
68
+ agent_id: creds.agent_id,
69
+ default_agent_id: creds.default_agent_id ?? creds.agent_id,
70
+ api_base: creds.api_base,
71
+ mcp_server_url: creds.mcp_server_url ?? null,
72
+ }, null, 2));
73
+ return;
74
+ }
75
+ logger.success(`Signed in as ${creds.email}`);
76
+ logger.info(`Scope: ${scope}`);
77
+ logger.info(`Agent: ${creds.agent_id}`);
78
+ logger.info(`API base: ${creds.api_base}`);
79
+ if (creds.mcp_server_url) {
80
+ logger.info(`MCP server: ${creds.mcp_server_url}`);
81
+ }
82
+ logger.info('Run "gooseworks logout" then "gooseworks login" to switch accounts.');
83
+ });
84
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AACpC,qDAAqD;AACrD,wDAA0C;AAE1C;;;;;;;GAOG;AACU,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACnC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,MAAM,KAAK,GAAG,IAAA,4BAAc,GAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC;IAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,QAAQ;YAC1D,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;SAC7C,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ const commander_1 = require("commander");
5
5
  const install_1 = require("./commands/install");
6
6
  const login_1 = require("./commands/login");
7
7
  const logout_1 = require("./commands/logout");
8
+ const whoami_1 = require("./commands/whoami");
8
9
  const update_1 = require("./commands/update");
9
10
  const credits_1 = require("./commands/credits");
10
11
  const search_1 = require("./commands/search");
@@ -24,6 +25,7 @@ program
24
25
  program.addCommand(install_1.installCommand);
25
26
  program.addCommand(login_1.loginCommand);
26
27
  program.addCommand(logout_1.logoutCommand);
28
+ program.addCommand(whoami_1.whoamiCommand);
27
29
  program.addCommand(update_1.updateCommand);
28
30
  program.addCommand(credits_1.creditsCommand);
29
31
  program.addCommand(search_1.searchCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,gDAAoD;AACpD,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,8CAAkD;AAClD,4CAAgD;AAChD,wCAA4C;AAC5C,0CAA8C;AAC9C,sDAA0D;AAC1D,8CAAkD;AAClD,gDAAoD;AACpD,8CAAkD;AAClD,uCAAuC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,yDAAyD,CAAC;KACtE,OAAO,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;AAEzB,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,8BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,gDAAoD;AACpD,4CAAgD;AAChD,8CAAkD;AAClD,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,8CAAkD;AAClD,4CAAgD;AAChD,wCAA4C;AAC5C,0CAA8C;AAC9C,sDAA0D;AAC1D,8CAAkD;AAClD,gDAAoD;AACpD,8CAAkD;AAClD,uCAAuC;AAEvC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,yDAAyD,CAAC;KACtE,OAAO,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;AAEzB,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,8BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;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,CAM7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA0L9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsUhD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAmTlD"}
1
+ {"version":3,"file":"master-skill.d.ts","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;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,CAM7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA8N9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAsUhD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA8WlD"}
@@ -78,6 +78,42 @@ To check credit balance:
78
78
  gooseworks credits
79
79
  \`\`\`
80
80
 
81
+ ## User Context (onboarding)
82
+
83
+ You have two MCP tools for the user's onboarding CONTEXT — who they are and what they want GooseWorks for. It's stored server-side (org-scoped), separate from the ads brand kit.
84
+
85
+ - \`get_user_context\` — read it. **At the START of a session, call this once** and use what you learn (company, role, the use-cases they picked, their goals, freeform notes) to tailor which skills/APIs you reach for. Best-effort: if the \`mcp__gooseworks__*\` tools aren't connected, skip silently and carry on.
86
+ - \`update_user_context\` — save it (partial update; only the fields you pass are touched).
87
+
88
+ ### Running "onboard me" (or a first run with empty context)
89
+
90
+ If the user says "onboard me" — or \`get_user_context\` returns \`onboarded: false\` and they're starting fresh — run a short, friendly interview, then save the answers. Open with this framing:
91
+
92
+ > Gooseworks gives your AI agent access to skills and APIs for growth and marketing work. For example: making ad creatives, finding influencers, scraping social profiles and posts from X/LinkedIn, scraping ads from Meta/LinkedIn, scraping reddit, and finding leads to target and their emails — and much more. Visit skills.gooseworks.ai to see the full library of skills.
93
+
94
+ Then ask (a few at a time is fine — don't interrogate):
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\`
99
+
100
+ **Save** with \`update_user_context { company_website, role, use_cases, goals, context_md }\` — put any extra detail you learned into \`context_md\` as a short summary.
101
+
102
+ **Then recommend REAL next steps — grounded, not from memory. This is the WHOLE POINT of onboarding; do not skip it or wing a generic playbook:**
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.
111
+
112
+ A suggestion is only "grounded" if it came from routing to the right domain skill (\`goose-ads\` / \`goose-video\` / \`goose-graphics\`) or from \`gooseworks search\` (a real GTM skill) — plus, ideally, reading their site. Do that BEFORE you suggest; never present a from-memory capability list as if you'd checked.
113
+
114
+ ### Update as needed
115
+ Whenever the user reveals durable context mid-session (their company, role, what they're trying to accomplish), persist it with \`update_user_context\` so future sessions start smarter.
116
+
81
117
  ## How to Use
82
118
 
83
119
  ### If a specific skill is requested (e.g. --skill <slug> or "use the <name> skill")
@@ -583,8 +619,17 @@ tags: [gooseworks, ads, video, remix, imessage, local-render, byoa]
583
619
 
584
620
  You produce **video** ad creative on the user's OWN machine and sync the result back to the
585
621
  GooseWorks app over MCP. This document is the **runtime contract** (auth, credits, the media
586
- proxies, data I/O, the review gate). A separate **recipe skill** — fetched per format — tells
587
- you *what to make*; read both, and this doc wins on any conflict about the environment.
622
+ proxies, data I/O, the review gate). A separate **recipe skill** — fetched per format — tells you
623
+ *what to make* (the pieces, prompts, models, order of assembly).
624
+
625
+ **Division of authority — read both, but when they disagree THIS doc wins on the environment AND the
626
+ review/approval flow.** The recipe governs WHAT to make; this doc governs WHEN you pause, generate,
627
+ and spend. In particular: a recipe may spell out a **multi-phase, multi-gate** flow — "generate the
628
+ still [GATE] → approve → author the prompt [GATE] → approve → render [GATE] → approve", several
629
+ separate pauses. **Do NOT run it that way.** Collapse every one of those gates into the single
630
+ **review-once** flow below: one review set, one approval (Step 3). Take the recipe's pieces, prompts
631
+ and models; ignore its intermediate pauses. This is the exact contradiction that confused past runs
632
+ (GOOSE-2542) — there is no ambiguity: review-once wins.
588
633
 
589
634
  You run inside the user's own Claude Code session (they pasted an instruction with a project
590
635
  id). The app NEVER runs you — it is the viewer + review surface; you are the renderer.
@@ -653,14 +698,18 @@ says to shell out, use the MCP equivalent:
653
698
  stays the project-relative \`...render-file?path=working/final.mp4\` — the route re-prepends the
654
699
  prefix itself. Always verify with \`get_download_url\` on the FULL \`agent-config/...\` path (must
655
700
  be non-empty; curl it for HTTP 200) BEFORE marking the render complete.
656
- - Media generation (FAL / ElevenLabs) is billed to the agent through the GooseWorks proxies.
657
- \`submit_render { kind: "full" }\` debits **1 ad credit at row creation** — so sequence it LAST
658
- (render + verify a good MP4 first), and never re-submit on a guess (that double-bills). Call
659
- \`get_ad_credits\` first; the user can check \`gooseworks credits\`.
701
+ - Media generation (FAL / ElevenLabs) through the GooseWorks proxies is the **REAL spend** billed
702
+ to the agent per call as you generate (Step 4). \`submit_render { kind: "full" }\` additionally
703
+ debits **1 nominal ad credit when the render ROW is opened** (a bookkeeping fee, NOT the render's
704
+ true cost) so open it only once you actually have a rendered master (Step 4.1/4.2), and never
705
+ re-submit on a guess (that double-bills). The final-video QC gate (Step 4.3) then sits between
706
+ that master and PINNING it. Call \`get_ad_credits\` first; the user can check \`gooseworks credits\`.
660
707
 
661
708
  ## Step 1 — resolve the project, source, brand
662
709
 
663
- 1. \`get_ad_project { project_id }\` → keep \`brand_id\`, \`source_sample_id\`, \`name\`, \`status\`.
710
+ 1. \`get_ad_project { project_id }\` → keep \`brand_id\`, \`source_sample_id\`, \`name\`, \`status\`, and
711
+ the **top-level** \`app_url\` + \`brand_url\` (returned alongside \`project\`, NOT inside it) — these
712
+ are the links you hand the user for the in-app review (Step 3) and the final delivery (Step 5).
664
713
  2. \`get_ad_template { template_id: source_sample_id }\` → the source video: \`media_url\`,
665
714
  \`recipe\`, \`format\` (e.g. "imessage"), \`extracted_script\`, \`how_to\`, \`remix_spec\`.
666
715
  3. Brand gate: \`get_brand_kit { brand_id }\`. If \`researchStatus\` is \`complete\`, REUSE it —
@@ -696,32 +745,55 @@ Playwright resolve, and point the recorder's \`NODE_PATH\` at it.
696
745
  > recipe does not yet carry \`atoms\` / \`instructions\` still hold the legacy \`recipe.thread\` payload;
697
746
  > migrate them to this shape (capabilities + instructions in the DB) — do not reintroduce a CLI map.
698
747
 
699
- ## Step 3 — prepare ALL the ingredients, then review ONCE (always, before any paid render)
700
-
701
- This is a **review-once** flow: prepare every ingredient the video needs, show the whole set to
702
- the user in the app, get ONE approval, then render. Never render before approval, and don't drip
703
- ingredients out one at a time.
704
-
705
- **The review is of the individual PIECES, never the finished cut.** Prepare and mirror only the
706
- *ingredients* the script, each conversation image, the end card, the voice/music plan. Do NOT
707
- stitch, composite, or render the assembled video (no "full cascade" / "approved cut" clip) during
708
- ingredient prep, and never add such a clip as a review ingredient. Assembling the video before
709
- approval defeats this gate — the user opens "Review before rendering" and sees an already-finished
710
- video, then rightly asks why it was made before they approved (GOOSE-2542) and it wastes the
711
- render. The full video is stitched ONLY in Step 4, after approval. A \`video\` ingredient here is
712
- only for a genuinely separate SOURCE clip the format needs (e.g. supplied b-roll), never the
713
- assembled output.
714
-
715
- 1. **Generate every ingredient the format needs not just the script.** For an iMessage video
716
- that's typically: the **script** (the bubble thread), the **image(s)** shown in the conversation
717
- (one or more), and the **end card**. Richer templates add more (hook frame, background, product
718
- shots, music bed…). Read the recipe for the exact ingredient list. Generate the visuals NOW
719
- (media proxies / recipe), and \`get_upload_url\` each preview asset to the project folder
720
- \`agent-config/brands/<brand_slug>/projects/<project_id>/working/review/<name>\` (the same
721
- path-prefix rule as final publish a bare \`working/review/<name>\` won't render in the panel).
722
- In \`script_drafts\`, set each ingredient's \`path\` to the project-relative \`working/review/<name>\`.
723
- You may ask the user a couple of clarifying questions about the generation first if the recipe
724
- calls for it (angle, which product, offer/code) — batch them, then prepare everything.
748
+ ## Step 3 — assemble the review set, then get ONE approval in the app (before the expensive render)
749
+
750
+ This is a **review-once** flow: put the whole review set in the app, get ONE approval, then run the
751
+ expensive render + any remaining paid work end-to-end. Never spend on the expensive render before
752
+ approval, and don't drip pieces out one at a time and re-pause.
753
+
754
+ **What goes in the review show the REAL cheap pieces, PROMPT only the expensive render.** Split
755
+ every piece three ways by cost, NOT just "free vs paid":
756
+ - **FREE** (an iMessage / Apple-Notes HTML mockup, a text/CTA line rendered locally, no proxy
757
+ call) generate NOW and mirror the real asset.
758
+ - **CHEAP paid**a single still/image, the creator/avatar frame, the end card, a short voiceover
759
+ or music bed (each costs cents roughly **≤ 100 credits**) **generate these NOW too** and
760
+ mirror the real asset. The few credits buy a real review: the user SEES the actual creator face
761
+ and end card and HEARS the VO, instead of judging a prompt. **This OVERRIDES any recipe rule that
762
+ says to gate ALL paid calls** — only the expensive render below is gated.
763
+ - **EXPENSIVE paid** — the video take / final AI render (hundreds of credits) → do NOT generate.
764
+ Put its **exact prompt/spec** (+ ref image URLs) in the tile. This is the ONE thing approved as a
765
+ prompt (you can't preview a hundreds-of-credits video for free); it's generated only in Step 4.
766
+
767
+ **The expensive render's exact prompt must be in the panel BEFORE you ask for approval** — so a
768
+ single "go" runs it (plus any remaining paid work) without re-pausing mid-run.
769
+
770
+ **Show every cost in CREDITS, never dollars.** 1 credit = $0.01 and media generations bill at
771
+ provider-cost × 1.2, so **credits round-up(provider-$ × 120)** per generation, plus a flat
772
+ **200-credit base per video**. Convert any $ figures to credits and show ONLY credits to the user —
773
+ never print a "$…" amount.
774
+
775
+ **Never assemble/stitch the finished video for review.** The review is of the individual pieces (or
776
+ their prompts) — never a "full cascade" / "approved cut" clip. Building the whole video before
777
+ approval defeats the gate (the user opens the review to an already-finished video) and wastes the
778
+ render (GOOSE-2542). The full video is assembled ONLY in Step 4, after approval. A \`video\`
779
+ ingredient here is only a genuinely separate SOURCE clip the format needs (e.g. supplied b-roll).
780
+
781
+ 1. **Assemble every piece the format needs — not just the script.** Read the recipe for the exact
782
+ list. For an iMessage video that's the **script** (bubble thread), the **conversation image(s)**,
783
+ and the **end card**; richer templates add a hook frame, background, product shots, music bed, a
784
+ creator/avatar, a voiceover… For each piece, decide FREE / CHEAP-paid / EXPENSIVE-paid (above):
785
+ - **FREE or CHEAP paid** (≤ ~100 credits — HTML mockups, a still, the creator frame, the end
786
+ card, a short VO/music bed) → generate it now and \`get_upload_url\` the asset to the project
787
+ folder \`agent-config/brands/<brand_slug>/projects/<project_id>/working/review/<name>\` (same
788
+ path-prefix rule as final publish — a bare \`working/review/<name>\` won't render in the panel);
789
+ set that piece's \`path\` in \`script_drafts\` to the project-relative \`working/review/<name>\`.
790
+ - **EXPENSIVE paid** (the video take / final render, hundreds of credits) → do NOT generate. Put
791
+ the **exact prompt/spec** (and any ref image URLs) in the tile's \`text\` / \`subtitle\` so the
792
+ user reviews what will be spent on. No \`path\` yet — it's generated in Step 4.
793
+ Include the **estimated cost in CREDITS** (never dollars) of the cheap pieces already generated +
794
+ the pending render, so the user approves knowing the total spend. You may batch a couple of
795
+ clarifying questions first if the recipe calls for it (angle, which product, offer/code), then
796
+ assemble everything.
725
797
  2. **Mirror the whole ingredient set for review** — \`update_ad_project_script { project_id,
726
798
  script_drafts, script }\`. \`script_drafts\` is a structured payload of **container-tagged
727
799
  ingredients** so the app renders each piece the right way:
@@ -736,21 +808,34 @@ assembled output.
736
808
  for the podcast shape, or pass the readable \`script\` string).
737
809
  \`path\` = \`working/review/<name>\` (upload the preview asset first via \`get_upload_url\`); \`url\`
738
810
  works too. **Label every ingredient** ("Hook image", "End card", "Voiceover", "Background
739
- music", "HER"). This writes NO render and costs NO credits — it populates the review panel.
740
- 3. **STOP and ask the user to approve the ingredients in THIS Claude Code session.** Do not render
741
- until they say go. If they want changes, regenerate the affected ingredient, call
742
- \`update_ad_project_script\` again, and re-ask. Only AFTER approval do Step 4.
811
+ music", "HER"). The \`update_ad_project_script\` call itself writes no render and costs no credits
812
+ (the cheap pieces you already generated above have their own small cost) it just populates the
813
+ review panel.
814
+ 3. **STOP — the review happens in the APP's review panel, NOT in this chat.** You've mirrored the
815
+ ingredients (3.2); now hand the user the project's \`app_url\` (from \`get_ad_project\`) and tell
816
+ them to review the pieces there and hit **"Approve & render"**. That button gives them a short
817
+ message to paste back into this session — THAT is your go-ahead. Do NOT paste the
818
+ script/ingredients into the chat for a thumbs-up, and do NOT render until that approval comes
819
+ back from the app. If they want changes (via the app's comments or here), regenerate the
820
+ affected ingredient, call \`update_ad_project_script\` again, tell them it's refreshed in the
821
+ app, and wait for a fresh approval. Only AFTER the app approval do Step 4. A single approval
822
+ authorises the WHOLE remaining chain — generate every paid piece, render, self-QC, publish —
823
+ with NO further pauses (that is exactly why every paid prompt must already be in the panel).
743
824
 
744
825
  ## Step 4 — render locally, report stages, publish
745
826
 
746
- 1. Render per the recipe (Playwright record ffmpeg stitch \`mix-master\` audio). Generate any
747
- hook / background / end-card assets through the media proxies (below).
827
+ 1. Now generate every PAID piece you showed as a prompt in Step 3 — the AI stills/video, voice,
828
+ music, the end-card render through the media proxies (below), each from its approved prompt.
829
+ Then assemble per the recipe (Playwright record where needed → ffmpeg stitch → \`mix-master\`
830
+ audio).
748
831
  2. Open the row LAST: \`submit_render { project_id, kind: "full" }\` → keep \`render_id\`, then
749
832
  \`update_render_status { render_id, status: "running" }\`. The render row tracks status only
750
833
  (queued / running / complete / failed) — narrate fine-grained progress with
751
834
  \`append_project_message\` instead.
752
- 3. **MANDATORY final-video review gate — review EVERY finished master before \`set_final_render\`,
753
- whatever the format (UGC or not).** The render credit is already spent (\`submit_render\` in 4.2);
835
+ 3. **MANDATORY final-video QC gate — YOU review EVERY finished master before \`set_final_render\`,
836
+ whatever the format (UGC or not).** This is your own automated quality check, separate from the
837
+ user's Step-3 approval — it does not go back to the user. The render row is already open (its
838
+ nominal credit spent, \`submit_render\` in 4.2);
754
839
  this gate stands between a rendered master and PINNING/publishing it, so a bad render never gets
755
840
  set as final. A master that looks fine on a still can still have a mis-voiced word, a caption
756
841
  drifting off its line, a beat out of order, or a deformation — review the actual VIDEO, not
@@ -854,13 +939,23 @@ path. (\`fal-storage-proxy\` may 404 depending on the install; don't block on it
854
939
 
855
940
  - **MCP + ffmpeg + Playwright required** — run \`gooseworks doctor\` in Phase 0; stop with the
856
941
  exact fix it prints if anything is ✗.
857
- - **Prepare ALL ingredients first** (script + every visual: image(s) + end card + whatever else
858
- the template needs), mirror the whole set with \`update_ad_project_script\`, and get the user's
859
- approval in-session BEFORE rendering always (review-once).
860
- - **Never assemble the full video before approval.** The review shows the individual pieces, not a
861
- stitched/composited cut; do not add a "full cascade" / finished-video clip as a review ingredient
862
- (GOOSE-2542). The assembled video is produced only in Step 4, after the user approves.
863
- - **submit_render LAST**; \`output_url\` = the durable render-file URL, never a CDN URL.
942
+ - **Assemble the whole review set first**, mirror it with \`update_ad_project_script\`, and get the
943
+ user's approval **in the app's review panel** (the "Approve & render" button) BEFORE the expensive
944
+ render — never ask for a thumbs-up in this chat (review-once, in-app).
945
+ - **Show the REAL cheap pieces; PROMPT only the expensive render.** Generate the FREE + CHEAP-paid
946
+ pieces (≤ ~100 credits stills, creator frame, end card, short VO/music) and mirror the real
947
+ assets; put ONLY the expensive video take/render in the panel as its exact prompt. That prompt
948
+ must be in the panel before you ask to approve, so a single "go" runs the render + any remaining
949
+ paid work (→ QC → publish) with no re-pausing.
950
+ - **Costs in CREDITS, never dollars.** credits ≈ round-up(provider-$ × 120) per generation + a flat
951
+ 200-credit base per video; never show a "$…" figure to the user.
952
+ - **Never assemble the full video before approval.** The review shows the
953
+ individual PIECES, never the finished cut (or their prompts) — not a
954
+ stitched/composited cut; do not add a "full cascade" / finished-video clip
955
+ as a review ingredient (GOOSE-2542). The assembled video is produced only in
956
+ Step 4.
957
+ - **submit_render only after the master is rendered** (Step 4.2), never on a guess; \`output_url\` =
958
+ the durable render-file URL, never a CDN URL.
864
959
  - **Always pass \`project_id\` on media-proxy calls** (fal / ElevenLabs) so the credits attribute
865
960
  to this ad project — that's what lets the user see per-project spend in the app.
866
961
  - **Verify a real, non-empty MP4** (watch it) before marking the render complete.
@@ -1 +1 @@
1
- {"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AA4BA,wCAMC;AAWD,sDA0LC;AAiBD,0DAsUC;AAcD,8DAmTC;AAp2BD,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,uBAAuB,EAAE,EAAE;QACzD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwLR,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoUR,CAAC;AACF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiTR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AA4BA,wCAMC;AAWD,sDA8NC;AAiBD,0DAsUC;AAcD,8DA8WC;AAn8BD,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,uBAAuB,EAAE,EAAE;QACzD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4NR,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoUR,CAAC;AACF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4WR,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gooseworks",
3
- "version": "0.3.11",
3
+ "version": "0.3.13",
4
4
  "description": "GooseWorks CLI — give your coding agent real data tools",
5
5
  "bin": {
6
6
  "gooseworks": "./dist/index.js"
@@ -18,8 +18,17 @@ tags: [gooseworks, ads, video, remix, imessage, local-render, byoa]
18
18
 
19
19
  You produce **video** ad creative on the user's OWN machine and sync the result back to the
20
20
  GooseWorks app over MCP. This document is the **runtime contract** (auth, credits, the media
21
- proxies, data I/O, the review gate). A separate **recipe skill** — fetched per format — tells
22
- you *what to make*; read both, and this doc wins on any conflict about the environment.
21
+ proxies, data I/O, the review gate). A separate **recipe skill** — fetched per format — tells you
22
+ *what to make* (the pieces, prompts, models, order of assembly).
23
+
24
+ **Division of authority — read both, but when they disagree THIS doc wins on the environment AND the
25
+ review/approval flow.** The recipe governs WHAT to make; this doc governs WHEN you pause, generate,
26
+ and spend. In particular: a recipe may spell out a **multi-phase, multi-gate** flow — "generate the
27
+ still [GATE] → approve → author the prompt [GATE] → approve → render [GATE] → approve", several
28
+ separate pauses. **Do NOT run it that way.** Collapse every one of those gates into the single
29
+ **review-once** flow below: one review set, one approval (Step 3). Take the recipe's pieces, prompts
30
+ and models; ignore its intermediate pauses. This is the exact contradiction that confused past runs
31
+ (GOOSE-2542) — there is no ambiguity: review-once wins.
23
32
 
24
33
  You run inside the user's own Claude Code session (they pasted an instruction with a project
25
34
  id). The app NEVER runs you — it is the viewer + review surface; you are the renderer.
@@ -88,14 +97,18 @@ says to shell out, use the MCP equivalent:
88
97
  stays the project-relative `...render-file?path=working/final.mp4` — the route re-prepends the
89
98
  prefix itself. Always verify with `get_download_url` on the FULL `agent-config/...` path (must
90
99
  be non-empty; curl it for HTTP 200) BEFORE marking the render complete.
91
- - Media generation (FAL / ElevenLabs) is billed to the agent through the GooseWorks proxies.
92
- `submit_render { kind: "full" }` debits **1 ad credit at row creation** — so sequence it LAST
93
- (render + verify a good MP4 first), and never re-submit on a guess (that double-bills). Call
94
- `get_ad_credits` first; the user can check `gooseworks credits`.
100
+ - Media generation (FAL / ElevenLabs) through the GooseWorks proxies is the **REAL spend** billed
101
+ to the agent per call as you generate (Step 4). `submit_render { kind: "full" }` additionally
102
+ debits **1 nominal ad credit when the render ROW is opened** (a bookkeeping fee, NOT the render's
103
+ true cost) so open it only once you actually have a rendered master (Step 4.1/4.2), and never
104
+ re-submit on a guess (that double-bills). The final-video QC gate (Step 4.3) then sits between
105
+ that master and PINNING it. Call `get_ad_credits` first; the user can check `gooseworks credits`.
95
106
 
96
107
  ## Step 1 — resolve the project, source, brand
97
108
 
98
- 1. `get_ad_project { project_id }` → keep `brand_id`, `source_sample_id`, `name`, `status`.
109
+ 1. `get_ad_project { project_id }` → keep `brand_id`, `source_sample_id`, `name`, `status`, and
110
+ the **top-level** `app_url` + `brand_url` (returned alongside `project`, NOT inside it) — these
111
+ are the links you hand the user for the in-app review (Step 3) and the final delivery (Step 5).
99
112
  2. `get_ad_template { template_id: source_sample_id }` → the source video: `media_url`,
100
113
  `recipe`, `format` (e.g. "imessage"), `extracted_script`, `how_to`, `remix_spec`.
101
114
  3. Brand gate: `get_brand_kit { brand_id }`. If `researchStatus` is `complete`, REUSE it —
@@ -131,32 +144,55 @@ Playwright resolve, and point the recorder's `NODE_PATH` at it.
131
144
  > recipe does not yet carry `atoms` / `instructions` still hold the legacy `recipe.thread` payload;
132
145
  > migrate them to this shape (capabilities + instructions in the DB) — do not reintroduce a CLI map.
133
146
 
134
- ## Step 3 — prepare ALL the ingredients, then review ONCE (always, before any paid render)
135
-
136
- This is a **review-once** flow: prepare every ingredient the video needs, show the whole set to
137
- the user in the app, get ONE approval, then render. Never render before approval, and don't drip
138
- ingredients out one at a time.
139
-
140
- **The review is of the individual PIECES, never the finished cut.** Prepare and mirror only the
141
- *ingredients* the script, each conversation image, the end card, the voice/music plan. Do NOT
142
- stitch, composite, or render the assembled video (no "full cascade" / "approved cut" clip) during
143
- ingredient prep, and never add such a clip as a review ingredient. Assembling the video before
144
- approval defeats this gate — the user opens "Review before rendering" and sees an already-finished
145
- video, then rightly asks why it was made before they approved (GOOSE-2542) and it wastes the
146
- render. The full video is stitched ONLY in Step 4, after approval. A `video` ingredient here is
147
- only for a genuinely separate SOURCE clip the format needs (e.g. supplied b-roll), never the
148
- assembled output.
149
-
150
- 1. **Generate every ingredient the format needs not just the script.** For an iMessage video
151
- that's typically: the **script** (the bubble thread), the **image(s)** shown in the conversation
152
- (one or more), and the **end card**. Richer templates add more (hook frame, background, product
153
- shots, music bed…). Read the recipe for the exact ingredient list. Generate the visuals NOW
154
- (media proxies / recipe), and `get_upload_url` each preview asset to the project folder
155
- `agent-config/brands/<brand_slug>/projects/<project_id>/working/review/<name>` (the same
156
- path-prefix rule as final publish a bare `working/review/<name>` won't render in the panel).
157
- In `script_drafts`, set each ingredient's `path` to the project-relative `working/review/<name>`.
158
- You may ask the user a couple of clarifying questions about the generation first if the recipe
159
- calls for it (angle, which product, offer/code) — batch them, then prepare everything.
147
+ ## Step 3 — assemble the review set, then get ONE approval in the app (before the expensive render)
148
+
149
+ This is a **review-once** flow: put the whole review set in the app, get ONE approval, then run the
150
+ expensive render + any remaining paid work end-to-end. Never spend on the expensive render before
151
+ approval, and don't drip pieces out one at a time and re-pause.
152
+
153
+ **What goes in the review show the REAL cheap pieces, PROMPT only the expensive render.** Split
154
+ every piece three ways by cost, NOT just "free vs paid":
155
+ - **FREE** (an iMessage / Apple-Notes HTML mockup, a text/CTA line rendered locally, no proxy
156
+ call) generate NOW and mirror the real asset.
157
+ - **CHEAP paid**a single still/image, the creator/avatar frame, the end card, a short voiceover
158
+ or music bed (each costs cents roughly **≤ 100 credits**) **generate these NOW too** and
159
+ mirror the real asset. The few credits buy a real review: the user SEES the actual creator face
160
+ and end card and HEARS the VO, instead of judging a prompt. **This OVERRIDES any recipe rule that
161
+ says to gate ALL paid calls** — only the expensive render below is gated.
162
+ - **EXPENSIVE paid** — the video take / final AI render (hundreds of credits) → do NOT generate.
163
+ Put its **exact prompt/spec** (+ ref image URLs) in the tile. This is the ONE thing approved as a
164
+ prompt (you can't preview a hundreds-of-credits video for free); it's generated only in Step 4.
165
+
166
+ **The expensive render's exact prompt must be in the panel BEFORE you ask for approval** — so a
167
+ single "go" runs it (plus any remaining paid work) without re-pausing mid-run.
168
+
169
+ **Show every cost in CREDITS, never dollars.** 1 credit = $0.01 and media generations bill at
170
+ provider-cost × 1.2, so **credits round-up(provider-$ × 120)** per generation, plus a flat
171
+ **200-credit base per video**. Convert any $ figures to credits and show ONLY credits to the user —
172
+ never print a "$…" amount.
173
+
174
+ **Never assemble/stitch the finished video for review.** The review is of the individual pieces (or
175
+ their prompts) — never a "full cascade" / "approved cut" clip. Building the whole video before
176
+ approval defeats the gate (the user opens the review to an already-finished video) and wastes the
177
+ render (GOOSE-2542). The full video is assembled ONLY in Step 4, after approval. A `video`
178
+ ingredient here is only a genuinely separate SOURCE clip the format needs (e.g. supplied b-roll).
179
+
180
+ 1. **Assemble every piece the format needs — not just the script.** Read the recipe for the exact
181
+ list. For an iMessage video that's the **script** (bubble thread), the **conversation image(s)**,
182
+ and the **end card**; richer templates add a hook frame, background, product shots, music bed, a
183
+ creator/avatar, a voiceover… For each piece, decide FREE / CHEAP-paid / EXPENSIVE-paid (above):
184
+ - **FREE or CHEAP paid** (≤ ~100 credits — HTML mockups, a still, the creator frame, the end
185
+ card, a short VO/music bed) → generate it now and `get_upload_url` the asset to the project
186
+ folder `agent-config/brands/<brand_slug>/projects/<project_id>/working/review/<name>` (same
187
+ path-prefix rule as final publish — a bare `working/review/<name>` won't render in the panel);
188
+ set that piece's `path` in `script_drafts` to the project-relative `working/review/<name>`.
189
+ - **EXPENSIVE paid** (the video take / final render, hundreds of credits) → do NOT generate. Put
190
+ the **exact prompt/spec** (and any ref image URLs) in the tile's `text` / `subtitle` so the
191
+ user reviews what will be spent on. No `path` yet — it's generated in Step 4.
192
+ Include the **estimated cost in CREDITS** (never dollars) of the cheap pieces already generated +
193
+ the pending render, so the user approves knowing the total spend. You may batch a couple of
194
+ clarifying questions first if the recipe calls for it (angle, which product, offer/code), then
195
+ assemble everything.
160
196
  2. **Mirror the whole ingredient set for review** — `update_ad_project_script { project_id,
161
197
  script_drafts, script }`. `script_drafts` is a structured payload of **container-tagged
162
198
  ingredients** so the app renders each piece the right way:
@@ -171,21 +207,34 @@ assembled output.
171
207
  for the podcast shape, or pass the readable `script` string).
172
208
  `path` = `working/review/<name>` (upload the preview asset first via `get_upload_url`); `url`
173
209
  works too. **Label every ingredient** ("Hook image", "End card", "Voiceover", "Background
174
- music", "HER"). This writes NO render and costs NO credits — it populates the review panel.
175
- 3. **STOP and ask the user to approve the ingredients in THIS Claude Code session.** Do not render
176
- until they say go. If they want changes, regenerate the affected ingredient, call
177
- `update_ad_project_script` again, and re-ask. Only AFTER approval do Step 4.
210
+ music", "HER"). The `update_ad_project_script` call itself writes no render and costs no credits
211
+ (the cheap pieces you already generated above have their own small cost) it just populates the
212
+ review panel.
213
+ 3. **STOP — the review happens in the APP's review panel, NOT in this chat.** You've mirrored the
214
+ ingredients (3.2); now hand the user the project's `app_url` (from `get_ad_project`) and tell
215
+ them to review the pieces there and hit **"Approve & render"**. That button gives them a short
216
+ message to paste back into this session — THAT is your go-ahead. Do NOT paste the
217
+ script/ingredients into the chat for a thumbs-up, and do NOT render until that approval comes
218
+ back from the app. If they want changes (via the app's comments or here), regenerate the
219
+ affected ingredient, call `update_ad_project_script` again, tell them it's refreshed in the
220
+ app, and wait for a fresh approval. Only AFTER the app approval do Step 4. A single approval
221
+ authorises the WHOLE remaining chain — generate every paid piece, render, self-QC, publish —
222
+ with NO further pauses (that is exactly why every paid prompt must already be in the panel).
178
223
 
179
224
  ## Step 4 — render locally, report stages, publish
180
225
 
181
- 1. Render per the recipe (Playwright record ffmpeg stitch `mix-master` audio). Generate any
182
- hook / background / end-card assets through the media proxies (below).
226
+ 1. Now generate every PAID piece you showed as a prompt in Step 3 — the AI stills/video, voice,
227
+ music, the end-card render through the media proxies (below), each from its approved prompt.
228
+ Then assemble per the recipe (Playwright record where needed → ffmpeg stitch → `mix-master`
229
+ audio).
183
230
  2. Open the row LAST: `submit_render { project_id, kind: "full" }` → keep `render_id`, then
184
231
  `update_render_status { render_id, status: "running" }`. The render row tracks status only
185
232
  (queued / running / complete / failed) — narrate fine-grained progress with
186
233
  `append_project_message` instead.
187
- 3. **MANDATORY final-video review gate — review EVERY finished master before `set_final_render`,
188
- whatever the format (UGC or not).** The render credit is already spent (`submit_render` in 4.2);
234
+ 3. **MANDATORY final-video QC gate — YOU review EVERY finished master before `set_final_render`,
235
+ whatever the format (UGC or not).** This is your own automated quality check, separate from the
236
+ user's Step-3 approval — it does not go back to the user. The render row is already open (its
237
+ nominal credit spent, `submit_render` in 4.2);
189
238
  this gate stands between a rendered master and PINNING/publishing it, so a bad render never gets
190
239
  set as final. A master that looks fine on a still can still have a mis-voiced word, a caption
191
240
  drifting off its line, a beat out of order, or a deformation — review the actual VIDEO, not
@@ -289,13 +338,23 @@ path. (`fal-storage-proxy` may 404 depending on the install; don't block on it
289
338
 
290
339
  - **MCP + ffmpeg + Playwright required** — run `gooseworks doctor` in Phase 0; stop with the
291
340
  exact fix it prints if anything is ✗.
292
- - **Prepare ALL ingredients first** (script + every visual: image(s) + end card + whatever else
293
- the template needs), mirror the whole set with `update_ad_project_script`, and get the user's
294
- approval in-session BEFORE rendering always (review-once).
295
- - **Never assemble the full video before approval.** The review shows the individual pieces, not a
296
- stitched/composited cut; do not add a "full cascade" / finished-video clip as a review ingredient
297
- (GOOSE-2542). The assembled video is produced only in Step 4, after the user approves.
298
- - **submit_render LAST**; `output_url` = the durable render-file URL, never a CDN URL.
341
+ - **Assemble the whole review set first**, mirror it with `update_ad_project_script`, and get the
342
+ user's approval **in the app's review panel** (the "Approve & render" button) BEFORE the expensive
343
+ render — never ask for a thumbs-up in this chat (review-once, in-app).
344
+ - **Show the REAL cheap pieces; PROMPT only the expensive render.** Generate the FREE + CHEAP-paid
345
+ pieces (≤ ~100 credits stills, creator frame, end card, short VO/music) and mirror the real
346
+ assets; put ONLY the expensive video take/render in the panel as its exact prompt. That prompt
347
+ must be in the panel before you ask to approve, so a single "go" runs the render + any remaining
348
+ paid work (→ QC → publish) with no re-pausing.
349
+ - **Costs in CREDITS, never dollars.** credits ≈ round-up(provider-$ × 120) per generation + a flat
350
+ 200-credit base per video; never show a "$…" figure to the user.
351
+ - **Never assemble the full video before approval.** The review shows the
352
+ individual PIECES, never the finished cut (or their prompts) — not a
353
+ stitched/composited cut; do not add a "full cascade" / finished-video clip
354
+ as a review ingredient (GOOSE-2542). The assembled video is produced only in
355
+ Step 4.
356
+ - **submit_render only after the master is rendered** (Step 4.2), never on a guess; `output_url` =
357
+ the durable render-file URL, never a CDN URL.
299
358
  - **Always pass `project_id` on media-proxy calls** (fal / ElevenLabs) so the credits attribute
300
359
  to this ad project — that's what lets the user see per-project spend in the app.
301
360
  - **Verify a real, non-empty MP4** (watch it) before marking the render complete.
@@ -54,6 +54,42 @@ To check credit balance:
54
54
  gooseworks credits
55
55
  ```
56
56
 
57
+ ## User Context (onboarding)
58
+
59
+ You have two MCP tools for the user's onboarding CONTEXT — who they are and what they want GooseWorks for. It's stored server-side (org-scoped), separate from the ads brand kit.
60
+
61
+ - `get_user_context` — read it. **At the START of a session, call this once** and use what you learn (company, role, the use-cases they picked, their goals, freeform notes) to tailor which skills/APIs you reach for. Best-effort: if the `mcp__gooseworks__*` tools aren't connected, skip silently and carry on.
62
+ - `update_user_context` — save it (partial update; only the fields you pass are touched).
63
+
64
+ ### Running "onboard me" (or a first run with empty context)
65
+
66
+ If the user says "onboard me" — or `get_user_context` returns `onboarded: false` and they're starting fresh — run a short, friendly interview, then save the answers. Open with this framing:
67
+
68
+ > Gooseworks gives your AI agent access to skills and APIs for growth and marketing work. For example: making ad creatives, finding influencers, scraping social profiles and posts from X/LinkedIn, scraping ads from Meta/LinkedIn, scraping reddit, and finding leads to target and their emails — and much more. Visit skills.gooseworks.ai to see the full library of skills.
69
+
70
+ Then ask (a few at a time is fine — don't interrogate):
71
+ 1. **What's your company's website?** → `company_website`
72
+ 2. **What's your role?** → `role`
73
+ 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)
74
+ 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`
75
+
76
+ **Save** with `update_user_context { company_website, role, use_cases, goals, context_md }` — put any extra detail you learned into `context_md` as a short summary.
77
+
78
+ **Then recommend REAL next steps — grounded, not from memory. This is the WHOLE POINT of onboarding; do not skip it or wing a generic playbook:**
79
+ 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):**
80
+ - **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.
81
+ - **VIDEO ads** → **`goose-video`**. **Charts / slides / graphics** → **`goose-graphics`**.
82
+ - **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.
83
+ 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.
84
+ 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.)
85
+ 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).
86
+ 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.
87
+
88
+ A suggestion is only "grounded" if it came from routing to the right domain skill (`goose-ads` / `goose-video` / `goose-graphics`) or from `gooseworks search` (a real GTM skill) — plus, ideally, reading their site. Do that BEFORE you suggest; never present a from-memory capability list as if you'd checked.
89
+
90
+ ### Update as needed
91
+ Whenever the user reveals durable context mid-session (their company, role, what they're trying to accomplish), persist it with `update_user_context` so future sessions start smarter.
92
+
57
93
  ## How to Use
58
94
 
59
95
  ### If a specific skill is requested (e.g. --skill <slug> or "use the <name> skill")