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