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 +25 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +6 -16
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +26 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/whoami.d.ts +11 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +84 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/skills/master-skill.d.ts.map +1 -1
- package/dist/skills/master-skill.js +143 -48
- package/dist/skills/master-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/goose-video/SKILL.md +107 -48
- package/skills/gooseworks/SKILL.md +36 -0
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,
|
|
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"}
|
package/dist/commands/install.js
CHANGED
|
@@ -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
|
|
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('
|
|
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
|
-
}
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,
|
|
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;
|
|
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"}
|
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,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":"
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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
|
-
|
|
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)
|
|
657
|
-
\`submit_render { kind: "full" }\`
|
|
658
|
-
|
|
659
|
-
|
|
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 —
|
|
700
|
-
|
|
701
|
-
This is a **review-once** flow:
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
**
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
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").
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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.
|
|
747
|
-
|
|
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
|
|
753
|
-
whatever the format (UGC or not).**
|
|
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
|
-
- **
|
|
858
|
-
the
|
|
859
|
-
|
|
860
|
-
- **
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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,
|
|
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
|
@@ -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
|
-
|
|
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)
|
|
92
|
-
`submit_render { kind: "full" }`
|
|
93
|
-
|
|
94
|
-
|
|
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 —
|
|
135
|
-
|
|
136
|
-
This is a **review-once** flow:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
**
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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").
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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.
|
|
182
|
-
|
|
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
|
|
188
|
-
whatever the format (UGC or not).**
|
|
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
|
-
- **
|
|
293
|
-
the
|
|
294
|
-
|
|
295
|
-
- **
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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")
|