gooseworks 0.3.12 → 0.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/oauth-server.d.ts +8 -1
- package/dist/auth/oauth-server.d.ts.map +1 -1
- package/dist/auth/oauth-server.js +14 -2
- package/dist/auth/oauth-server.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +8 -17
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +30 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +100 -10
- package/dist/skills/master-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/goose-video/SKILL.md +64 -10
- package/skills/gooseworks/SKILL.md +36 -0
|
@@ -6,6 +6,13 @@ interface OAuthResult {
|
|
|
6
6
|
default_agent_id?: string;
|
|
7
7
|
mcp_server_url?: string;
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* @param creatorRef Creator Program referral code (from `--ref`). Forwarded to
|
|
11
|
+
* the `/cli/auth` page as `?creator_ref=`, which passes it onto `/auth/google`
|
|
12
|
+
* so the backend attributes a first-time signup to that creator's cash rail.
|
|
13
|
+
* No-op for users who are already signed in (attribution only lands on the
|
|
14
|
+
* OAuth signup, not on token re-exchange).
|
|
15
|
+
*/
|
|
16
|
+
export declare function runOAuthFlow(apiBase: string, creatorRef?: string): Promise<OAuthResult>;
|
|
10
17
|
export {};
|
|
11
18
|
//# sourceMappingURL=oauth-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-server.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,
|
|
1
|
+
{"version":3,"file":"oauth-server.d.ts","sourceRoot":"","sources":["../../src/auth/oauth-server.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAkItB"}
|
|
@@ -44,7 +44,14 @@ const credentials_1 = require("./credentials");
|
|
|
44
44
|
const logger = __importStar(require("../utils/logger"));
|
|
45
45
|
const config_1 = require("../config");
|
|
46
46
|
const OAUTH_TIMEOUT_MS = 120_000;
|
|
47
|
-
|
|
47
|
+
/**
|
|
48
|
+
* @param creatorRef Creator Program referral code (from `--ref`). Forwarded to
|
|
49
|
+
* the `/cli/auth` page as `?creator_ref=`, which passes it onto `/auth/google`
|
|
50
|
+
* so the backend attributes a first-time signup to that creator's cash rail.
|
|
51
|
+
* No-op for users who are already signed in (attribution only lands on the
|
|
52
|
+
* OAuth signup, not on token re-exchange).
|
|
53
|
+
*/
|
|
54
|
+
async function runOAuthFlow(apiBase, creatorRef) {
|
|
48
55
|
const state = crypto.randomBytes(16).toString('hex');
|
|
49
56
|
const frontendBase = config_1.FRONTEND_URL;
|
|
50
57
|
return new Promise((resolve, reject) => {
|
|
@@ -132,7 +139,12 @@ async function runOAuthFlow(apiBase) {
|
|
|
132
139
|
// Pass api_base so the frontend can route Google OAuth back through the
|
|
133
140
|
// correct backend (e.g. http://localhost:5999 for local dev vs. the
|
|
134
141
|
// ngrok/prod URL baked into NEXT_PUBLIC_API_URL).
|
|
135
|
-
|
|
142
|
+
let authUrl = `${frontendBase}/cli/auth?callback_port=${port}&state=${state}&api_base=${encodeURIComponent(apiBase)}`;
|
|
143
|
+
// Carry the creator referral code through so the frontend can forward it
|
|
144
|
+
// to /auth/google as ?creator_ref= for signup attribution.
|
|
145
|
+
if (creatorRef) {
|
|
146
|
+
authUrl += `&creator_ref=${encodeURIComponent(creatorRef)}`;
|
|
147
|
+
}
|
|
136
148
|
logger.info('Opening browser for Google sign-in...');
|
|
137
149
|
(0, open_1.default)(authUrl).catch(() => {
|
|
138
150
|
logger.warn(`Could not open browser. Please visit:\n ${authUrl}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-server.js","sourceRoot":"","sources":["../../src/auth/oauth-server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"oauth-server.js","sourceRoot":"","sources":["../../src/auth/oauth-server.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;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,oBAAoB,IAAI,OAAO,CA0J9C;AAED,eAAO,MAAM,cAAc,SAAyB,CAAC"}
|
package/dist/commands/install.js
CHANGED
|
@@ -61,6 +61,7 @@ Examples:
|
|
|
61
61
|
.option('--mcp', 'Also register the GooseWorks MCP server')
|
|
62
62
|
.option('--with <skill-slug>', 'Also install a standalone GooseWorks skill (repeatable)', collectSkillSlug, [])
|
|
63
63
|
.option('--api-base <url>', 'API base URL', config_1.API_BASE)
|
|
64
|
+
.option('--ref <code>', 'Creator referral code — attributes your signup to the GooseWorks creator who referred you')
|
|
64
65
|
.action(async (opts) => {
|
|
65
66
|
logger.banner((0, version_1.getVersion)());
|
|
66
67
|
const targetAgents = resolveTargetAgents(opts);
|
|
@@ -72,7 +73,7 @@ Examples:
|
|
|
72
73
|
const wantMcp = !!(opts.mcp || opts.all);
|
|
73
74
|
// Step 1: Authenticate
|
|
74
75
|
logger.step(1, 3, 'Authenticating...');
|
|
75
|
-
const creds = await (0, login_1.ensureLoggedIn)(opts.apiBase);
|
|
76
|
+
const creds = await (0, login_1.ensureLoggedIn)(opts.apiBase, opts.ref);
|
|
76
77
|
logger.success(`Logged in as ${creds.email}`);
|
|
77
78
|
// Step 2: Install entry skills (clean old skills first)
|
|
78
79
|
logger.step(2, 3, 'Installing GooseWorks skills...');
|
|
@@ -182,23 +183,13 @@ Examples:
|
|
|
182
183
|
}
|
|
183
184
|
}
|
|
184
185
|
const agentNames = targetAgents.map((a) => a === 'claude' ? 'Claude Code' : a === 'codex' ? 'Codex' : 'Cursor').join(' and ');
|
|
185
|
-
logger.done(`Setup complete! Open ${agentNames} and
|
|
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.
|
|
186
|
+
logger.done(`Setup complete! Open ${agentNames} and pick one to get started:`);
|
|
191
187
|
console.log('');
|
|
192
|
-
logger.info('
|
|
193
|
-
logger.example('/
|
|
194
|
-
|
|
195
|
-
logger.
|
|
196
|
-
|
|
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
|
-
}
|
|
188
|
+
logger.info('New here? Get set up in 30 seconds:');
|
|
189
|
+
logger.example('/gooseworks onboard me');
|
|
190
|
+
console.log('');
|
|
191
|
+
logger.info('Or jump straight into making an ad:');
|
|
192
|
+
logger.example('/goose-ads make an ad for <your brand>');
|
|
202
193
|
console.log('');
|
|
203
194
|
});
|
|
204
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -4,5 +4,5 @@ export declare const loginCommand: Command;
|
|
|
4
4
|
* Ensures the user is logged in, running OAuth if needed.
|
|
5
5
|
* Returns credentials or exits the process.
|
|
6
6
|
*/
|
|
7
|
-
export declare function ensureLoggedIn(apiBase?: string): Promise<import("../auth/credentials").Credentials>;
|
|
7
|
+
export declare function ensureLoggedIn(apiBase?: string, creatorRef?: string): Promise<import("../auth/credentials").Credentials>;
|
|
8
8
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -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;
|
|
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,SA0BrB,CAAC;AAEL;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,MAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,sDAcnF"}
|
package/dist/commands/login.js
CHANGED
|
@@ -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,9 +82,27 @@ 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)
|
|
105
|
+
.option('--ref <code>', 'Creator referral code — attributes your signup to the GooseWorks creator who referred you')
|
|
84
106
|
.action(async (opts) => {
|
|
85
107
|
const existing = (0, credentials_1.getCredentials)();
|
|
86
108
|
if (existing) {
|
|
@@ -91,10 +113,12 @@ exports.loginCommand = new commander_1.Command('login')
|
|
|
91
113
|
return;
|
|
92
114
|
}
|
|
93
115
|
try {
|
|
94
|
-
const result = await (0, oauth_server_1.runOAuthFlow)(opts.apiBase);
|
|
116
|
+
const result = await (0, oauth_server_1.runOAuthFlow)(opts.apiBase, opts.ref);
|
|
95
117
|
logger.success(`Logged in as ${result.email}`);
|
|
96
118
|
refreshEntrySkillsOnLogin();
|
|
97
119
|
syncMcpRegistration();
|
|
120
|
+
openOnboarding();
|
|
121
|
+
showNextSteps();
|
|
98
122
|
}
|
|
99
123
|
catch (err) {
|
|
100
124
|
const message = err instanceof Error ? err.message : 'Login failed';
|
|
@@ -106,16 +130,19 @@ exports.loginCommand = new commander_1.Command('login')
|
|
|
106
130
|
* Ensures the user is logged in, running OAuth if needed.
|
|
107
131
|
* Returns credentials or exits the process.
|
|
108
132
|
*/
|
|
109
|
-
async function ensureLoggedIn(apiBase = config_1.API_BASE) {
|
|
133
|
+
async function ensureLoggedIn(apiBase = config_1.API_BASE, creatorRef) {
|
|
110
134
|
const existing = (0, credentials_1.getCredentials)();
|
|
111
135
|
if (existing)
|
|
112
136
|
return existing;
|
|
113
|
-
const result = await (0, oauth_server_1.runOAuthFlow)(apiBase);
|
|
137
|
+
const result = await (0, oauth_server_1.runOAuthFlow)(apiBase, creatorRef);
|
|
114
138
|
const creds = (0, credentials_1.getCredentials)();
|
|
115
139
|
if (!creds) {
|
|
116
140
|
logger.error('Failed to save credentials after login');
|
|
117
141
|
process.exit(1);
|
|
118
142
|
}
|
|
143
|
+
// Fresh login via an install/other command path — nudge onboarding too, so
|
|
144
|
+
// `gooseworks install --all` on a logged-out machine also opens the page.
|
|
145
|
+
openOnboarding();
|
|
119
146
|
return creds;
|
|
120
147
|
}
|
|
121
148
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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,CAoalD"}
|
|
@@ -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")
|
|
@@ -570,11 +606,12 @@ description: >
|
|
|
570
606
|
GooseWorks video ads — remix a video ad template (iMessage chat-reveal, more coming) into a
|
|
571
607
|
branded video ad for the user's product. Renders LOCALLY on the user's machine (Playwright +
|
|
572
608
|
ffmpeg + GooseWorks media proxies) and saves the finished MP4 back to the project over MCP.
|
|
573
|
-
Use when the user says "make the video for project <id>",
|
|
574
|
-
template, or asks to remix a video ad. Unlike goose-ads (static images,
|
|
575
|
-
video renders locally and reports progress + the result back through the
|
|
609
|
+
Use when the user says "make the video for project <id>", "for video batch <id>", references a
|
|
610
|
+
video ad project/batch or template, or asks to remix a video ad. Unlike goose-ads (static images,
|
|
611
|
+
generated server-side), video renders locally and reports progress + the result back through the
|
|
612
|
+
gooseworks MCP tools.
|
|
576
613
|
category: ads
|
|
577
|
-
version: 0.
|
|
614
|
+
version: 0.3.0
|
|
578
615
|
author: GooseWorks
|
|
579
616
|
tags: [gooseworks, ads, video, remix, imessage, local-render, byoa]
|
|
580
617
|
---
|
|
@@ -669,11 +706,63 @@ says to shell out, use the MCP equivalent:
|
|
|
669
706
|
re-submit on a guess (that double-bills). The final-video QC gate (Step 4.3) then sits between
|
|
670
707
|
that master and PINNING it. Call \`get_ad_credits\` first; the user can check \`gooseworks credits\`.
|
|
671
708
|
|
|
709
|
+
## Step 0 — project id, or video BATCH id? (fan out before anything else)
|
|
710
|
+
|
|
711
|
+
The handoff you were pasted is EITHER a single \`project <id>\` OR a \`video batch <id>\`. A batch is
|
|
712
|
+
the app's "N concepts" flow: one composer submission fans out into **N independent concept projects**
|
|
713
|
+
(the user picked a concept count, default 3), and the app expects EACH to be rendered. **Handle both:**
|
|
714
|
+
|
|
715
|
+
- **\`project <id>\`** → you have one project. Treat it as a batch of one and continue to Step 1.
|
|
716
|
+
- **\`video batch <id>\`** → call \`get_ad_video_batch { video_batch_id }\`. It returns every child
|
|
717
|
+
concept under \`projects[]\` — each is a normal project with its own \`id\`, \`variant_index\`
|
|
718
|
+
(Concept 1..N), and its own \`creative_brief\` (the per-concept angle/hook/offer/message). **You
|
|
719
|
+
MUST process every concept, not just the first** — dropping concepts 2..N is the #1 batch bug.
|
|
720
|
+
|
|
721
|
+
**Loop shape (one agent, sequential, ONE approval for the whole batch):**
|
|
722
|
+
1. Run **Step 1 + Step 1.5 + Step 2 + Step 3-assemble** for EACH concept project (each has its own
|
|
723
|
+
\`project_id\`, brief, and \`working/\` folder — never cross-write between concepts).
|
|
724
|
+
2. Mirror EVERY concept's review set (Step 3's \`update_ad_project_script\` per project), then stop
|
|
725
|
+
for **ONE** approval that covers all concepts — show the per-concept credit estimate and the
|
|
726
|
+
batch total. Set the batch to \`review\` (\`update_ad_video_batch { status: "review" }\`).
|
|
727
|
+
3. On approval, set the batch to \`rendering\` and run **Step 4 (the expensive render)** for each
|
|
728
|
+
concept **sequentially** (finish Concept 1's master before starting Concept 2 — one machine can't
|
|
729
|
+
render them in parallel). Deliver each (Step 5). When all concepts are pinned, set the batch to
|
|
730
|
+
\`complete\`.
|
|
731
|
+
|
|
732
|
+
If a single concept fails, keep going with the rest, mark that concept blocked, and report which
|
|
733
|
+
ones shipped — never abort the whole batch on one bad concept. Everything below (Steps 1–5) is
|
|
734
|
+
written per-project; a batch just runs it N times with the shared approval gate above.
|
|
735
|
+
|
|
672
736
|
## Step 1 — resolve the project, source, brand
|
|
673
737
|
|
|
674
|
-
1. \`get_ad_project { project_id }\` → keep \`brand_id\`, \`source_sample_id\`, \`name\`, \`status\`,
|
|
675
|
-
|
|
676
|
-
|
|
738
|
+
1. \`get_ad_project { project_id }\` → keep \`brand_id\`, \`source_sample_id\`, \`name\`, \`status\`, the
|
|
739
|
+
**top-level** \`app_url\` + \`brand_url\` (returned alongside \`project\`, NOT inside it — the links
|
|
740
|
+
you hand the user for the in-app review in Step 3 and delivery in Step 5), AND the user's
|
|
741
|
+
**\`creative_brief\`**, project **\`assets\`**, \`character_id\`, \`default_voice_id\` — these are the
|
|
742
|
+
authoritative inputs the user chose in the composer (see Step 1.5). Do NOT discard them.
|
|
743
|
+
|
|
744
|
+
### Step 1.5 — the project brief is AUTHORITATIVE (honor it; don't re-ask)
|
|
745
|
+
|
|
746
|
+
The composer already collected the user's creative direction onto the project. **Read it and treat
|
|
747
|
+
it as ground truth — it OVERRIDES the template recipe's defaults, and it REPLACES the clarifying
|
|
748
|
+
questions you would otherwise ask.** Only fall back to the recipe default (then, last, to asking)
|
|
749
|
+
for a field the brief leaves empty. Map the fields you WILL honor:
|
|
750
|
+
|
|
751
|
+
- \`creative_brief.productName\` / \`.offer\` / \`.angle\` → the product, offer/code, and angle. Do
|
|
752
|
+
**not** ask "which product / what offer / what angle" if these are set.
|
|
753
|
+
- \`creative_brief.concept\` (on a batch child) → this concept's **\`angle\` / \`hook\` / \`offer\` /
|
|
754
|
+
\`message\` / \`note\`** — the per-concept differentiator. Honor it verbatim; it's WHY the user asked
|
|
755
|
+
for N concepts. \`angle: "auto"\` or empty means "you choose."
|
|
756
|
+
- Project \`assets\` + \`creative_brief.reference_image_urls\` → the user's **own reference images**.
|
|
757
|
+
Use them as the product/brand refs (alongside the brand kit), don't ignore them for generic recipe
|
|
758
|
+
assets.
|
|
759
|
+
- \`character_id\` → the avatar/creator to use. \`default_voice_id\` → the voice for any VO (put its
|
|
760
|
+
NAME in the review \`subtitle\`). Use these instead of picking your own.
|
|
761
|
+
- \`creative_brief.ratio\` / \`.durationSeconds\` → target aspect ratio + length. Honor when the
|
|
762
|
+
format's render pipeline supports it; if the format physically can't (e.g. a fixed phone-mockup
|
|
763
|
+
aspect), keep the format's native value and note the constraint in the review rather than silently
|
|
764
|
+
ignoring the request.
|
|
765
|
+
- \`polish_policy\` (\`standard\` | \`extra\`) → \`extra\` means spend the extra pass on QC/polish.
|
|
677
766
|
2. \`get_ad_template { template_id: source_sample_id }\` → the source video: \`media_url\`,
|
|
678
767
|
\`recipe\`, \`format\` (e.g. "imessage"), \`extracted_script\`, \`how_to\`, \`remix_spec\`.
|
|
679
768
|
3. Brand gate: \`get_brand_kit { brand_id }\`. If \`researchStatus\` is \`complete\`, REUSE it —
|
|
@@ -755,9 +844,10 @@ ingredient here is only a genuinely separate SOURCE clip the format needs (e.g.
|
|
|
755
844
|
the **exact prompt/spec** (and any ref image URLs) in the tile's \`text\` / \`subtitle\` so the
|
|
756
845
|
user reviews what will be spent on. No \`path\` yet — it's generated in Step 4.
|
|
757
846
|
Include the **estimated cost in CREDITS** (never dollars) of the cheap pieces already generated +
|
|
758
|
-
the pending render, so the user approves knowing the total spend.
|
|
759
|
-
|
|
760
|
-
|
|
847
|
+
the pending render, so the user approves knowing the total spend. **Answer clarifying questions
|
|
848
|
+
from the project brief FIRST (Step 1.5)** — only ask the user for a field (angle, which product,
|
|
849
|
+
offer/code) the \`creative_brief\` leaves empty AND the recipe can't default. Do not re-ask for
|
|
850
|
+
anything the composer already captured.
|
|
761
851
|
2. **Mirror the whole ingredient set for review** — \`update_ad_project_script { project_id,
|
|
762
852
|
script_drafts, script }\`. \`script_drafts\` is a structured payload of **container-tagged
|
|
763
853
|
ingredients** so the app renders each piece the right way:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AA4BA,wCAMC;AAWD,
|
|
1
|
+
{"version":3,"file":"master-skill.js","sourceRoot":"","sources":["../../src/skills/master-skill.ts"],"names":[],"mappings":";;AA4BA,wCAMC;AAWD,sDA8NC;AAiBD,0DAsUC;AAcD,8DAoaC;AAz/BD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkaR,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -5,11 +5,12 @@ description: >
|
|
|
5
5
|
GooseWorks video ads — remix a video ad template (iMessage chat-reveal, more coming) into a
|
|
6
6
|
branded video ad for the user's product. Renders LOCALLY on the user's machine (Playwright +
|
|
7
7
|
ffmpeg + GooseWorks media proxies) and saves the finished MP4 back to the project over MCP.
|
|
8
|
-
Use when the user says "make the video for project <id>",
|
|
9
|
-
template, or asks to remix a video ad. Unlike goose-ads (static images,
|
|
10
|
-
video renders locally and reports progress + the result back through the
|
|
8
|
+
Use when the user says "make the video for project <id>", "for video batch <id>", references a
|
|
9
|
+
video ad project/batch or template, or asks to remix a video ad. Unlike goose-ads (static images,
|
|
10
|
+
generated server-side), video renders locally and reports progress + the result back through the
|
|
11
|
+
gooseworks MCP tools.
|
|
11
12
|
category: ads
|
|
12
|
-
version: 0.
|
|
13
|
+
version: 0.3.0
|
|
13
14
|
author: GooseWorks
|
|
14
15
|
tags: [gooseworks, ads, video, remix, imessage, local-render, byoa]
|
|
15
16
|
---
|
|
@@ -104,11 +105,63 @@ says to shell out, use the MCP equivalent:
|
|
|
104
105
|
re-submit on a guess (that double-bills). The final-video QC gate (Step 4.3) then sits between
|
|
105
106
|
that master and PINNING it. Call `get_ad_credits` first; the user can check `gooseworks credits`.
|
|
106
107
|
|
|
108
|
+
## Step 0 — project id, or video BATCH id? (fan out before anything else)
|
|
109
|
+
|
|
110
|
+
The handoff you were pasted is EITHER a single `project <id>` OR a `video batch <id>`. A batch is
|
|
111
|
+
the app's "N concepts" flow: one composer submission fans out into **N independent concept projects**
|
|
112
|
+
(the user picked a concept count, default 3), and the app expects EACH to be rendered. **Handle both:**
|
|
113
|
+
|
|
114
|
+
- **`project <id>`** → you have one project. Treat it as a batch of one and continue to Step 1.
|
|
115
|
+
- **`video batch <id>`** → call `get_ad_video_batch { video_batch_id }`. It returns every child
|
|
116
|
+
concept under `projects[]` — each is a normal project with its own `id`, `variant_index`
|
|
117
|
+
(Concept 1..N), and its own `creative_brief` (the per-concept angle/hook/offer/message). **You
|
|
118
|
+
MUST process every concept, not just the first** — dropping concepts 2..N is the #1 batch bug.
|
|
119
|
+
|
|
120
|
+
**Loop shape (one agent, sequential, ONE approval for the whole batch):**
|
|
121
|
+
1. Run **Step 1 + Step 1.5 + Step 2 + Step 3-assemble** for EACH concept project (each has its own
|
|
122
|
+
`project_id`, brief, and `working/` folder — never cross-write between concepts).
|
|
123
|
+
2. Mirror EVERY concept's review set (Step 3's `update_ad_project_script` per project), then stop
|
|
124
|
+
for **ONE** approval that covers all concepts — show the per-concept credit estimate and the
|
|
125
|
+
batch total. Set the batch to `review` (`update_ad_video_batch { status: "review" }`).
|
|
126
|
+
3. On approval, set the batch to `rendering` and run **Step 4 (the expensive render)** for each
|
|
127
|
+
concept **sequentially** (finish Concept 1's master before starting Concept 2 — one machine can't
|
|
128
|
+
render them in parallel). Deliver each (Step 5). When all concepts are pinned, set the batch to
|
|
129
|
+
`complete`.
|
|
130
|
+
|
|
131
|
+
If a single concept fails, keep going with the rest, mark that concept blocked, and report which
|
|
132
|
+
ones shipped — never abort the whole batch on one bad concept. Everything below (Steps 1–5) is
|
|
133
|
+
written per-project; a batch just runs it N times with the shared approval gate above.
|
|
134
|
+
|
|
107
135
|
## Step 1 — resolve the project, source, brand
|
|
108
136
|
|
|
109
|
-
1. `get_ad_project { project_id }` → keep `brand_id`, `source_sample_id`, `name`, `status`,
|
|
110
|
-
|
|
111
|
-
|
|
137
|
+
1. `get_ad_project { project_id }` → keep `brand_id`, `source_sample_id`, `name`, `status`, the
|
|
138
|
+
**top-level** `app_url` + `brand_url` (returned alongside `project`, NOT inside it — the links
|
|
139
|
+
you hand the user for the in-app review in Step 3 and delivery in Step 5), AND the user's
|
|
140
|
+
**`creative_brief`**, project **`assets`**, `character_id`, `default_voice_id` — these are the
|
|
141
|
+
authoritative inputs the user chose in the composer (see Step 1.5). Do NOT discard them.
|
|
142
|
+
|
|
143
|
+
### Step 1.5 — the project brief is AUTHORITATIVE (honor it; don't re-ask)
|
|
144
|
+
|
|
145
|
+
The composer already collected the user's creative direction onto the project. **Read it and treat
|
|
146
|
+
it as ground truth — it OVERRIDES the template recipe's defaults, and it REPLACES the clarifying
|
|
147
|
+
questions you would otherwise ask.** Only fall back to the recipe default (then, last, to asking)
|
|
148
|
+
for a field the brief leaves empty. Map the fields you WILL honor:
|
|
149
|
+
|
|
150
|
+
- `creative_brief.productName` / `.offer` / `.angle` → the product, offer/code, and angle. Do
|
|
151
|
+
**not** ask "which product / what offer / what angle" if these are set.
|
|
152
|
+
- `creative_brief.concept` (on a batch child) → this concept's **`angle` / `hook` / `offer` /
|
|
153
|
+
`message` / `note`** — the per-concept differentiator. Honor it verbatim; it's WHY the user asked
|
|
154
|
+
for N concepts. `angle: "auto"` or empty means "you choose."
|
|
155
|
+
- Project `assets` + `creative_brief.reference_image_urls` → the user's **own reference images**.
|
|
156
|
+
Use them as the product/brand refs (alongside the brand kit), don't ignore them for generic recipe
|
|
157
|
+
assets.
|
|
158
|
+
- `character_id` → the avatar/creator to use. `default_voice_id` → the voice for any VO (put its
|
|
159
|
+
NAME in the review `subtitle`). Use these instead of picking your own.
|
|
160
|
+
- `creative_brief.ratio` / `.durationSeconds` → target aspect ratio + length. Honor when the
|
|
161
|
+
format's render pipeline supports it; if the format physically can't (e.g. a fixed phone-mockup
|
|
162
|
+
aspect), keep the format's native value and note the constraint in the review rather than silently
|
|
163
|
+
ignoring the request.
|
|
164
|
+
- `polish_policy` (`standard` | `extra`) → `extra` means spend the extra pass on QC/polish.
|
|
112
165
|
2. `get_ad_template { template_id: source_sample_id }` → the source video: `media_url`,
|
|
113
166
|
`recipe`, `format` (e.g. "imessage"), `extracted_script`, `how_to`, `remix_spec`.
|
|
114
167
|
3. Brand gate: `get_brand_kit { brand_id }`. If `researchStatus` is `complete`, REUSE it —
|
|
@@ -190,9 +243,10 @@ ingredient here is only a genuinely separate SOURCE clip the format needs (e.g.
|
|
|
190
243
|
the **exact prompt/spec** (and any ref image URLs) in the tile's `text` / `subtitle` so the
|
|
191
244
|
user reviews what will be spent on. No `path` yet — it's generated in Step 4.
|
|
192
245
|
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.
|
|
194
|
-
|
|
195
|
-
|
|
246
|
+
the pending render, so the user approves knowing the total spend. **Answer clarifying questions
|
|
247
|
+
from the project brief FIRST (Step 1.5)** — only ask the user for a field (angle, which product,
|
|
248
|
+
offer/code) the `creative_brief` leaves empty AND the recipe can't default. Do not re-ask for
|
|
249
|
+
anything the composer already captured.
|
|
196
250
|
2. **Mirror the whole ingredient set for review** — `update_ad_project_script { project_id,
|
|
197
251
|
script_drafts, script }`. `script_drafts` is a structured payload of **container-tagged
|
|
198
252
|
ingredients** so the app renders each piece the right way:
|
|
@@ -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")
|