@koda-sl/baker-cli 0.376.0-dev.494d5fded → 0.376.0-dev.945f4ff53
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 +6 -0
- package/dist/cli.js +397 -194
- package/dist/cli.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.js
CHANGED
|
@@ -133,7 +133,7 @@ import {
|
|
|
133
133
|
} from "./chunk-7YNOGIWQ.js";
|
|
134
134
|
|
|
135
135
|
// src/cli.ts
|
|
136
|
-
import { defineCommand as
|
|
136
|
+
import { defineCommand as defineCommand256, runMain } from "citty";
|
|
137
137
|
|
|
138
138
|
// src/cache-flag.ts
|
|
139
139
|
var NO_CACHE_ARG = {
|
|
@@ -5111,6 +5111,20 @@ var FLOW_SIDE_EFFECT_CATALOG = [
|
|
|
5111
5111
|
reference: SIDE_EFFECT_REF("httpWebhook")
|
|
5112
5112
|
},
|
|
5113
5113
|
crmSideEffect("googleSpreadsheet", "Appends a row to a Google Sheet.", "columnMapping", MAP_FIRST),
|
|
5114
|
+
{
|
|
5115
|
+
kind: "side-effect",
|
|
5116
|
+
type: "shopifyCustomer",
|
|
5117
|
+
summary: "Adds a sign-up to the connected Shopify store with the consent they ticked.",
|
|
5118
|
+
skeleton: {
|
|
5119
|
+
...SIDE_EFFECT_ENVELOPE,
|
|
5120
|
+
type: "shopifyCustomer",
|
|
5121
|
+
customer: { email: null, phone: null, acceptsEmailMarketing: null, acceptsSmsMarketing: null },
|
|
5122
|
+
offer: null
|
|
5123
|
+
},
|
|
5124
|
+
owners: { customer: "agent", offer: "agent" },
|
|
5125
|
+
gotcha: "Map email to an email field with baker flows map. Email and SMS consent each need their own optional, visible, initially unticked checkbox; SMS also needs phone. No connection secret is needed. An optional offer names a published sign-up offer; read baker shopify signup-offers. Show its code with ShopifySignupCode.",
|
|
5126
|
+
reference: SIDE_EFFECT_REF("shopifyCustomer")
|
|
5127
|
+
},
|
|
5114
5128
|
crmSideEffect("hubspotForm", "Submits to a HubSpot form endpoint.", "fieldMapping", MAP_FIRST),
|
|
5115
5129
|
crmSideEffect("pipedrive", "Creates or updates a Pipedrive record.", "fieldMapping", MAP_FIRST),
|
|
5116
5130
|
crmSideEffect("goHighlevelContact", "Creates or updates a GoHighLevel contact.", "fieldMapping", MAP_FIRST),
|
|
@@ -8541,9 +8555,9 @@ function parsePriority(value, { allowClear }) {
|
|
|
8541
8555
|
`Unknown --priority "${value}". Expected one of: ${ACTION_PRIORITIES.join(", ")}${allowClear ? ", or 'none' to clear" : ""}.`
|
|
8542
8556
|
);
|
|
8543
8557
|
}
|
|
8544
|
-
function looksScheduled(name,
|
|
8558
|
+
function looksScheduled(name, description2) {
|
|
8545
8559
|
const haystack = fold(`${name}
|
|
8546
|
-
${
|
|
8560
|
+
${description2}`);
|
|
8547
8561
|
return SCHEDULE_SIGNALS.some((re2) => re2.test(haystack));
|
|
8548
8562
|
}
|
|
8549
8563
|
var CAMPAIGN_ENTITY = String.raw`(?:campaigns?|campanas?|ad\s*sets?|adsets?|ad\s*groups?|adgroups?|ads?|anuncios?|conjuntos?\s+de\s+anuncios|grupos?\s+de\s+anuncios)`;
|
|
@@ -8701,10 +8715,10 @@ var SURFACE_RULES = [
|
|
|
8701
8715
|
var FAN_OUT_NUDGE_THRESHOLD = 2;
|
|
8702
8716
|
var FAN_OUT_THRESHOLD = 3;
|
|
8703
8717
|
var SCHEDULED_HINT = 'This reads as recurring/scheduled work. If it should run on a cadence or a future date, create a Scheduled agent instead \u2014 baker scheduled-agents create --cron "0 9 * * MON" (or --run-at, or --trigger for a reaction rather than a clock; guide: `__tooling__/docs/tools/baker/scheduled-agents.md`). Do not capture "set up a schedule" as a Work Action.';
|
|
8704
|
-
function looksExecutable(name,
|
|
8718
|
+
function looksExecutable(name, description2) {
|
|
8705
8719
|
const foldedName = fold(name);
|
|
8706
8720
|
const full = `${foldedName}
|
|
8707
|
-
${fold(
|
|
8721
|
+
${fold(description2)}`;
|
|
8708
8722
|
for (const rule of SURFACE_RULES) {
|
|
8709
8723
|
const haystack = rule.nameOnly ? foldedName : full;
|
|
8710
8724
|
if (rule.except?.some((re2) => re2.test(full))) {
|
|
@@ -8724,7 +8738,7 @@ ${fold(description)}`;
|
|
|
8724
8738
|
}
|
|
8725
8739
|
function buildCreateHints({
|
|
8726
8740
|
name,
|
|
8727
|
-
description,
|
|
8741
|
+
description: description2,
|
|
8728
8742
|
tempId,
|
|
8729
8743
|
tags,
|
|
8730
8744
|
prioritySet,
|
|
@@ -8732,13 +8746,13 @@ function buildCreateHints({
|
|
|
8732
8746
|
}) {
|
|
8733
8747
|
const hints2 = [];
|
|
8734
8748
|
const expanded = shellExpandedIn(`${name}
|
|
8735
|
-
${
|
|
8749
|
+
${description2}`);
|
|
8736
8750
|
if (expanded) {
|
|
8737
8751
|
hints2.push(
|
|
8738
8752
|
`The text says \u201C${expanded}\u201D: the shell replaced a $ amount (like $0) inside double quotes before Baker saw it. Fix it now: baker actions update ${tempId} --description '<the text, with the amounts as you read them>' (and --name '\u2026' if the name has it) \u2014 single quotes keep $ as written.`
|
|
8739
8753
|
);
|
|
8740
8754
|
}
|
|
8741
|
-
const advisory = advisoryHint(name,
|
|
8755
|
+
const advisory = advisoryHint(name, description2);
|
|
8742
8756
|
if (advisory) {
|
|
8743
8757
|
hints2.push(
|
|
8744
8758
|
`${advisory.hint} If nothing actually blocks it: baker actions draft remove ${tempId}, then do the work.`
|
|
@@ -8754,7 +8768,7 @@ ${description}`);
|
|
|
8754
8768
|
);
|
|
8755
8769
|
}
|
|
8756
8770
|
hints2.push(`Link dependencies: baker actions link --blocker <id> --blocked ${tempId}`);
|
|
8757
|
-
if (!
|
|
8771
|
+
if (!description2) {
|
|
8758
8772
|
hints2.push("Add description: baker actions update <tempId> --description '...' (what/why/where/done-when)");
|
|
8759
8773
|
}
|
|
8760
8774
|
if (!tags || tags.length === 0) {
|
|
@@ -8772,11 +8786,11 @@ ${description}`);
|
|
|
8772
8786
|
function shellExpandedIn(text2) {
|
|
8773
8787
|
return /(?:^|[\s(])((?:\/usr)?\/bin\/(?:ba|z|da|k)?sh|-?(?:ba|z|da|k)sh)\b/.exec(text2)?.[1] ?? null;
|
|
8774
8788
|
}
|
|
8775
|
-
function advisoryHint(name,
|
|
8776
|
-
if (looksScheduled(name,
|
|
8789
|
+
function advisoryHint(name, description2) {
|
|
8790
|
+
if (looksScheduled(name, description2)) {
|
|
8777
8791
|
return { kind: "scheduled", hint: SCHEDULED_HINT };
|
|
8778
8792
|
}
|
|
8779
|
-
const executable = looksExecutable(name,
|
|
8793
|
+
const executable = looksExecutable(name, description2);
|
|
8780
8794
|
return executable ? { kind: "executable", ...executable } : null;
|
|
8781
8795
|
}
|
|
8782
8796
|
var ACTIONS_LIST_DEFAULT_LIMIT = 500;
|
|
@@ -8862,9 +8876,9 @@ function parseSkillFrontmatter(md) {
|
|
|
8862
8876
|
const lines = extractFrontmatterLines(md);
|
|
8863
8877
|
if (!lines) return null;
|
|
8864
8878
|
const name = readField(lines, "name");
|
|
8865
|
-
const
|
|
8866
|
-
if (!name || !
|
|
8867
|
-
const trimmed =
|
|
8879
|
+
const description2 = readField(lines, "description");
|
|
8880
|
+
if (!name || !description2) return null;
|
|
8881
|
+
const trimmed = description2.length > DESCRIPTION_MAX ? `${description2.slice(0, DESCRIPTION_MAX)}\u2026` : description2;
|
|
8868
8882
|
return { name, description: trimmed };
|
|
8869
8883
|
}
|
|
8870
8884
|
function findSkillsDir(startDir) {
|
|
@@ -14989,6 +15003,7 @@ var DESTINATION_NAMES = {
|
|
|
14989
15003
|
googleSpreadsheet: "Google Sheets",
|
|
14990
15004
|
hubspotForm: "HubSpot Form",
|
|
14991
15005
|
goHighlevelContact: "GoHighLevel",
|
|
15006
|
+
shopifyCustomer: "Shopify",
|
|
14992
15007
|
crmble: "Crmble"
|
|
14993
15008
|
};
|
|
14994
15009
|
function destinationKey(type) {
|
|
@@ -19550,9 +19565,9 @@ var assetGroupsCommand = defineCommand31({
|
|
|
19550
19565
|
])
|
|
19551
19566
|
}
|
|
19552
19567
|
});
|
|
19553
|
-
function fileCreateCommand(name, kind,
|
|
19568
|
+
function fileCreateCommand(name, kind, description2, hints2) {
|
|
19554
19569
|
return defineCommand31({
|
|
19555
|
-
meta: { name, description },
|
|
19570
|
+
meta: { name, description: description2 },
|
|
19556
19571
|
args: { ...customerIdArg, ...fileArg },
|
|
19557
19572
|
run: async ({ args: args5 }) => {
|
|
19558
19573
|
const customerId = requireCustomerId(args5);
|
|
@@ -34093,7 +34108,7 @@ var eventsCommand = presetCommand({
|
|
|
34093
34108
|
}
|
|
34094
34109
|
},
|
|
34095
34110
|
resolve: (args5) => {
|
|
34096
|
-
const steps = args5.steps ? String(args5.steps).split(",").map((
|
|
34111
|
+
const steps = args5.steps ? String(args5.steps).split(",").map((step) => step.trim()).filter((step) => step !== "") : void 0;
|
|
34097
34112
|
if (args5.property && !args5.event) {
|
|
34098
34113
|
return {
|
|
34099
34114
|
error: "Breaking an event down by a property needs --event too, e.g. --event video --property milestone"
|
|
@@ -37870,8 +37885,8 @@ function castAvatarsOnElements(elementsInput, avatars) {
|
|
|
37870
37885
|
if (!avatar) return el;
|
|
37871
37886
|
next += 1;
|
|
37872
37887
|
if (el.label) byLabel.set(el.label, avatar);
|
|
37873
|
-
const
|
|
37874
|
-
return { ...el, ...
|
|
37888
|
+
const description2 = avatar.subjectDescription?.trim();
|
|
37889
|
+
return { ...el, ...description2 ? { description: description2 } : {}, source_image: avatar.sheetUrl, source_is_sheet: true };
|
|
37875
37890
|
});
|
|
37876
37891
|
return cast.map((el) => {
|
|
37877
37892
|
const avatar = el.same_as ? byLabel.get(el.same_as) : void 0;
|
|
@@ -38166,7 +38181,7 @@ function buildFramePrompt(edge, sceneIndex, framePrompt, present2, hasAnchor, mo
|
|
|
38166
38181
|
"- ORIGINAL_FRAME \u2014 use ONLY for composition: framing, camera angle, shot size, subject placement, pose, and proportions. IGNORE its text, logo, brand name, colors, AND the identity of every person/animal/object in it \u2014 those come from the labeled reference images above, never from this frame. It is a DIFFERENT brand's footage with DIFFERENT actors, here ONLY to anchor where things sit and how the shot is framed (e.g. a profile/side angle stays a profile/side angle), never who they are or what palette to use."
|
|
38167
38182
|
] : []
|
|
38168
38183
|
].join("\n");
|
|
38169
|
-
const
|
|
38184
|
+
const description2 = framePrompt?.trim() || `the ${edge} frame of scene ${sceneIndex + 1} \u2014 describe the full composition, subjects, setting, action, lighting, and palette here. (Edit this line to change ONLY this frame.)`;
|
|
38170
38185
|
const isHookFrame = sceneIndex === 0 && edge === "start";
|
|
38171
38186
|
const cleanPlateBlock = [
|
|
38172
38187
|
"CRITICAL \u2014 RENDER A CLEAN PLATE WITH ZERO TEXT OR GRAPHIC OVERLAYS:",
|
|
@@ -38244,7 +38259,7 @@ function buildFramePrompt(edge, sceneIndex, framePrompt, present2, hasAnchor, mo
|
|
|
38244
38259
|
""
|
|
38245
38260
|
] : [],
|
|
38246
38261
|
"FRAME DESCRIPTION (this frame's editable prompt):",
|
|
38247
|
-
|
|
38262
|
+
description2,
|
|
38248
38263
|
"",
|
|
38249
38264
|
"Render exactly what the FRAME DESCRIPTION and the SHARED AD SPEC specify \u2014 this is the authoritative ad: its cast identity (via the reference images), palette, brand, and intent are law. Keep every recurring element identical to its reference image across all frames. Again: clean plate only \u2014 no rendered text, and no icons/stickers/emojis/badges (those live on the overlay layer).",
|
|
38250
38265
|
"",
|
|
@@ -39100,8 +39115,8 @@ function localizeNumeralsForNative(text2, langCode) {
|
|
|
39100
39115
|
if (!langCode || !INTEGER_SPELLERS[langCode]) return text2;
|
|
39101
39116
|
return text2.replace(/(?<![\w.,-])\d{1,9}(?![\w.,-])/g, (m) => spellNumber(langCode, Number.parseInt(m, 10)));
|
|
39102
39117
|
}
|
|
39103
|
-
function parseVoiceTraits(
|
|
39104
|
-
const d =
|
|
39118
|
+
function parseVoiceTraits(description2) {
|
|
39119
|
+
const d = description2.toLowerCase();
|
|
39105
39120
|
const out = {};
|
|
39106
39121
|
if (/\b(female|woman|women|girl|lady)\b/.test(d)) out.gender = "female";
|
|
39107
39122
|
else if (/\b(male|man|men|guy|boy)\b/.test(d)) out.gender = "male";
|
|
@@ -39312,11 +39327,11 @@ function makeVoiceFactory(blueprint, canonical2, nodes, voiceLanguage, pinnedVoi
|
|
|
39312
39327
|
const existing = bySpeaker.get(speaker);
|
|
39313
39328
|
if (existing) return existing;
|
|
39314
39329
|
const id = sanitizeId(`voice_${speaker}`, `voice_${bySpeaker.size}`);
|
|
39315
|
-
const
|
|
39316
|
-
const traits = parseVoiceTraits(
|
|
39330
|
+
const description2 = describe(speaker);
|
|
39331
|
+
const traits = parseVoiceTraits(description2);
|
|
39317
39332
|
if (voiceLanguage) traits.language = voiceLanguage;
|
|
39318
39333
|
nodes.push(
|
|
39319
|
-
pinnedVoiceId ? { id, type: "voice_select", params: { description, voice_id: pinnedVoiceId, ...traits } } : { id, type: "voice_select", params: { description, ...traits } }
|
|
39334
|
+
pinnedVoiceId ? { id, type: "voice_select", params: { description: description2, voice_id: pinnedVoiceId, ...traits } } : { id, type: "voice_select", params: { description: description2, ...traits } }
|
|
39320
39335
|
);
|
|
39321
39336
|
bySpeaker.set(speaker, id);
|
|
39322
39337
|
return id;
|
|
@@ -41497,8 +41512,8 @@ function sceneAt(windows, atS) {
|
|
|
41497
41512
|
function reviewFrameTimes(durationS, frames) {
|
|
41498
41513
|
const n = Math.max(2, frames);
|
|
41499
41514
|
const last = Math.max(0, durationS - 0.15);
|
|
41500
|
-
const
|
|
41501
|
-
return Array.from({ length: n }, (_, i) => Math.round(i *
|
|
41515
|
+
const step = last / (n - 1);
|
|
41516
|
+
return Array.from({ length: n }, (_, i) => Math.round(i * step * 100) / 100);
|
|
41502
41517
|
}
|
|
41503
41518
|
function buildFrameGrabArgs(video, atS, out) {
|
|
41504
41519
|
return [
|
|
@@ -42608,8 +42623,8 @@ function castAvatarsOnStaticElements(elementsInput, avatars) {
|
|
|
42608
42623
|
const avatar = isPerson(el) ? avatars[next] : void 0;
|
|
42609
42624
|
if (!avatar) return el;
|
|
42610
42625
|
next += 1;
|
|
42611
|
-
const
|
|
42612
|
-
return { ...el, ...
|
|
42626
|
+
const description2 = avatar.subjectDescription?.trim();
|
|
42627
|
+
return { ...el, ...description2 ? { description: description2 } : {}, source_image: avatar.sheetUrl };
|
|
42613
42628
|
});
|
|
42614
42629
|
}
|
|
42615
42630
|
function staticAvatarsNotCast(elementsInput, handles) {
|
|
@@ -43915,8 +43930,8 @@ function adSpecCastElements(spec, avatar) {
|
|
|
43915
43930
|
...spec.set?.image?.trim() ? { source_image: spec.set.image.trim() } : {}
|
|
43916
43931
|
});
|
|
43917
43932
|
}
|
|
43918
|
-
const
|
|
43919
|
-
if (!
|
|
43933
|
+
const description2 = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();
|
|
43934
|
+
if (!description2) return elements;
|
|
43920
43935
|
const scenes = spec.beats.map((beat, i) => ({ beat, i })).filter(({ beat, i }) => beat.cast !== false && !(endCardWanted(spec) && i === lastIndex)).map(({ i }) => i);
|
|
43921
43936
|
if (scenes.length === 0) return elements;
|
|
43922
43937
|
const sheet = avatar?.sheetUrl?.trim();
|
|
@@ -43926,7 +43941,7 @@ function adSpecCastElements(spec, avatar) {
|
|
|
43926
43941
|
// Same id the dialogue names as speaker: that pairing is what lets the engine see
|
|
43927
43942
|
// the presenter as present in a scene and route it to native audio.
|
|
43928
43943
|
cast_id: AD_CAST_ID,
|
|
43929
|
-
description,
|
|
43944
|
+
description: description2,
|
|
43930
43945
|
scenes,
|
|
43931
43946
|
// An avatar's identity sheet IS the turnaround the engine would otherwise render,
|
|
43932
43947
|
// so it is handed over as one. Left unmarked, the run paid to generate a sheet OF
|
|
@@ -48815,11 +48830,11 @@ function titleize(value) {
|
|
|
48815
48830
|
return value.split(/[_-]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
48816
48831
|
}
|
|
48817
48832
|
function resolveField(tree, ref) {
|
|
48818
|
-
const { step
|
|
48833
|
+
const { step, name } = splitRef(ref, "customForm");
|
|
48819
48834
|
const owners = fieldOwners(tree);
|
|
48820
48835
|
const inventory = owners.map((owner2) => ` ${owner2.name} (${owner2.id}): ${owner2.fields.join(", ") || "(no fields)"}`).join("\n");
|
|
48821
48836
|
const candidates = owners.filter(
|
|
48822
|
-
(owner2) => owner2.fields.includes(name) && (!
|
|
48837
|
+
(owner2) => owner2.fields.includes(name) && (!step || owner2.name === step || owner2.id === step)
|
|
48823
48838
|
);
|
|
48824
48839
|
if (candidates.length === 0) {
|
|
48825
48840
|
throw new MappingError(`Form field "${ref}" does not exist in this form.`, inventory);
|
|
@@ -48858,14 +48873,14 @@ function resolveGlobal(tree, name) {
|
|
|
48858
48873
|
return mention(id, id);
|
|
48859
48874
|
}
|
|
48860
48875
|
function resolveCode(tree, ref) {
|
|
48861
|
-
const { step
|
|
48876
|
+
const { step, name } = splitRef(ref, "codeExecution");
|
|
48862
48877
|
const owners = walkNodes(tree).flatMap((node) => {
|
|
48863
48878
|
const exposed = externalOf(node).codeExecution?.exposedValues ?? [];
|
|
48864
48879
|
const names = exposed.map((value) => value?.name).filter((value) => typeof value === "string");
|
|
48865
48880
|
return names.length > 0 ? [{ id: String(node.id ?? ""), name: String(node.name ?? "step"), names }] : [];
|
|
48866
48881
|
});
|
|
48867
48882
|
const candidates = owners.filter(
|
|
48868
|
-
(owner2) => owner2.names.includes(name) && (!
|
|
48883
|
+
(owner2) => owner2.names.includes(name) && (!step || owner2.name === step || owner2.id === step)
|
|
48869
48884
|
);
|
|
48870
48885
|
if (candidates.length !== 1) {
|
|
48871
48886
|
throw new MappingError(
|
|
@@ -48922,6 +48937,9 @@ var ADS_MATCHING = [
|
|
|
48922
48937
|
"country"
|
|
48923
48938
|
];
|
|
48924
48939
|
var MAPPING_SLOTS = {
|
|
48940
|
+
shopifyCustomer: [
|
|
48941
|
+
{ kind: "record", key: "customer", allowed: ["email", "phone", "acceptsEmailMarketing", "acceptsSmsMarketing"] }
|
|
48942
|
+
],
|
|
48925
48943
|
googleSpreadsheet: [{ kind: "list", key: "columnMapping", addressedBy: "column" }],
|
|
48926
48944
|
hubspotForm: [
|
|
48927
48945
|
{
|
|
@@ -50090,7 +50108,7 @@ function formsNamedHere(forms) {
|
|
|
50090
50108
|
}
|
|
50091
50109
|
function unplacedFormHints(steps, forms, counted) {
|
|
50092
50110
|
const onAStep = new Set(
|
|
50093
|
-
steps.flatMap((
|
|
50111
|
+
steps.flatMap((step) => (step.triggers ?? []).flatMap((trigger) => trigger.eventKey ? [trigger.eventKey] : []))
|
|
50094
50112
|
);
|
|
50095
50113
|
const unplaced = [];
|
|
50096
50114
|
for (const form of forms) {
|
|
@@ -50568,12 +50586,12 @@ var FunnelArgsError = class extends Error {
|
|
|
50568
50586
|
};
|
|
50569
50587
|
function parseFunnelArgs(raw) {
|
|
50570
50588
|
const steps = parseSteps(raw.steps);
|
|
50571
|
-
const
|
|
50589
|
+
const step = parseStep(raw.step);
|
|
50572
50590
|
const removeStep = parseRemoveStep(raw["remove-step"] ?? raw.removeStep);
|
|
50573
50591
|
const preset = parsePreset(raw.preset);
|
|
50574
50592
|
const addTrigger = parseWayIn(raw["add-trigger"] ?? raw.addTrigger, raw.event, "--add-trigger");
|
|
50575
50593
|
const removeTrigger = parseWayIn(raw["remove-trigger"] ?? raw.removeTrigger, raw.event, "--remove-trigger");
|
|
50576
|
-
const doors = [steps,
|
|
50594
|
+
const doors = [steps, step, removeStep, preset, addTrigger, removeTrigger].filter(
|
|
50577
50595
|
(door) => door !== void 0
|
|
50578
50596
|
).length;
|
|
50579
50597
|
if (doors > 1) {
|
|
@@ -50587,7 +50605,7 @@ function parseFunnelArgs(raw) {
|
|
|
50587
50605
|
}
|
|
50588
50606
|
return {
|
|
50589
50607
|
...steps === void 0 ? {} : { steps },
|
|
50590
|
-
...
|
|
50608
|
+
...step === void 0 ? {} : { step },
|
|
50591
50609
|
...removeStep === void 0 ? {} : { removeStep },
|
|
50592
50610
|
...preset === void 0 ? {} : { preset },
|
|
50593
50611
|
...addTrigger === void 0 ? {} : { addTrigger },
|
|
@@ -50676,16 +50694,16 @@ function parseRemoveStep(raw) {
|
|
|
50676
50694
|
return raw.trim();
|
|
50677
50695
|
}
|
|
50678
50696
|
function refuseRetiredShapes(steps) {
|
|
50679
|
-
for (const
|
|
50680
|
-
if (typeof
|
|
50681
|
-
const key = String(
|
|
50682
|
-
if ("offlineConversions" in
|
|
50697
|
+
for (const step of steps) {
|
|
50698
|
+
if (typeof step !== "object" || step === null) continue;
|
|
50699
|
+
const key = String(step.key ?? "?");
|
|
50700
|
+
if ("offlineConversions" in step) {
|
|
50683
50701
|
throw new FunnelArgsError(`Step "${key}" puts sends on the step, and a send belongs to the conversion.`, {
|
|
50684
50702
|
action: "set_sends_on_the_conversion",
|
|
50685
50703
|
explanation: "Drop `offlineConversions`. Name the outcome with `baker analytics conversions`, then `baker analytics sends --set --conversion <name> --platform <p> --tag <tagId> --event <e>`; the step reads its conversions' sends back as `sends[]`."
|
|
50686
50704
|
});
|
|
50687
50705
|
}
|
|
50688
|
-
const triggers =
|
|
50706
|
+
const triggers = step.triggers;
|
|
50689
50707
|
if (!Array.isArray(triggers)) continue;
|
|
50690
50708
|
const kinds = triggers.map(
|
|
50691
50709
|
(trigger) => typeof trigger === "object" && trigger !== null ? trigger.kind : void 0
|
|
@@ -53257,7 +53275,7 @@ function workflowViewHints(workflow) {
|
|
|
53257
53275
|
"This workflow is switched off, so nothing below it is running now \u2014 it may still have run while it was on. Say so before reporting on what it does."
|
|
53258
53276
|
);
|
|
53259
53277
|
}
|
|
53260
|
-
const ordered = workflow.steps.filter((
|
|
53278
|
+
const ordered = workflow.steps.filter((step) => step.type === "LIST_BRANCH" && (step.branches?.length ?? 0) > 1);
|
|
53261
53279
|
if (ordered.length > 0) {
|
|
53262
53280
|
hints2.push(
|
|
53263
53281
|
"Branches are listed in evaluation order and the first match wins. Check that no broad branch sits above a narrower one \u2014 if it does, the narrow branch never runs and nothing in HubSpot reports it."
|
|
@@ -60070,10 +60088,10 @@ async function scrollThroughPage(page) {
|
|
|
60070
60088
|
await acrossNavigation(
|
|
60071
60089
|
page,
|
|
60072
60090
|
() => page.evaluate(async () => {
|
|
60073
|
-
const
|
|
60091
|
+
const step = 600;
|
|
60074
60092
|
const pause = () => new Promise((resolve5) => setTimeout(resolve5, 250));
|
|
60075
60093
|
for (let i = 0; i < 40; i++) {
|
|
60076
|
-
window.scrollBy(0,
|
|
60094
|
+
window.scrollBy(0, step);
|
|
60077
60095
|
await pause();
|
|
60078
60096
|
const reachedBottom = window.scrollY + window.innerHeight >= document.documentElement.scrollHeight - 2;
|
|
60079
60097
|
if (reachedBottom) break;
|
|
@@ -64096,13 +64114,13 @@ var createCommand3 = defineCommand197({
|
|
|
64096
64114
|
try {
|
|
64097
64115
|
refuseAutoPublish(args5);
|
|
64098
64116
|
const name = args5.name;
|
|
64099
|
-
const
|
|
64117
|
+
const description2 = args5.description;
|
|
64100
64118
|
const prompt = args5.prompt;
|
|
64101
64119
|
const template = typeof args5.template === "string" ? args5.template.trim() : "";
|
|
64102
64120
|
if (template.length === 0 && (!name || name.trim().length === 0)) {
|
|
64103
64121
|
failValidation4("--name is required. Or pass --template to use a recipe's name.");
|
|
64104
64122
|
}
|
|
64105
|
-
if (template.length === 0 && (!
|
|
64123
|
+
if (template.length === 0 && (!description2 || description2.trim().length === 0)) {
|
|
64106
64124
|
failValidation4("--description is required. Or pass --template to use a recipe's line.");
|
|
64107
64125
|
}
|
|
64108
64126
|
if (template.length === 0 && (!prompt || prompt.trim().length === 0)) {
|
|
@@ -64113,7 +64131,7 @@ var createCommand3 = defineCommand197({
|
|
|
64113
64131
|
const body = {
|
|
64114
64132
|
chatId: requireChatId(),
|
|
64115
64133
|
...name?.trim() ? { name } : {},
|
|
64116
|
-
...
|
|
64134
|
+
...description2?.trim() ? { description: description2 } : {},
|
|
64117
64135
|
enabled: !args5.disabled,
|
|
64118
64136
|
...trigger,
|
|
64119
64137
|
...prompt ? { prompt } : {},
|
|
@@ -64793,7 +64811,7 @@ var schemaCommand2 = defineCommand208({
|
|
|
64793
64811
|
});
|
|
64794
64812
|
|
|
64795
64813
|
// src/commands/shopify/index.ts
|
|
64796
|
-
import { defineCommand as
|
|
64814
|
+
import { defineCommand as defineCommand216 } from "citty";
|
|
64797
64815
|
|
|
64798
64816
|
// src/commands/shopify/buyers.ts
|
|
64799
64817
|
import { defineCommand as defineCommand209 } from "citty";
|
|
@@ -65820,7 +65838,8 @@ var shopifyWriteEntitySchema = z52.enum([
|
|
|
65820
65838
|
"discountCode",
|
|
65821
65839
|
"urlRedirect",
|
|
65822
65840
|
"marketingActivity",
|
|
65823
|
-
"webPixel"
|
|
65841
|
+
"webPixel",
|
|
65842
|
+
"signupOffer"
|
|
65824
65843
|
]);
|
|
65825
65844
|
var shopifyDraftOpKindSchema = z52.enum([
|
|
65826
65845
|
"shopify.product.update",
|
|
@@ -65841,7 +65860,9 @@ var shopifyDraftOpKindSchema = z52.enum([
|
|
|
65841
65860
|
"shopify.urlRedirect.delete",
|
|
65842
65861
|
"shopify.marketingActivity.upsert",
|
|
65843
65862
|
"shopify.marketingActivity.delete",
|
|
65844
|
-
"shopify.webPixel.update"
|
|
65863
|
+
"shopify.webPixel.update",
|
|
65864
|
+
"shopify.signupOffer.set",
|
|
65865
|
+
"shopify.signupOffer.end"
|
|
65845
65866
|
]);
|
|
65846
65867
|
var shopifyDecimalSchema = z52.string().regex(/^\d{1,12}(\.\d{1,4})?$/, 'write amounts as a decimal string, e.g. "19.95"');
|
|
65847
65868
|
var tagSchema = z52.string().trim().min(1).max(255);
|
|
@@ -65963,6 +65984,27 @@ var marketingUpsertSchema = z52.object({
|
|
|
65963
65984
|
medium: z52.string().trim().min(1).max(255)
|
|
65964
65985
|
}).strict()
|
|
65965
65986
|
}).strict();
|
|
65987
|
+
var signupOfferHandleSchema = z52.string().regex(/^[a-z0-9][a-z0-9-]{1,39}$/, "2\u201340 lowercase letters, digits and dashes, e.g. welcome-10");
|
|
65988
|
+
var signupOfferSetSchema = z52.object({
|
|
65989
|
+
/** What the store's staff see in front of each code, and the Store page's row. */
|
|
65990
|
+
name: z52.string().trim().min(1).max(80),
|
|
65991
|
+
value: discountValueSchema,
|
|
65992
|
+
appliesTo: discountAppliesToSchema,
|
|
65993
|
+
minimumSubtotal: shopifyDecimalSchema.optional(),
|
|
65994
|
+
/** Each code's life, from the moment it is given. */
|
|
65995
|
+
validForDays: z52.number().int().min(1).max(365),
|
|
65996
|
+
/** The offer stops giving codes after this; no code outlives it. */
|
|
65997
|
+
endsAt: isoDateTimeSchema.optional(),
|
|
65998
|
+
/** How many codes the offer gives in all. */
|
|
65999
|
+
maxCodes: z52.number().int().min(1).max(1e5).optional(),
|
|
66000
|
+
/** The start of every code (WELCOME-7Q2M9XKD); default: the handle in capitals. */
|
|
66001
|
+
codePrefix: z52.string().regex(/^[A-Z0-9]{2,12}$/, "2\u201312 capital letters or digits, e.g. WELCOME").optional(),
|
|
66002
|
+
combinesWith: z52.object({
|
|
66003
|
+
productDiscounts: z52.boolean().optional(),
|
|
66004
|
+
orderDiscounts: z52.boolean().optional(),
|
|
66005
|
+
shippingDiscounts: z52.boolean().optional()
|
|
66006
|
+
}).strict().optional()
|
|
66007
|
+
}).strict();
|
|
65966
66008
|
var emptySchema = z52.object({}).strict();
|
|
65967
66009
|
var opFields = {
|
|
65968
66010
|
/** Optional caller-chosen ref for a create, so later ops in the batch can name it (`shopify_temp_…`). */
|
|
@@ -66008,7 +66050,19 @@ var shopifyDraftOpInputSchema = z52.discriminatedUnion("kind", [
|
|
|
66008
66050
|
payload: emptySchema.optional(),
|
|
66009
66051
|
...opFields
|
|
66010
66052
|
}),
|
|
66011
|
-
z52.object({ kind: z52.literal("shopify.webPixel.update"), payload: emptySchema.optional(), ...opFields })
|
|
66053
|
+
z52.object({ kind: z52.literal("shopify.webPixel.update"), payload: emptySchema.optional(), ...opFields }),
|
|
66054
|
+
z52.object({
|
|
66055
|
+
kind: z52.literal("shopify.signupOffer.set"),
|
|
66056
|
+
target: signupOfferHandleSchema,
|
|
66057
|
+
payload: signupOfferSetSchema,
|
|
66058
|
+
...opFields
|
|
66059
|
+
}),
|
|
66060
|
+
z52.object({
|
|
66061
|
+
kind: z52.literal("shopify.signupOffer.end"),
|
|
66062
|
+
target: signupOfferHandleSchema,
|
|
66063
|
+
payload: emptySchema.optional(),
|
|
66064
|
+
...opFields
|
|
66065
|
+
})
|
|
66012
66066
|
]);
|
|
66013
66067
|
var PAYLOAD_KEYS = new Map(
|
|
66014
66068
|
shopifyDraftOpInputSchema.options.map((option) => {
|
|
@@ -67169,18 +67223,18 @@ var collectionUpdate = leaf(
|
|
|
67169
67223
|
() => target3(args5, "collection")
|
|
67170
67224
|
)
|
|
67171
67225
|
);
|
|
67172
|
-
function collectionVerb(verb, kind,
|
|
67226
|
+
function collectionVerb(verb, kind, description2) {
|
|
67173
67227
|
return leaf(
|
|
67174
67228
|
`shopify.change.collection.${verb}`,
|
|
67175
|
-
{ name: verb, description },
|
|
67229
|
+
{ name: verb, description: description2 },
|
|
67176
67230
|
{ collection: TARGET("Collection id, handle, link or a shopify_temp_ ref staged in this chat") },
|
|
67177
67231
|
async (args5) => await stage([{ kind, target: target3(args5, "collection") }])
|
|
67178
67232
|
);
|
|
67179
67233
|
}
|
|
67180
|
-
function membership(verb, kind,
|
|
67234
|
+
function membership(verb, kind, description2) {
|
|
67181
67235
|
return leaf(
|
|
67182
67236
|
`shopify.change.collection.${verb}`,
|
|
67183
|
-
{ name: verb, description },
|
|
67237
|
+
{ name: verb, description: description2 },
|
|
67184
67238
|
{
|
|
67185
67239
|
collection: TARGET("Collection id, handle, link or a shopify_temp_ ref"),
|
|
67186
67240
|
products: TARGET("Products (ids, handles or links), space separated")
|
|
@@ -67230,6 +67284,60 @@ function discountPayload(args5) {
|
|
|
67230
67284
|
combinesWith: combinesOf(args5.combines)
|
|
67231
67285
|
});
|
|
67232
67286
|
}
|
|
67287
|
+
function signupOfferPayload(args5) {
|
|
67288
|
+
return defined({
|
|
67289
|
+
name: args5.name,
|
|
67290
|
+
value: discountValue(args5),
|
|
67291
|
+
appliesTo: appliesToOf(args5),
|
|
67292
|
+
minimumSubtotal: args5.minimum,
|
|
67293
|
+
validForDays: numberOf3(args5["valid-days"]),
|
|
67294
|
+
endsAt: args5.ends,
|
|
67295
|
+
maxCodes: numberOf3(args5["max-codes"]),
|
|
67296
|
+
codePrefix: args5.prefix,
|
|
67297
|
+
combinesWith: combinesOf(args5.combines)
|
|
67298
|
+
});
|
|
67299
|
+
}
|
|
67300
|
+
var signupOfferSet = leaf(
|
|
67301
|
+
"shopify.change.signupOffer.set",
|
|
67302
|
+
{
|
|
67303
|
+
name: "set",
|
|
67304
|
+
description: 'Stage a sign-up offer. Changes money: ask the exact approval question returned by this command. Example: baker shopify change signup-offer set welcome-10 --name "Welcome" --percent 10 --valid-days 14 --max-codes 1000'
|
|
67305
|
+
},
|
|
67306
|
+
{
|
|
67307
|
+
handle: TARGET("Offer handle, e.g. welcome-10"),
|
|
67308
|
+
name: { type: "string", description: "Offer name", required: false },
|
|
67309
|
+
percent: { type: "string", description: "Percentage off (choose percent or amount)", required: false },
|
|
67310
|
+
amount: { type: "string", description: "Amount off in the store currency", required: false },
|
|
67311
|
+
products: { type: "string", description: "Product handles or ids, comma separated", required: false },
|
|
67312
|
+
collections: { type: "string", description: "Collection handles or ids, comma separated", required: false },
|
|
67313
|
+
minimum: { type: "string", description: "Minimum subtotal", required: false },
|
|
67314
|
+
"valid-days": { type: "string", description: "Each code lasts 1\u2013365 days", required: false },
|
|
67315
|
+
ends: { type: "string", description: "Offer end as ISO date and time; no code outlives it", required: false },
|
|
67316
|
+
"max-codes": { type: "string", description: "Total codes the offer may give, 1\u2013100000", required: false },
|
|
67317
|
+
prefix: { type: "string", description: "Code prefix: 2\u201312 uppercase letters or digits", required: false },
|
|
67318
|
+
combines: {
|
|
67319
|
+
type: "string",
|
|
67320
|
+
description: "Comma-separated product,order,shipping discounts to combine",
|
|
67321
|
+
required: false
|
|
67322
|
+
},
|
|
67323
|
+
...JSON_ARGS
|
|
67324
|
+
},
|
|
67325
|
+
async (args5) => await stageFor(
|
|
67326
|
+
"shopify.signupOffer.set",
|
|
67327
|
+
args5,
|
|
67328
|
+
() => signupOfferPayload(args5),
|
|
67329
|
+
() => target3(args5, "offer handle")
|
|
67330
|
+
)
|
|
67331
|
+
);
|
|
67332
|
+
var signupOfferEnd = leaf(
|
|
67333
|
+
"shopify.change.signupOffer.end",
|
|
67334
|
+
{
|
|
67335
|
+
name: "end",
|
|
67336
|
+
description: "End a sign-up offer at Publish. Existing codes keep their terms. Example: baker shopify change signup-offer end welcome-10"
|
|
67337
|
+
},
|
|
67338
|
+
{ handle: TARGET("Offer handle") },
|
|
67339
|
+
async (args5) => await stage([{ kind: "shopify.signupOffer.end", target: target3(args5, "offer handle") }])
|
|
67340
|
+
);
|
|
67233
67341
|
var discountCreate = leaf(
|
|
67234
67342
|
"shopify.change.discount.create",
|
|
67235
67343
|
{
|
|
@@ -67355,7 +67463,7 @@ var measurementReconnect = leaf(
|
|
|
67355
67463
|
{},
|
|
67356
67464
|
async () => await stage([{ kind: "shopify.webPixel.update" }])
|
|
67357
67465
|
);
|
|
67358
|
-
var group = (name,
|
|
67466
|
+
var group = (name, description2, subCommands) => defineCommand211({ meta: { name, description: description2 }, subCommands });
|
|
67359
67467
|
var changeCommand = defineCommand211({
|
|
67360
67468
|
meta: {
|
|
67361
67469
|
name: "change",
|
|
@@ -67372,6 +67480,7 @@ change can be put back with \`baker shopify undo\`. Prices and discounts need th
|
|
|
67372
67480
|
baker shopify change measurement reconnect`
|
|
67373
67481
|
},
|
|
67374
67482
|
subCommands: {
|
|
67483
|
+
"signup-offer": group("signup-offer", "Stage or end a sign-up offer", { set: signupOfferSet, end: signupOfferEnd }),
|
|
67375
67484
|
product: group("product", "Change a product's title, description, SEO, tags or type", { update: productUpdate }),
|
|
67376
67485
|
variant: group("variant", "Change an option's SKU, barcode, weight or price", { update: variantUpdate }),
|
|
67377
67486
|
field: group("field", "Set or remove a custom field", { set: fieldSet, remove: fieldRemove }),
|
|
@@ -67582,39 +67691,46 @@ import { defineCommand as defineCommand213 } from "citty";
|
|
|
67582
67691
|
// src/commands/shopify/landingLinks.ts
|
|
67583
67692
|
import { readdir as readdir16, readFile as readFile33, stat as stat11 } from "fs/promises";
|
|
67584
67693
|
import path47 from "path";
|
|
67694
|
+
import { parse } from "@astrojs/compiler/sync";
|
|
67585
67695
|
var PAGES_MAX = 300;
|
|
67586
67696
|
var FILE_BYTES_MAX = 256 * 1024;
|
|
67587
67697
|
function escaped(text2) {
|
|
67588
67698
|
return text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
67589
67699
|
}
|
|
67590
|
-
var
|
|
67591
|
-
var
|
|
67592
|
-
|
|
67593
|
-
|
|
67594
|
-
if (
|
|
67595
|
-
|
|
67596
|
-
|
|
67597
|
-
|
|
67598
|
-
|
|
67599
|
-
|
|
67600
|
-
|
|
67601
|
-
|
|
67602
|
-
|
|
67603
|
-
|
|
67604
|
-
|
|
67605
|
-
|
|
67606
|
-
|
|
67607
|
-
|
|
67608
|
-
|
|
67609
|
-
|
|
67610
|
-
|
|
67611
|
-
|
|
67612
|
-
|
|
67613
|
-
|
|
67700
|
+
var BUY_COMPONENTS = /* @__PURE__ */ new Set(["ShopifyProduct", "ShopifyBuyButton"]);
|
|
67701
|
+
var STRING_LITERAL = /^\s*(["'`])([^"'`]*)\1\s*$/;
|
|
67702
|
+
var ITEM_PRODUCT = /\bproduct\s*:\s*(["'`])([^"'`]*)\1/g;
|
|
67703
|
+
function namedBy(attribute) {
|
|
67704
|
+
if (attribute.name === "product") {
|
|
67705
|
+
if (attribute.kind === "quoted" || attribute.kind === "template-literal") return [attribute.value];
|
|
67706
|
+
if (attribute.kind === "expression") return [STRING_LITERAL.exec(attribute.value)?.[2] ?? ""];
|
|
67707
|
+
}
|
|
67708
|
+
if (attribute.name === "items" && attribute.kind === "expression") {
|
|
67709
|
+
return [...attribute.value.matchAll(ITEM_PRODUCT)].map((match) => match[2] ?? "");
|
|
67710
|
+
}
|
|
67711
|
+
return [];
|
|
67712
|
+
}
|
|
67713
|
+
function componentProducts(node, into) {
|
|
67714
|
+
if (node.type === "component" && BUY_COMPONENTS.has(node.name)) {
|
|
67715
|
+
for (const attribute of node.attributes) into.push(...namedBy(attribute));
|
|
67716
|
+
}
|
|
67717
|
+
if ("children" in node) for (const child of node.children) componentProducts(child, into);
|
|
67718
|
+
return into;
|
|
67719
|
+
}
|
|
67720
|
+
function buyComponentProducts(file) {
|
|
67721
|
+
if (!file.path.endsWith(".astro")) return [];
|
|
67722
|
+
try {
|
|
67723
|
+
return componentProducts(parse(file.text, void 0).ast, []);
|
|
67724
|
+
} catch {
|
|
67725
|
+
return [];
|
|
67614
67726
|
}
|
|
67615
|
-
return false;
|
|
67616
67727
|
}
|
|
67617
|
-
function
|
|
67728
|
+
function namesProduct(file, keys) {
|
|
67729
|
+
const wanted = new Set([keys.handle.toLowerCase(), ...keys.productId ? [keys.productId] : []].filter(Boolean));
|
|
67730
|
+
return buyComponentProducts(file).some((named) => wanted.has(named.trim().toLowerCase()));
|
|
67731
|
+
}
|
|
67732
|
+
function evidenceIn(file, keys) {
|
|
67733
|
+
const { text: text2 } = file;
|
|
67618
67734
|
const evidence = [];
|
|
67619
67735
|
if (keys.buyUrls.some((url) => url && text2.includes(url))) evidence.push("buy_link");
|
|
67620
67736
|
const page = new RegExp(`/products/${escaped(keys.handle)}(?![A-Za-z0-9_-])`, "i");
|
|
@@ -67623,13 +67739,13 @@ function evidenceIn(text2, keys) {
|
|
|
67623
67739
|
(id) => new RegExp(`(?:/cart/(?:\\d+:\\d+,)*${id}:|variant=${id}(?!\\d))`).test(text2)
|
|
67624
67740
|
);
|
|
67625
67741
|
if (option) evidence.push("variant_id");
|
|
67626
|
-
if (namesProduct(
|
|
67742
|
+
if (namesProduct(file, keys)) evidence.push("buy_button");
|
|
67627
67743
|
return evidence;
|
|
67628
67744
|
}
|
|
67629
67745
|
function landingLinksOf(pages, keys) {
|
|
67630
67746
|
const bySlug = /* @__PURE__ */ new Map();
|
|
67631
67747
|
for (const page of pages) {
|
|
67632
|
-
const found = new Set(page.files.flatMap((file) => evidenceIn(file
|
|
67748
|
+
const found = new Set(page.files.flatMap((file) => evidenceIn(file, keys)));
|
|
67633
67749
|
if (found.size === 0) continue;
|
|
67634
67750
|
const slug = page.slug.replace(/--\d+$/, "");
|
|
67635
67751
|
const held = bySlug.get(slug) ?? /* @__PURE__ */ new Set();
|
|
@@ -67937,8 +68053,94 @@ var stockHoldsCommand = defineCommand213({
|
|
|
67937
68053
|
}
|
|
67938
68054
|
});
|
|
67939
68055
|
|
|
67940
|
-
// src/
|
|
68056
|
+
// ../api/src/shopify/signups.ts
|
|
68057
|
+
import { z as z53 } from "zod";
|
|
68058
|
+
var SIGNUP_CODE_PATTERN = /^[A-Z0-9]{2,12}-[0-9A-HJKMNP-TV-Z]{8}$/;
|
|
68059
|
+
var SIGNUP_STATES = [
|
|
68060
|
+
"waiting",
|
|
68061
|
+
"ready",
|
|
68062
|
+
"used",
|
|
68063
|
+
"expired",
|
|
68064
|
+
"already",
|
|
68065
|
+
"ended",
|
|
68066
|
+
"none",
|
|
68067
|
+
"unavailable"
|
|
68068
|
+
];
|
|
68069
|
+
var CODE_STATES = /* @__PURE__ */ new Set(["ready", "used", "expired"]);
|
|
68070
|
+
var shopifySignupReplySchema = z53.object({
|
|
68071
|
+
state: z53.enum(SIGNUP_STATES),
|
|
68072
|
+
code: z53.string().regex(SIGNUP_CODE_PATTERN).optional(),
|
|
68073
|
+
endsAt: z53.string().min(1).max(40).optional()
|
|
68074
|
+
}).strict().refine(
|
|
68075
|
+
(reply) => CODE_STATES.has(reply.state) ? reply.code !== void 0 && reply.endsAt !== void 0 : true,
|
|
68076
|
+
"a code state carries the code and when it ends"
|
|
68077
|
+
).refine(
|
|
68078
|
+
(reply) => CODE_STATES.has(reply.state) ? true : reply.code === void 0 && reply.endsAt === void 0,
|
|
68079
|
+
"only the browser the code was given to is told it"
|
|
68080
|
+
);
|
|
68081
|
+
var shopifySignupResponseSchema = z53.union([
|
|
68082
|
+
z53.object({ ok: z53.literal(true), signup: shopifySignupReplySchema }).passthrough(),
|
|
68083
|
+
z53.object({ error: z53.string(), signup: shopifySignupReplySchema }).passthrough()
|
|
68084
|
+
]);
|
|
68085
|
+
var signupOfferStatusSchema = z53.enum(["active", "ended", "staged"]);
|
|
68086
|
+
var shopifySignupOfferViewSchema = z53.object({
|
|
68087
|
+
handle: z53.string(),
|
|
68088
|
+
name: z53.string(),
|
|
68089
|
+
/** "10% off everything, each code valid 14 days, at most 1,000 codes". */
|
|
68090
|
+
summary: z53.string(),
|
|
68091
|
+
status: signupOfferStatusSchema,
|
|
68092
|
+
validForDays: z53.number(),
|
|
68093
|
+
endsAt: z53.string().optional(),
|
|
68094
|
+
maxCodes: z53.number().optional(),
|
|
68095
|
+
codesGiven: z53.number()
|
|
68096
|
+
});
|
|
68097
|
+
var shopifySignupOffersResponseSchema = z53.object({
|
|
68098
|
+
/** The store allows Baker to add customers (sign-ups work). */
|
|
68099
|
+
canAddCustomers: z53.boolean(),
|
|
68100
|
+
/** The store allows Baker to make discount codes (offers give codes). */
|
|
68101
|
+
canGiveCodes: z53.boolean(),
|
|
68102
|
+
offers: z53.array(shopifySignupOfferViewSchema),
|
|
68103
|
+
/** Sign-ups the store didn't take in the last 7 days: for a missing permission, and for anything else. */
|
|
68104
|
+
refusedLast7Days: z53.object({ permission: z53.number(), other: z53.number() })
|
|
68105
|
+
});
|
|
68106
|
+
|
|
68107
|
+
// src/commands/shopify/signupOffers.ts
|
|
67941
68108
|
import { defineCommand as defineCommand214 } from "citty";
|
|
68109
|
+
var description = "Start here for landing sign-ups: published and this chat's staged offers, codes given and store permissions. Example: baker shopify signup-offers. Forms name an offer handle; terms are staged with baker shopify change signup-offer set.";
|
|
68110
|
+
registerSchema({ command: "shopify.signupOffers", description, args: {} });
|
|
68111
|
+
var signupOffersCommand = defineCommand214({
|
|
68112
|
+
meta: { name: "signup-offers", description },
|
|
68113
|
+
async run() {
|
|
68114
|
+
try {
|
|
68115
|
+
const data = shopifySignupOffersResponseSchema.parse(
|
|
68116
|
+
await apiGet("/api/shopify/signup-offers", params({ chatId: optionalChatId() }))
|
|
68117
|
+
);
|
|
68118
|
+
const hints2 = [];
|
|
68119
|
+
if (!data.canAddCustomers)
|
|
68120
|
+
hints2.push(
|
|
68121
|
+
'Sign-ups cannot be added to the store yet: call request_connection with { platform: "shopify", reason: "Add sign-ups from your landing" }. Keep building the page; the Form works once allowed.'
|
|
68122
|
+
);
|
|
68123
|
+
if (!data.canGiveCodes)
|
|
68124
|
+
hints2.push(
|
|
68125
|
+
"Codes need the store to allow discounts: use request_connection for Shopify and keep building the page."
|
|
68126
|
+
);
|
|
68127
|
+
if (data.offers.some((offer) => offer.status === "ended"))
|
|
68128
|
+
hints2.push(
|
|
68129
|
+
"Forms naming ended offers still add customers but give no code: stage a new offer or remove offer from the Form."
|
|
68130
|
+
);
|
|
68131
|
+
if (data.offers.length === 0)
|
|
68132
|
+
hints2.push(
|
|
68133
|
+
"No sign-up offer exists yet. Omit offer for sign-ups without a code, or stage one after the user approves its terms."
|
|
68134
|
+
);
|
|
68135
|
+
writeJson({ ok: true, hints: hints2, data });
|
|
68136
|
+
} catch (error) {
|
|
68137
|
+
fail9(error);
|
|
68138
|
+
}
|
|
68139
|
+
}
|
|
68140
|
+
});
|
|
68141
|
+
|
|
68142
|
+
// src/commands/shopify/tracking.ts
|
|
68143
|
+
import { defineCommand as defineCommand215 } from "citty";
|
|
67942
68144
|
var audit = leaf(
|
|
67943
68145
|
"shopify.tracking.audit",
|
|
67944
68146
|
{
|
|
@@ -67955,7 +68157,7 @@ var audit = leaf(
|
|
|
67955
68157
|
}
|
|
67956
68158
|
}
|
|
67957
68159
|
);
|
|
67958
|
-
var trackingCommand2 =
|
|
68160
|
+
var trackingCommand2 = defineCommand215({
|
|
67959
68161
|
meta: { name: "tracking", description: "Check how the store is measured: baker shopify tracking audit" },
|
|
67960
68162
|
subCommands: { audit }
|
|
67961
68163
|
});
|
|
@@ -68088,7 +68290,7 @@ registerSchema({
|
|
|
68088
68290
|
}
|
|
68089
68291
|
}
|
|
68090
68292
|
});
|
|
68091
|
-
var salesCommand =
|
|
68293
|
+
var salesCommand = defineCommand216({
|
|
68092
68294
|
meta: {
|
|
68093
68295
|
name: "sales",
|
|
68094
68296
|
description: "What the store sold: orders, sales, refunds and net, by day, product, campaign or landing \u2014 or when buyers order (weekday, hour, month). Example: baker shopify sales --days 7 --by campaign"
|
|
@@ -68126,7 +68328,7 @@ var salesCommand = defineCommand215({
|
|
|
68126
68328
|
}
|
|
68127
68329
|
}
|
|
68128
68330
|
});
|
|
68129
|
-
var storeCommand =
|
|
68331
|
+
var storeCommand = defineCommand216({
|
|
68130
68332
|
meta: {
|
|
68131
68333
|
name: "store",
|
|
68132
68334
|
description: "The connected Shopify store: currency, countries, how many products, what is out of stock. Example: baker shopify store"
|
|
@@ -68144,7 +68346,7 @@ var storeCommand = defineCommand215({
|
|
|
68144
68346
|
}
|
|
68145
68347
|
}
|
|
68146
68348
|
});
|
|
68147
|
-
var productsCommand =
|
|
68349
|
+
var productsCommand = defineCommand216({
|
|
68148
68350
|
meta: {
|
|
68149
68351
|
name: "products",
|
|
68150
68352
|
description: 'What the store sells, with price and stock. Example: baker shopify products --search "snowboard" --stock out_of_stock'
|
|
@@ -68190,7 +68392,7 @@ var productsCommand = defineCommand215({
|
|
|
68190
68392
|
}
|
|
68191
68393
|
}
|
|
68192
68394
|
});
|
|
68193
|
-
var productCommand =
|
|
68395
|
+
var productCommand = defineCommand216({
|
|
68194
68396
|
meta: {
|
|
68195
68397
|
name: "product",
|
|
68196
68398
|
description: "One product: options with buy links, prices by country, stock, photo imageIds, video playbackIds. Accepts an id, handle or link. Example: baker shopify product the-complete-snowboard --content"
|
|
@@ -68253,7 +68455,7 @@ var productCommand = defineCommand215({
|
|
|
68253
68455
|
}
|
|
68254
68456
|
}
|
|
68255
68457
|
});
|
|
68256
|
-
var collectionsCommand =
|
|
68458
|
+
var collectionsCommand = defineCommand216({
|
|
68257
68459
|
meta: {
|
|
68258
68460
|
name: "collections",
|
|
68259
68461
|
description: "The store's collections, with the handles --collection takes. Example: baker shopify collections --full"
|
|
@@ -68278,7 +68480,7 @@ var collectionsCommand = defineCommand215({
|
|
|
68278
68480
|
}
|
|
68279
68481
|
}
|
|
68280
68482
|
});
|
|
68281
|
-
var stockCommand2 =
|
|
68483
|
+
var stockCommand2 = defineCommand216({
|
|
68282
68484
|
meta: {
|
|
68283
68485
|
name: "stock",
|
|
68284
68486
|
description: "Every product with options out of stock, naming them. Example: baker shopify stock"
|
|
@@ -68302,7 +68504,7 @@ var stockCommand2 = defineCommand215({
|
|
|
68302
68504
|
}
|
|
68303
68505
|
}
|
|
68304
68506
|
});
|
|
68305
|
-
var shopifyCommand =
|
|
68507
|
+
var shopifyCommand = defineCommand216({
|
|
68306
68508
|
meta: {
|
|
68307
68509
|
name: "shopify",
|
|
68308
68510
|
description: `Read the connected Shopify store as Baker keeps it \u2014 products, prices by country, stock, collections,
|
|
@@ -68346,6 +68548,7 @@ connected here yet: carry on without it.
|
|
|
68346
68548
|
Full guide: __tooling__/docs/tools/baker/shopify.md`
|
|
68347
68549
|
},
|
|
68348
68550
|
subCommands: {
|
|
68551
|
+
"signup-offers": signupOffersCommand,
|
|
68349
68552
|
store: storeCommand,
|
|
68350
68553
|
products: productsCommand,
|
|
68351
68554
|
product: productCommand,
|
|
@@ -68369,10 +68572,10 @@ Full guide: __tooling__/docs/tools/baker/shopify.md`
|
|
|
68369
68572
|
});
|
|
68370
68573
|
|
|
68371
68574
|
// src/commands/studio/index.ts
|
|
68372
|
-
import { defineCommand as
|
|
68575
|
+
import { defineCommand as defineCommand225 } from "citty";
|
|
68373
68576
|
|
|
68374
68577
|
// src/commands/studio/animate.ts
|
|
68375
|
-
import { defineCommand as
|
|
68578
|
+
import { defineCommand as defineCommand217 } from "citty";
|
|
68376
68579
|
|
|
68377
68580
|
// src/commands/studio/spokenPace.ts
|
|
68378
68581
|
var WORDS_PER_SECOND3 = SPOKEN_WORDS_PER_SECOND;
|
|
@@ -68885,7 +69088,7 @@ async function adByHandHintFor(body) {
|
|
|
68885
69088
|
return null;
|
|
68886
69089
|
}
|
|
68887
69090
|
}
|
|
68888
|
-
var animateCommand =
|
|
69091
|
+
var animateCommand = defineCommand217({
|
|
68889
69092
|
meta: {
|
|
68890
69093
|
name: "animate",
|
|
68891
69094
|
description: "Render a clip. With an image the look is already fixed, so the prompt describes MOVEMENT \u2014 what the camera does, what the subject does, in what order. With --from text there is no image and the prompt is the whole shot.\n\nA rendered clip is NOT usable anywhere until you keep it: `baker studio keep <id> --slot N` is what puts it in the video library. Takes nobody keeps are never ingested, which is what makes a rejected batch cheap.\n\nFor anything longer than 15 seconds, or to build on footage that already exists, use --model bytedance/seedance-2.5: it renders 4-30s and is the only model that reads an existing clip or an existing soundtrack.\n\nExamples:\n baker studio animate 'slow push in, model turns to camera and smiles' --image j57abc123def456ghi789\n baker studio animate 'she looks to camera and says: \"Hola, soy Elena\"' --avatar elena --quality 720p --aspect-ratio 9:16\n baker studio animate 'handheld drift right, steam rising from the cup' --image './out/hero.png' --duration 6 --quality 1080p\n baker studio animate 'product rotates once on a turntable' --image j57abc\u2026,j57def\u2026 --from references\n baker studio animate 'she keeps walking, camera stays with her, then she stops and looks up' --image j57abc\u2026 --from references --from-clip j57batch\u2026:0 --model bytedance/seedance-2.5 --duration 20\n baker studio animate 'hold on the product, then a slow push-in' --from references --from-video j57vid\u2026 --model bytedance/seedance-2.5\n baker studio animate 'slow drone pull-back over a solar farm at golden hour, no people' --from text --model bytedance/seedance-2.5 --duration 12"
|
|
@@ -69010,7 +69213,7 @@ var animateCommand = defineCommand216({
|
|
|
69010
69213
|
});
|
|
69011
69214
|
|
|
69012
69215
|
// src/commands/studio/generate.ts
|
|
69013
|
-
import { defineCommand as
|
|
69216
|
+
import { defineCommand as defineCommand218 } from "citty";
|
|
69014
69217
|
var MODEL_LIST2 = IMAGE_MODEL_IDS;
|
|
69015
69218
|
var DEFAULT_MAX_WAIT_MS2 = 24e4;
|
|
69016
69219
|
registerSchema({
|
|
@@ -69146,7 +69349,7 @@ function buildGenerateBody(args5, prompt) {
|
|
|
69146
69349
|
}
|
|
69147
69350
|
return body;
|
|
69148
69351
|
}
|
|
69149
|
-
var generateCommand =
|
|
69352
|
+
var generateCommand = defineCommand218({
|
|
69150
69353
|
meta: {
|
|
69151
69354
|
name: "generate",
|
|
69152
69355
|
description: "Start here to make an image. Renders 1-8 takes of one brief, ingests each into the media library as it lands, and shows the batch in the dashboard Studio next to the ones the client ran.\n\nModel choice: google/gemini-3.1-flash-image-preview (default \u2014 fast, best at editing a reference and at extreme ratios), google/gemini-3-pro-image-preview (highest fidelity, slower), openai/gpt-image-2 (photoreal and the cleanest in-image text \u2014 no --image-size, no 4:5 / 5:4), recraft/recraft-v4.1-pro-vector (vector/flat marks with palette control).\n\n--reference is the biggest quality lever there is: a real logo, product shot, Pinterest pin or sandbox screenshot beats any amount of adjectives.\n\nExamples:\n baker studio generate 'matte black bottle on wet marble, hard studio light, 35mm' --aspect-ratio 3:2 --count 3\n baker studio generate 'this bottle on a sunlit kitchen counter' --reference './src/brand/product.png,https://\u2026/kitchen.jpg'\n baker studio generate 'founder-style selfie, kitchen background, natural light' --skill ugc-selfie-hook\n baker studio generate 'flat geometric mascot, brand palette' --model recraft/recraft-v4.1-pro-vector --rgb-colors '[[10,10,10],[255,80,0]]'"
|
|
@@ -69229,7 +69432,7 @@ var generateCommand = defineCommand217({
|
|
|
69229
69432
|
});
|
|
69230
69433
|
|
|
69231
69434
|
// src/commands/studio/get.ts
|
|
69232
|
-
import { defineCommand as
|
|
69435
|
+
import { defineCommand as defineCommand219 } from "citty";
|
|
69233
69436
|
registerSchema({
|
|
69234
69437
|
command: "studio.get",
|
|
69235
69438
|
description: "Read one Studio batch: every take, where it lives, and why a take is missing. This is how you pick up a batch that was still rendering when the start command returned.",
|
|
@@ -69238,7 +69441,7 @@ registerSchema({
|
|
|
69238
69441
|
full: { type: "boolean", description: "Include settings, references and attribution", required: false }
|
|
69239
69442
|
}
|
|
69240
69443
|
});
|
|
69241
|
-
var getCommand5 =
|
|
69444
|
+
var getCommand5 = defineCommand219({
|
|
69242
69445
|
meta: {
|
|
69243
69446
|
name: "get",
|
|
69244
69447
|
description: "Read one Studio batch \u2014 the takes, their urls, whether each is in the library, and the reason for any that failed.\n\nExample: baker studio get j57abc123def456ghi789\nExample: baker studio get j57abc123def456ghi789 --full"
|
|
@@ -69267,7 +69470,7 @@ var getCommand5 = defineCommand218({
|
|
|
69267
69470
|
});
|
|
69268
69471
|
|
|
69269
69472
|
// src/commands/studio/improve.ts
|
|
69270
|
-
import { defineCommand as
|
|
69473
|
+
import { defineCommand as defineCommand220 } from "citty";
|
|
69271
69474
|
var DESCRIPTION2 = "Sharpen a rough brief into directed art direction \u2014 the same rewrite the client gets from the wand in the Studio prompt bar. Reach for it when you are relaying the CLIENT's own words and want them shaped without substituting your voice; when you are writing the art direction yourself, just write it, because you will do a better job than this does.";
|
|
69272
69475
|
registerSchema({
|
|
69273
69476
|
command: "studio.improve",
|
|
@@ -69292,7 +69495,7 @@ registerSchema({
|
|
|
69292
69495
|
}
|
|
69293
69496
|
}
|
|
69294
69497
|
});
|
|
69295
|
-
var improveCommand =
|
|
69498
|
+
var improveCommand = defineCommand220({
|
|
69296
69499
|
meta: {
|
|
69297
69500
|
name: "improve",
|
|
69298
69501
|
description: `${DESCRIPTION2}
|
|
@@ -69336,7 +69539,7 @@ Examples:
|
|
|
69336
69539
|
});
|
|
69337
69540
|
|
|
69338
69541
|
// src/commands/studio/keep.ts
|
|
69339
|
-
import { defineCommand as
|
|
69542
|
+
import { defineCommand as defineCommand221 } from "citty";
|
|
69340
69543
|
registerSchema({
|
|
69341
69544
|
command: "studio.keep",
|
|
69342
69545
|
description: "Mark one take as the keeper. For an image this stars it, so the client reviewing the batch sees which one you used. For a CLIP it is the step that puts it in the video library \u2014 until then the clip cannot be used in a canvas, a landing, or an ad.",
|
|
@@ -69346,7 +69549,7 @@ registerSchema({
|
|
|
69346
69549
|
undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
|
|
69347
69550
|
}
|
|
69348
69551
|
});
|
|
69349
|
-
var keepCommand =
|
|
69552
|
+
var keepCommand = defineCommand221({
|
|
69350
69553
|
meta: {
|
|
69351
69554
|
name: "keep",
|
|
69352
69555
|
description: "Mark one take as the keeper. An image gets starred (it was already in the library); a clip gets INGESTED into the video library, which is what makes it usable anywhere else.\n\nExample: baker studio keep j57abc123def456ghi789 --slot 2\nExample: baker studio keep j57abc123def456ghi789 --slot 2 --undo"
|
|
@@ -69397,7 +69600,7 @@ var keepCommand = defineCommand220({
|
|
|
69397
69600
|
});
|
|
69398
69601
|
|
|
69399
69602
|
// src/commands/studio/list.ts
|
|
69400
|
-
import { defineCommand as
|
|
69603
|
+
import { defineCommand as defineCommand222 } from "citty";
|
|
69401
69604
|
registerSchema({
|
|
69402
69605
|
command: "studio.list",
|
|
69403
69606
|
description: "Recent Studio batches for THIS conversation, newest first \u2014 what you have already generated, so you re-use a take instead of paying for it twice. `--all` widens it to everything the company generated, including what people ran themselves in the dashboard.",
|
|
@@ -69408,7 +69611,7 @@ registerSchema({
|
|
|
69408
69611
|
full: { type: "boolean", description: "Include settings, references and attribution", required: false }
|
|
69409
69612
|
}
|
|
69410
69613
|
});
|
|
69411
|
-
var listCommand18 =
|
|
69614
|
+
var listCommand18 = defineCommand222({
|
|
69412
69615
|
meta: {
|
|
69413
69616
|
name: "list",
|
|
69414
69617
|
description: "Recent Studio batches, newest first. Scoped to this conversation unless you pass --all.\n\nExample: baker studio list\nExample: baker studio list --kind video --limit 5\nExample: baker studio list --all # includes batches the client ran in the dashboard"
|
|
@@ -69442,7 +69645,7 @@ var listCommand18 = defineCommand221({
|
|
|
69442
69645
|
});
|
|
69443
69646
|
|
|
69444
69647
|
// src/commands/studio/models.ts
|
|
69445
|
-
import { defineCommand as
|
|
69648
|
+
import { defineCommand as defineCommand223 } from "citty";
|
|
69446
69649
|
var DESCRIPTION3 = "What each Studio model actually accepts: its shapes, resolutions, clip lengths, prompt character cap, how many reference images it takes, and which knobs it has. Read this before a batch you care about \u2014 the models disagree far more than they look like they do, and a setting the chosen model does not have is REFUSED, not ignored.";
|
|
69447
69650
|
registerSchema({
|
|
69448
69651
|
command: "studio.models",
|
|
@@ -69529,7 +69732,7 @@ function buildModelCards(kind, model) {
|
|
|
69529
69732
|
const selected = model ? ids.filter((id) => id === model) : ids;
|
|
69530
69733
|
return selected.map((id) => build(id));
|
|
69531
69734
|
}
|
|
69532
|
-
var modelsCommand =
|
|
69735
|
+
var modelsCommand = defineCommand223({
|
|
69533
69736
|
meta: {
|
|
69534
69737
|
name: "models",
|
|
69535
69738
|
description: `${DESCRIPTION3}
|
|
@@ -69576,13 +69779,13 @@ Examples:
|
|
|
69576
69779
|
});
|
|
69577
69780
|
|
|
69578
69781
|
// src/commands/studio/skills.ts
|
|
69579
|
-
import { defineCommand as
|
|
69782
|
+
import { defineCommand as defineCommand224 } from "citty";
|
|
69580
69783
|
registerSchema({
|
|
69581
69784
|
command: "studio.skills",
|
|
69582
69785
|
description: "The craft directions `studio generate --skill <id>` accepts. Each one carries directed art direction plus the model, shape and take count it wants, so you pick a look by name instead of writing the boilerplate yourself.",
|
|
69583
69786
|
args: {}
|
|
69584
69787
|
});
|
|
69585
|
-
var skillsCommand =
|
|
69788
|
+
var skillsCommand = defineCommand224({
|
|
69586
69789
|
meta: {
|
|
69587
69790
|
name: "skills",
|
|
69588
69791
|
description: "List the craft directions available to `baker studio generate --skill <id>` \u2014 what each one is for, whether it wants a reference image, and the model/shape/count it defaults to.\n\nExample: baker studio skills"
|
|
@@ -69606,7 +69809,7 @@ var skillsCommand = defineCommand223({
|
|
|
69606
69809
|
});
|
|
69607
69810
|
|
|
69608
69811
|
// src/commands/studio/index.ts
|
|
69609
|
-
var studioCommand =
|
|
69812
|
+
var studioCommand = defineCommand225({
|
|
69610
69813
|
meta: {
|
|
69611
69814
|
name: "studio",
|
|
69612
69815
|
description: `Make new imagery and clips. Every batch is recorded and shows up in the dashboard Studio for the client to review, labelled with this conversation.
|
|
@@ -69649,10 +69852,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
|
|
|
69649
69852
|
});
|
|
69650
69853
|
|
|
69651
69854
|
// src/commands/tag-manager/index.ts
|
|
69652
|
-
import { defineCommand as
|
|
69855
|
+
import { defineCommand as defineCommand229 } from "citty";
|
|
69653
69856
|
|
|
69654
69857
|
// src/commands/tag-manager/draft.ts
|
|
69655
|
-
import { defineCommand as
|
|
69858
|
+
import { defineCommand as defineCommand226 } from "citty";
|
|
69656
69859
|
|
|
69657
69860
|
// src/commands/tag-manager/shared.ts
|
|
69658
69861
|
import { readFileSync as readFileSync20 } from "fs";
|
|
@@ -69775,13 +69978,13 @@ registerSchema({
|
|
|
69775
69978
|
chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
|
|
69776
69979
|
}
|
|
69777
69980
|
});
|
|
69778
|
-
var draftCommand6 =
|
|
69981
|
+
var draftCommand6 = defineCommand226({
|
|
69779
69982
|
meta: {
|
|
69780
69983
|
name: "draft",
|
|
69781
69984
|
description: "List, show, amend, remove, or clear staged Tag Manager changes for this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead."
|
|
69782
69985
|
},
|
|
69783
69986
|
subCommands: {
|
|
69784
|
-
list:
|
|
69987
|
+
list: defineCommand226({
|
|
69785
69988
|
meta: {
|
|
69786
69989
|
name: "list",
|
|
69787
69990
|
description: "Review everything staged on this chat (--json for the raw envelope)"
|
|
@@ -69794,7 +69997,7 @@ var draftCommand6 = defineCommand225({
|
|
|
69794
69997
|
await draftList2(args5.json === true, args5.chat);
|
|
69795
69998
|
}
|
|
69796
69999
|
}),
|
|
69797
|
-
show:
|
|
70000
|
+
show: defineCommand226({
|
|
69798
70001
|
meta: {
|
|
69799
70002
|
name: "show",
|
|
69800
70003
|
description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
|
|
@@ -69811,7 +70014,7 @@ var draftCommand6 = defineCommand225({
|
|
|
69811
70014
|
);
|
|
69812
70015
|
}
|
|
69813
70016
|
}),
|
|
69814
|
-
amend:
|
|
70017
|
+
amend: defineCommand226({
|
|
69815
70018
|
meta: {
|
|
69816
70019
|
name: "amend",
|
|
69817
70020
|
description: "Update a staged change in place \u2014 merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create."
|
|
@@ -69828,7 +70031,7 @@ var draftCommand6 = defineCommand225({
|
|
|
69828
70031
|
});
|
|
69829
70032
|
}
|
|
69830
70033
|
}),
|
|
69831
|
-
remove:
|
|
70034
|
+
remove: defineCommand226({
|
|
69832
70035
|
meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
|
|
69833
70036
|
args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
|
|
69834
70037
|
run: async ({ args: args5 }) => {
|
|
@@ -69837,7 +70040,7 @@ var draftCommand6 = defineCommand225({
|
|
|
69837
70040
|
});
|
|
69838
70041
|
}
|
|
69839
70042
|
}),
|
|
69840
|
-
clear:
|
|
70043
|
+
clear: defineCommand226({
|
|
69841
70044
|
meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
|
|
69842
70045
|
run: async () => {
|
|
69843
70046
|
await draftAction3("/api/tag-manager/draft/clear", {});
|
|
@@ -69847,7 +70050,7 @@ var draftCommand6 = defineCommand225({
|
|
|
69847
70050
|
});
|
|
69848
70051
|
|
|
69849
70052
|
// src/commands/tag-manager/read.ts
|
|
69850
|
-
import { defineCommand as
|
|
70053
|
+
import { defineCommand as defineCommand227 } from "citty";
|
|
69851
70054
|
registerSchema({
|
|
69852
70055
|
command: "tagManager.containers",
|
|
69853
70056
|
description: "List the Google Tag Manager containers this company's connection can reach. Every container the company connected is flagged `connected: true` \u2014 there can be several, and Baker may read and change all of them. Start here to confirm which containers you are managing.",
|
|
@@ -69888,7 +70091,7 @@ function containersHints(containers) {
|
|
|
69888
70091
|
}))
|
|
69889
70092
|
});
|
|
69890
70093
|
}
|
|
69891
|
-
var containersCommand =
|
|
70094
|
+
var containersCommand = defineCommand227({
|
|
69892
70095
|
meta: {
|
|
69893
70096
|
name: "containers",
|
|
69894
70097
|
description: `List Tag Manager containers reachable by this company's connection.
|
|
@@ -69905,7 +70108,7 @@ Start here:
|
|
|
69905
70108
|
}
|
|
69906
70109
|
}
|
|
69907
70110
|
});
|
|
69908
|
-
var readCommand =
|
|
70111
|
+
var readCommand = defineCommand227({
|
|
69909
70112
|
meta: {
|
|
69910
70113
|
name: "read",
|
|
69911
70114
|
description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
|
|
@@ -69947,7 +70150,7 @@ Examples:
|
|
|
69947
70150
|
});
|
|
69948
70151
|
|
|
69949
70152
|
// src/commands/tag-manager/write-commands.ts
|
|
69950
|
-
import { defineCommand as
|
|
70153
|
+
import { defineCommand as defineCommand228 } from "citty";
|
|
69951
70154
|
var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
|
|
69952
70155
|
var ENTITIES = [
|
|
69953
70156
|
{
|
|
@@ -70003,10 +70206,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
|
|
|
70003
70206
|
});
|
|
70004
70207
|
}
|
|
70005
70208
|
function entityCommand(entity, noun, example) {
|
|
70006
|
-
return
|
|
70209
|
+
return defineCommand228({
|
|
70007
70210
|
meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
|
|
70008
70211
|
subCommands: {
|
|
70009
|
-
create:
|
|
70212
|
+
create: defineCommand228({
|
|
70010
70213
|
meta: {
|
|
70011
70214
|
name: "create",
|
|
70012
70215
|
description: `Stage a new ${noun}
|
|
@@ -70028,7 +70231,7 @@ Examples:
|
|
|
70028
70231
|
});
|
|
70029
70232
|
}
|
|
70030
70233
|
}),
|
|
70031
|
-
update:
|
|
70234
|
+
update: defineCommand228({
|
|
70032
70235
|
meta: {
|
|
70033
70236
|
name: "update",
|
|
70034
70237
|
description: `Stage an update to an existing ${noun} (pass its id or path)`
|
|
@@ -70048,7 +70251,7 @@ Examples:
|
|
|
70048
70251
|
});
|
|
70049
70252
|
}
|
|
70050
70253
|
}),
|
|
70051
|
-
delete:
|
|
70254
|
+
delete: defineCommand228({
|
|
70052
70255
|
meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
|
|
70053
70256
|
args: {
|
|
70054
70257
|
id: { type: "positional", description: `${noun} id or path`, required: false },
|
|
@@ -70089,7 +70292,7 @@ function builtinTypes(args5) {
|
|
|
70089
70292
|
}
|
|
70090
70293
|
return raw.split(",").map((entry) => entry.trim());
|
|
70091
70294
|
}
|
|
70092
|
-
var builtinCommand =
|
|
70295
|
+
var builtinCommand = defineCommand228({
|
|
70093
70296
|
meta: {
|
|
70094
70297
|
name: "builtin",
|
|
70095
70298
|
description: `Enable or disable built-in variables
|
|
@@ -70099,7 +70302,7 @@ Examples:
|
|
|
70099
70302
|
baker tag-manager builtin disable --types formId`
|
|
70100
70303
|
},
|
|
70101
70304
|
subCommands: {
|
|
70102
|
-
enable:
|
|
70305
|
+
enable: defineCommand228({
|
|
70103
70306
|
meta: { name: "enable", description: "Stage enabling built-in variables" },
|
|
70104
70307
|
args: {
|
|
70105
70308
|
types: { type: "string", description: "Comma-separated types", required: false },
|
|
@@ -70113,7 +70316,7 @@ Examples:
|
|
|
70113
70316
|
});
|
|
70114
70317
|
}
|
|
70115
70318
|
}),
|
|
70116
|
-
disable:
|
|
70319
|
+
disable: defineCommand228({
|
|
70117
70320
|
meta: { name: "disable", description: "Stage disabling built-in variables" },
|
|
70118
70321
|
args: {
|
|
70119
70322
|
types: { type: "string", description: "Comma-separated types", required: false },
|
|
@@ -70131,7 +70334,7 @@ Examples:
|
|
|
70131
70334
|
});
|
|
70132
70335
|
|
|
70133
70336
|
// src/commands/tag-manager/index.ts
|
|
70134
|
-
var tagManagerCommand =
|
|
70337
|
+
var tagManagerCommand = defineCommand229({
|
|
70135
70338
|
meta: {
|
|
70136
70339
|
name: "tag-manager",
|
|
70137
70340
|
description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
|
|
@@ -70168,7 +70371,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
|
|
|
70168
70371
|
});
|
|
70169
70372
|
|
|
70170
70373
|
// src/commands/tags/index.ts
|
|
70171
|
-
import { defineCommand as
|
|
70374
|
+
import { defineCommand as defineCommand230 } from "citty";
|
|
70172
70375
|
|
|
70173
70376
|
// src/commands/tags/shared.ts
|
|
70174
70377
|
function failApi3(err) {
|
|
@@ -70248,7 +70451,7 @@ async function listTags(json) {
|
|
|
70248
70451
|
var listArgs11 = {
|
|
70249
70452
|
json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
|
|
70250
70453
|
};
|
|
70251
|
-
var listCommand19 =
|
|
70454
|
+
var listCommand19 = defineCommand230({
|
|
70252
70455
|
meta: {
|
|
70253
70456
|
name: "list",
|
|
70254
70457
|
description: "Effective tags for this chat (production + staged), with each tag's full readable config (secrets excluded) \u2014 reuse a stored value to pre-fill a change rather than asking the user. Refs printed here are what flow side-effect tagIds should use. Example: baker tags list"
|
|
@@ -70267,7 +70470,7 @@ async function listDraft4(chat) {
|
|
|
70267
70470
|
failApi3(err);
|
|
70268
70471
|
}
|
|
70269
70472
|
}
|
|
70270
|
-
var draftCommand7 =
|
|
70473
|
+
var draftCommand7 = defineCommand230({
|
|
70271
70474
|
meta: {
|
|
70272
70475
|
name: "draft",
|
|
70273
70476
|
description: "Review the tag changes staged in this chat (read-only). Staged changes were approved via request_tag_input and apply when the chat is published; to amend or drop one, propose a follow-up change through the same tool (a delete on a tag_temp_* ref drops the staged create). Takes --chat <id> to read an earlier chat's staged changes instead."
|
|
@@ -70277,7 +70480,7 @@ var draftCommand7 = defineCommand229({
|
|
|
70277
70480
|
await listDraft4(args5.chat);
|
|
70278
70481
|
}
|
|
70279
70482
|
});
|
|
70280
|
-
var tagsCommand4 =
|
|
70483
|
+
var tagsCommand4 = defineCommand230({
|
|
70281
70484
|
meta: {
|
|
70282
70485
|
name: "tags",
|
|
70283
70486
|
description: `Read the client's marketing/analytics tags (Meta pixel, GA4, Google Ads, GTM, Clarity, Hotjar, \u2026) \u2014 production tags plus the changes staged in this chat.
|
|
@@ -70306,10 +70509,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
|
|
|
70306
70509
|
});
|
|
70307
70510
|
|
|
70308
70511
|
// src/commands/testimonials/index.ts
|
|
70309
|
-
import { defineCommand as
|
|
70512
|
+
import { defineCommand as defineCommand234 } from "citty";
|
|
70310
70513
|
|
|
70311
70514
|
// src/commands/testimonials/get.ts
|
|
70312
|
-
import { defineCommand as
|
|
70515
|
+
import { defineCommand as defineCommand231 } from "citty";
|
|
70313
70516
|
registerSchema({
|
|
70314
70517
|
command: "testimonials.get",
|
|
70315
70518
|
description: "Get a single testimonial by ID",
|
|
@@ -70317,7 +70520,7 @@ registerSchema({
|
|
|
70317
70520
|
id: { type: "string", description: "Testimonial ID", required: true }
|
|
70318
70521
|
}
|
|
70319
70522
|
});
|
|
70320
|
-
var getCommand6 =
|
|
70523
|
+
var getCommand6 = defineCommand231({
|
|
70321
70524
|
meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
|
|
70322
70525
|
args: {
|
|
70323
70526
|
id: { type: "positional", description: "Testimonial ID", required: false },
|
|
@@ -70354,7 +70557,7 @@ var getCommand6 = defineCommand230({
|
|
|
70354
70557
|
});
|
|
70355
70558
|
|
|
70356
70559
|
// src/commands/testimonials/list.ts
|
|
70357
|
-
import { defineCommand as
|
|
70560
|
+
import { defineCommand as defineCommand232 } from "citty";
|
|
70358
70561
|
|
|
70359
70562
|
// src/commands/testimonials/emptyCorpusHints.ts
|
|
70360
70563
|
function resolveEmptyReason({
|
|
@@ -70511,7 +70714,7 @@ function buildListParams(args5) {
|
|
|
70511
70714
|
}
|
|
70512
70715
|
return params2;
|
|
70513
70716
|
}
|
|
70514
|
-
var listCommand20 =
|
|
70717
|
+
var listCommand20 = defineCommand232({
|
|
70515
70718
|
meta: {
|
|
70516
70719
|
name: "list",
|
|
70517
70720
|
description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
|
|
@@ -70571,7 +70774,7 @@ var listCommand20 = defineCommand231({
|
|
|
70571
70774
|
});
|
|
70572
70775
|
|
|
70573
70776
|
// src/commands/testimonials/search.ts
|
|
70574
|
-
import { defineCommand as
|
|
70777
|
+
import { defineCommand as defineCommand233 } from "citty";
|
|
70575
70778
|
var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
|
|
70576
70779
|
function languageBiasHint(results, requestedLanguage) {
|
|
70577
70780
|
if (requestedLanguage) {
|
|
@@ -70650,7 +70853,7 @@ function buildSearchRequest(query, args5) {
|
|
|
70650
70853
|
}
|
|
70651
70854
|
return body;
|
|
70652
70855
|
}
|
|
70653
|
-
var searchCommand3 =
|
|
70856
|
+
var searchCommand3 = defineCommand233({
|
|
70654
70857
|
meta: {
|
|
70655
70858
|
name: "search",
|
|
70656
70859
|
description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
|
|
@@ -70714,7 +70917,7 @@ var searchCommand3 = defineCommand232({
|
|
|
70714
70917
|
var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
|
|
70715
70918
|
|
|
70716
70919
|
// src/commands/testimonials/index.ts
|
|
70717
|
-
var testimonialsCommand =
|
|
70920
|
+
var testimonialsCommand = defineCommand234({
|
|
70718
70921
|
meta: {
|
|
70719
70922
|
name: "testimonials",
|
|
70720
70923
|
description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
|
|
@@ -70736,10 +70939,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
|
|
|
70736
70939
|
});
|
|
70737
70940
|
|
|
70738
70941
|
// src/commands/videos/index.ts
|
|
70739
|
-
import { defineCommand as
|
|
70942
|
+
import { defineCommand as defineCommand242 } from "citty";
|
|
70740
70943
|
|
|
70741
70944
|
// src/commands/videos/delete.ts
|
|
70742
|
-
import { defineCommand as
|
|
70945
|
+
import { defineCommand as defineCommand235 } from "citty";
|
|
70743
70946
|
registerSchema({
|
|
70744
70947
|
command: "videos.delete",
|
|
70745
70948
|
description: "Delete a video by ID",
|
|
@@ -70753,7 +70956,7 @@ registerSchema({
|
|
|
70753
70956
|
}
|
|
70754
70957
|
}
|
|
70755
70958
|
});
|
|
70756
|
-
var deleteCommand4 =
|
|
70959
|
+
var deleteCommand4 = defineCommand235({
|
|
70757
70960
|
meta: {
|
|
70758
70961
|
name: "delete",
|
|
70759
70962
|
description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
|
|
@@ -70794,7 +70997,7 @@ var deleteCommand4 = defineCommand234({
|
|
|
70794
70997
|
});
|
|
70795
70998
|
|
|
70796
70999
|
// src/commands/videos/describe.ts
|
|
70797
|
-
import { defineCommand as
|
|
71000
|
+
import { defineCommand as defineCommand236 } from "citty";
|
|
70798
71001
|
var DESCRIPTION_HELP2 = "What the clip actually shows, in the words someone would search for it by. This is what `baker videos search` retrieves on.";
|
|
70799
71002
|
registerSchema({
|
|
70800
71003
|
command: "videos.describe",
|
|
@@ -70811,7 +71014,7 @@ registerSchema({
|
|
|
70811
71014
|
full: { type: "boolean", description: "Return the whole library row, not just what changed", required: false }
|
|
70812
71015
|
}
|
|
70813
71016
|
});
|
|
70814
|
-
var describeCommand2 =
|
|
71017
|
+
var describeCommand2 = defineCommand236({
|
|
70815
71018
|
meta: {
|
|
70816
71019
|
name: "describe",
|
|
70817
71020
|
description: `Correct what the library says a video is. Only the fields you pass change; the rest keep their current values.
|
|
@@ -70869,7 +71072,7 @@ Example: baker videos describe j571abc123 --description "Customer explaining how
|
|
|
70869
71072
|
});
|
|
70870
71073
|
|
|
70871
71074
|
// src/commands/videos/get.ts
|
|
70872
|
-
import { defineCommand as
|
|
71075
|
+
import { defineCommand as defineCommand237 } from "citty";
|
|
70873
71076
|
registerSchema({
|
|
70874
71077
|
command: "videos.get",
|
|
70875
71078
|
description: "Get a single video by ID",
|
|
@@ -70877,7 +71080,7 @@ registerSchema({
|
|
|
70877
71080
|
id: { type: "string", description: "Video ID", required: true }
|
|
70878
71081
|
}
|
|
70879
71082
|
});
|
|
70880
|
-
var getCommand7 =
|
|
71083
|
+
var getCommand7 = defineCommand237({
|
|
70881
71084
|
meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
|
|
70882
71085
|
args: {
|
|
70883
71086
|
id: { type: "positional", description: "Video ID", required: false },
|
|
@@ -70914,7 +71117,7 @@ var getCommand7 = defineCommand236({
|
|
|
70914
71117
|
});
|
|
70915
71118
|
|
|
70916
71119
|
// src/commands/videos/group.ts
|
|
70917
|
-
import { defineCommand as
|
|
71120
|
+
import { defineCommand as defineCommand238 } from "citty";
|
|
70918
71121
|
registerSchema({
|
|
70919
71122
|
command: "videos.group",
|
|
70920
71123
|
description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
|
|
@@ -70923,7 +71126,7 @@ registerSchema({
|
|
|
70923
71126
|
"group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
|
|
70924
71127
|
}
|
|
70925
71128
|
});
|
|
70926
|
-
var groupCommand2 =
|
|
71129
|
+
var groupCommand2 = defineCommand238({
|
|
70927
71130
|
meta: {
|
|
70928
71131
|
name: "group",
|
|
70929
71132
|
description: "List every asset that arrived in the same set as this clip \u2014 the other slides of the Instagram post it came from, stills included. A carousel is authored to be read in order, so a clip pulled out of one is usually missing half its meaning. Example: baker videos group <videoId>"
|
|
@@ -70946,7 +71149,7 @@ var groupCommand2 = defineCommand237({
|
|
|
70946
71149
|
import { mkdtemp as mkdtemp3, rm as rm9, stat as stat12 } from "fs/promises";
|
|
70947
71150
|
import { tmpdir as tmpdir4 } from "os";
|
|
70948
71151
|
import path48 from "path";
|
|
70949
|
-
import { defineCommand as
|
|
71152
|
+
import { defineCommand as defineCommand239 } from "citty";
|
|
70950
71153
|
|
|
70951
71154
|
// src/lib/streamUpload.ts
|
|
70952
71155
|
import { createHash as createHash2 } from "crypto";
|
|
@@ -71110,7 +71313,7 @@ registerSchema({
|
|
|
71110
71313
|
"dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
|
|
71111
71314
|
}
|
|
71112
71315
|
});
|
|
71113
|
-
var ingestCommand2 =
|
|
71316
|
+
var ingestCommand2 = defineCommand239({
|
|
71114
71317
|
meta: {
|
|
71115
71318
|
name: "ingest",
|
|
71116
71319
|
description: "Add a video to the library from a URL. A direct file URL is handed straight to Baker, which fetches it. A page URL (YouTube, TikTok, Vimeo, Instagram) is downloaded here first, then uploaded \u2014 and a direct URL that Baker cannot fetch falls back to that same path automatically.\n\nExample: baker videos ingest https://www.youtube.com/watch?v=abc123"
|
|
@@ -71372,7 +71575,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
|
|
|
71372
71575
|
}
|
|
71373
71576
|
|
|
71374
71577
|
// src/commands/videos/search.ts
|
|
71375
|
-
import { defineCommand as
|
|
71578
|
+
import { defineCommand as defineCommand240 } from "citty";
|
|
71376
71579
|
registerSchema({
|
|
71377
71580
|
command: "videos.search",
|
|
71378
71581
|
description: "Search videos by text query. Only returns ready videos.",
|
|
@@ -71382,7 +71585,7 @@ registerSchema({
|
|
|
71382
71585
|
tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
|
|
71383
71586
|
}
|
|
71384
71587
|
});
|
|
71385
|
-
var searchCommand4 =
|
|
71588
|
+
var searchCommand4 = defineCommand240({
|
|
71386
71589
|
meta: {
|
|
71387
71590
|
name: "search",
|
|
71388
71591
|
description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
|
|
@@ -71434,7 +71637,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
|
|
|
71434
71637
|
// src/commands/videos/upload.ts
|
|
71435
71638
|
import { readFile as readFile34, stat as stat13 } from "fs/promises";
|
|
71436
71639
|
import { basename as basename3, extname as extname4 } from "path";
|
|
71437
|
-
import { defineCommand as
|
|
71640
|
+
import { defineCommand as defineCommand241 } from "citty";
|
|
71438
71641
|
var MIME_MAP = {
|
|
71439
71642
|
".mp4": "video/mp4",
|
|
71440
71643
|
".mov": "video/quicktime",
|
|
@@ -71476,7 +71679,7 @@ function detectContentType(filePath) {
|
|
|
71476
71679
|
function isRemoteUrl3(value) {
|
|
71477
71680
|
return /^https?:\/\//i.test(value);
|
|
71478
71681
|
}
|
|
71479
|
-
var uploadCommand2 =
|
|
71682
|
+
var uploadCommand2 = defineCommand241({
|
|
71480
71683
|
meta: {
|
|
71481
71684
|
name: "upload",
|
|
71482
71685
|
description: "Upload a video to Baker \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: auto-detects content type and uploads via Mux direct upload.\nRemote: hands off to `videos ingest` (direct fetch, or download-then-upload for a YouTube/TikTok/Vimeo page).\n\nExamples:\n baker videos upload ./demo.mp4\n baker videos upload https://www.youtube.com/watch?v=abc123"
|
|
@@ -71560,7 +71763,7 @@ var uploadCommand2 = defineCommand240({
|
|
|
71560
71763
|
});
|
|
71561
71764
|
|
|
71562
71765
|
// src/commands/videos/index.ts
|
|
71563
|
-
var videosCommand =
|
|
71766
|
+
var videosCommand = defineCommand242({
|
|
71564
71767
|
meta: {
|
|
71565
71768
|
name: "videos",
|
|
71566
71769
|
description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, describe, delete, tags.
|
|
@@ -71589,10 +71792,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
|
|
|
71589
71792
|
});
|
|
71590
71793
|
|
|
71591
71794
|
// src/commands/winning-ads/index.ts
|
|
71592
|
-
import { defineCommand as
|
|
71795
|
+
import { defineCommand as defineCommand255 } from "citty";
|
|
71593
71796
|
|
|
71594
71797
|
// src/commands/winning-ads/advertisers.ts
|
|
71595
|
-
import { defineCommand as
|
|
71798
|
+
import { defineCommand as defineCommand243 } from "citty";
|
|
71596
71799
|
|
|
71597
71800
|
// src/commands/winning-ads/shared.ts
|
|
71598
71801
|
function splitList3(value) {
|
|
@@ -71645,7 +71848,7 @@ function advertiserNormalizer(record, full) {
|
|
|
71645
71848
|
last_synced_at: record.last_synced_at ?? null
|
|
71646
71849
|
};
|
|
71647
71850
|
}
|
|
71648
|
-
var advertisersCommand2 =
|
|
71851
|
+
var advertisersCommand2 = defineCommand243({
|
|
71649
71852
|
meta: {
|
|
71650
71853
|
name: "advertisers",
|
|
71651
71854
|
description: 'List corpus advertisers by name or domain. Find your own advertiser for --exclude-advertiser, or a competitor for --advertiser-id / winners. Example: baker winning-ads advertisers "Deel" --output md'
|
|
@@ -71703,7 +71906,7 @@ var advertisersCommand2 = defineCommand242({
|
|
|
71703
71906
|
});
|
|
71704
71907
|
|
|
71705
71908
|
// src/commands/winning-ads/brief.ts
|
|
71706
|
-
import { defineCommand as
|
|
71909
|
+
import { defineCommand as defineCommand244 } from "citty";
|
|
71707
71910
|
registerSchema({
|
|
71708
71911
|
command: "winning-ads.brief",
|
|
71709
71912
|
description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
|
|
@@ -71749,7 +71952,7 @@ function parseDna(raw) {
|
|
|
71749
71952
|
}
|
|
71750
71953
|
return parsed;
|
|
71751
71954
|
}
|
|
71752
|
-
var briefCommand =
|
|
71955
|
+
var briefCommand = defineCommand244({
|
|
71753
71956
|
meta: {
|
|
71754
71957
|
name: "brief",
|
|
71755
71958
|
description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
|
|
@@ -71785,7 +71988,7 @@ var briefCommand = defineCommand243({
|
|
|
71785
71988
|
});
|
|
71786
71989
|
|
|
71787
71990
|
// src/commands/winning-ads/content.ts
|
|
71788
|
-
import { defineCommand as
|
|
71991
|
+
import { defineCommand as defineCommand245 } from "citty";
|
|
71789
71992
|
registerSchema({
|
|
71790
71993
|
command: "winning-ads.content",
|
|
71791
71994
|
description: "Read what's INSIDE one winning ad: the spoken transcript, the on-screen text, and the ad copy. Use this after `search`/`winners`/`feed` return a shortlist \u2014 pass an ad_id to understand a reference before reproducing it. Add --full for speech, pacing, and soundtrack detail. Video ads carry the transcript/on-screen text; static ads carry only the copy.",
|
|
@@ -71798,7 +72001,7 @@ registerSchema({
|
|
|
71798
72001
|
}
|
|
71799
72002
|
}
|
|
71800
72003
|
});
|
|
71801
|
-
var contentCommand =
|
|
72004
|
+
var contentCommand = defineCommand245({
|
|
71802
72005
|
meta: {
|
|
71803
72006
|
name: "content",
|
|
71804
72007
|
description: "Read the transcript + on-screen text + copy of one winning ad. Example: baker winning-ads content adg_123 --platform meta --full --output md"
|
|
@@ -71847,7 +72050,7 @@ var contentCommand = defineCommand244({
|
|
|
71847
72050
|
});
|
|
71848
72051
|
|
|
71849
72052
|
// src/commands/winning-ads/feed.ts
|
|
71850
|
-
import { defineCommand as
|
|
72053
|
+
import { defineCommand as defineCommand246 } from "citty";
|
|
71851
72054
|
function buildFeedParams(input) {
|
|
71852
72055
|
const params2 = {};
|
|
71853
72056
|
const advertiser = splitList3(input.advertiser);
|
|
@@ -71899,7 +72102,7 @@ registerSchema({
|
|
|
71899
72102
|
format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
|
|
71900
72103
|
}
|
|
71901
72104
|
});
|
|
71902
|
-
var feedCommand2 =
|
|
72105
|
+
var feedCommand2 = defineCommand246({
|
|
71903
72106
|
meta: {
|
|
71904
72107
|
name: "feed",
|
|
71905
72108
|
description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
|
|
@@ -71984,7 +72187,7 @@ var feedCommand2 = defineCommand245({
|
|
|
71984
72187
|
});
|
|
71985
72188
|
|
|
71986
72189
|
// src/commands/winning-ads/follow.ts
|
|
71987
|
-
import { defineCommand as
|
|
72190
|
+
import { defineCommand as defineCommand247 } from "citty";
|
|
71988
72191
|
var PLATFORMS = adLibraryPlatformSchema.options;
|
|
71989
72192
|
registerSchema({
|
|
71990
72193
|
command: "winning-ads.follow",
|
|
@@ -71999,7 +72202,7 @@ registerSchema({
|
|
|
71999
72202
|
label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
|
|
72000
72203
|
}
|
|
72001
72204
|
});
|
|
72002
|
-
var followCommand =
|
|
72205
|
+
var followCommand = defineCommand247({
|
|
72003
72206
|
meta: {
|
|
72004
72207
|
name: "follow",
|
|
72005
72208
|
description: 'Follow a brand to track ALL its ads \u2014 every platform and country. --platform is how we read your input, not a limit. A domain tracks every platform we can resolve. Example: baker winning-ads follow "deel.com" --platform meta'
|
|
@@ -72046,7 +72249,7 @@ var followCommand = defineCommand246({
|
|
|
72046
72249
|
});
|
|
72047
72250
|
|
|
72048
72251
|
// src/commands/winning-ads/follow-competitors.ts
|
|
72049
|
-
import { defineCommand as
|
|
72252
|
+
import { defineCommand as defineCommand248 } from "citty";
|
|
72050
72253
|
var PLATFORMS2 = adLibraryPlatformSchema.options;
|
|
72051
72254
|
var BATCH_TIMEOUT_MS = 3e5;
|
|
72052
72255
|
function buildFollowBatchBody(input) {
|
|
@@ -72079,7 +72282,7 @@ registerSchema({
|
|
|
72079
72282
|
}
|
|
72080
72283
|
}
|
|
72081
72284
|
});
|
|
72082
|
-
var followCompetitorsCommand =
|
|
72285
|
+
var followCompetitorsCommand = defineCommand248({
|
|
72083
72286
|
meta: {
|
|
72084
72287
|
name: "follow-competitors",
|
|
72085
72288
|
description: 'Follow many brands at once by domain \u2014 add every competitor in one call. Example: baker winning-ads follow-competitors "deel.com,notion.so,hubspot.com"'
|
|
@@ -72154,7 +72357,7 @@ var followCompetitorsCommand = defineCommand247({
|
|
|
72154
72357
|
});
|
|
72155
72358
|
|
|
72156
72359
|
// src/commands/winning-ads/following.ts
|
|
72157
|
-
import { defineCommand as
|
|
72360
|
+
import { defineCommand as defineCommand249 } from "citty";
|
|
72158
72361
|
registerSchema({
|
|
72159
72362
|
command: "winning-ads.following",
|
|
72160
72363
|
description: "List the brands you follow in your ad-dna library, with each one's status (ready vs still adding) and cached ad counts. A brand still adding has counts that are a lie in progress; one with `discovery_failed` has counts that are short because we couldn't finish looking, which is not the same as it running no ads.",
|
|
@@ -72208,7 +72411,7 @@ function followingNormalizer(record, full) {
|
|
|
72208
72411
|
platforms: Array.isArray(record.platforms) ? record.platforms : []
|
|
72209
72412
|
};
|
|
72210
72413
|
}
|
|
72211
|
-
var followingCommand =
|
|
72414
|
+
var followingCommand = defineCommand249({
|
|
72212
72415
|
meta: {
|
|
72213
72416
|
name: "following",
|
|
72214
72417
|
description: "List brands you follow, with status (ready / adding\u2026) and cached counts. A brand's counts are only final once it is ready. Example: baker winning-ads following --output md"
|
|
@@ -72244,7 +72447,7 @@ var followingCommand = defineCommand248({
|
|
|
72244
72447
|
});
|
|
72245
72448
|
|
|
72246
72449
|
// src/commands/winning-ads/patterns.ts
|
|
72247
|
-
import { defineCommand as
|
|
72450
|
+
import { defineCommand as defineCommand250 } from "citty";
|
|
72248
72451
|
registerSchema({
|
|
72249
72452
|
command: "winning-ads.patterns",
|
|
72250
72453
|
description: "Mine what separates two cohorts of ads: pass a comma-list of winning ad ids (--winners) and a comma-list of weaker ad ids (--duds). Returns the discriminating DNA fields.",
|
|
@@ -72283,7 +72486,7 @@ function discriminatorRow(record) {
|
|
|
72283
72486
|
top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
|
|
72284
72487
|
};
|
|
72285
72488
|
}
|
|
72286
|
-
var patternsCommand =
|
|
72489
|
+
var patternsCommand = defineCommand250({
|
|
72287
72490
|
meta: {
|
|
72288
72491
|
name: "patterns",
|
|
72289
72492
|
description: "Discover what separates winning ads from weak ones. Example: baker winning-ads patterns --winners a_1,a_2,a_3 --duds a_9,a_8 --output md"
|
|
@@ -72339,7 +72542,7 @@ var patternsCommand = defineCommand249({
|
|
|
72339
72542
|
});
|
|
72340
72543
|
|
|
72341
72544
|
// src/commands/winning-ads/search.ts
|
|
72342
|
-
import { defineCommand as
|
|
72545
|
+
import { defineCommand as defineCommand251 } from "citty";
|
|
72343
72546
|
registerSchema({
|
|
72344
72547
|
command: "winning-ads.search",
|
|
72345
72548
|
description: "Search the ad-dna corpus of scored winning ads. Returns a lean shortlist (advertiser, summary, scores, media_url) to pick a reference to reproduce.",
|
|
@@ -72477,7 +72680,7 @@ function reportSearchError(err) {
|
|
|
72477
72680
|
}
|
|
72478
72681
|
reportError2(err);
|
|
72479
72682
|
}
|
|
72480
|
-
var searchCommand5 =
|
|
72683
|
+
var searchCommand5 = defineCommand251({
|
|
72481
72684
|
meta: {
|
|
72482
72685
|
name: "search",
|
|
72483
72686
|
description: "Search winning reference ads. Example: baker winning-ads search 'B2B SaaS before/after AI automation' --platform meta --format static --winner-category winner --exclude-advertiser adv_123 --output md"
|
|
@@ -72597,7 +72800,7 @@ var searchCommand5 = defineCommand250({
|
|
|
72597
72800
|
});
|
|
72598
72801
|
|
|
72599
72802
|
// src/commands/winning-ads/seeds.ts
|
|
72600
|
-
import { defineCommand as
|
|
72803
|
+
import { defineCommand as defineCommand252 } from "citty";
|
|
72601
72804
|
function leanRow(r) {
|
|
72602
72805
|
return {
|
|
72603
72806
|
key: r.key,
|
|
@@ -72625,7 +72828,7 @@ function makeSeedCommand(opts) {
|
|
|
72625
72828
|
limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
|
|
72626
72829
|
}
|
|
72627
72830
|
});
|
|
72628
|
-
return
|
|
72831
|
+
return defineCommand252({
|
|
72629
72832
|
meta: { name: opts.name, description: opts.description },
|
|
72630
72833
|
args: {
|
|
72631
72834
|
platform: { type: "string", description: "Single platform to segment on", required: false },
|
|
@@ -72674,7 +72877,7 @@ var formatsCommand = makeSeedCommand({
|
|
|
72674
72877
|
});
|
|
72675
72878
|
|
|
72676
72879
|
// src/commands/winning-ads/unfollow.ts
|
|
72677
|
-
import { defineCommand as
|
|
72880
|
+
import { defineCommand as defineCommand253 } from "citty";
|
|
72678
72881
|
registerSchema({
|
|
72679
72882
|
command: "winning-ads.unfollow",
|
|
72680
72883
|
description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
|
|
@@ -72682,7 +72885,7 @@ registerSchema({
|
|
|
72682
72885
|
advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
|
|
72683
72886
|
}
|
|
72684
72887
|
});
|
|
72685
|
-
var unfollowCommand =
|
|
72888
|
+
var unfollowCommand = defineCommand253({
|
|
72686
72889
|
meta: {
|
|
72687
72890
|
name: "unfollow",
|
|
72688
72891
|
description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
|
|
@@ -72703,7 +72906,7 @@ var unfollowCommand = defineCommand252({
|
|
|
72703
72906
|
});
|
|
72704
72907
|
|
|
72705
72908
|
// src/commands/winning-ads/winners.ts
|
|
72706
|
-
import { defineCommand as
|
|
72909
|
+
import { defineCommand as defineCommand254 } from "citty";
|
|
72707
72910
|
registerSchema({
|
|
72708
72911
|
command: "winning-ads.winners",
|
|
72709
72912
|
description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
|
|
@@ -72713,7 +72916,7 @@ registerSchema({
|
|
|
72713
72916
|
platform: { type: "string", description: "Filter to a single platform: meta|linkedin|tiktok", required: false }
|
|
72714
72917
|
}
|
|
72715
72918
|
});
|
|
72716
|
-
var winnersCommand =
|
|
72919
|
+
var winnersCommand = defineCommand254({
|
|
72717
72920
|
meta: {
|
|
72718
72921
|
name: "winners",
|
|
72719
72922
|
description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
|
|
@@ -72763,7 +72966,7 @@ var winnersCommand = defineCommand253({
|
|
|
72763
72966
|
});
|
|
72764
72967
|
|
|
72765
72968
|
// src/commands/winning-ads/index.ts
|
|
72766
|
-
var winningAdsCommand =
|
|
72969
|
+
var winningAdsCommand = defineCommand255({
|
|
72767
72970
|
meta: {
|
|
72768
72971
|
name: "winning-ads",
|
|
72769
72972
|
description: `Search the ad-dna corpus of scored "winning" ads for reference creatives to reproduce, and manage the brands your library tracks. Proxied through the Baker backend (BAKER_API_KEY) \u2014 no separate token needed.
|
|
@@ -72963,8 +73166,8 @@ function suggestFlag(unknown, command) {
|
|
|
72963
73166
|
const name = flag3.slice(2);
|
|
72964
73167
|
const def = args5[name] ?? args5[camel(name)];
|
|
72965
73168
|
const described = def && typeof def === "object" ? def.description : void 0;
|
|
72966
|
-
const
|
|
72967
|
-
return
|
|
73169
|
+
const description2 = typeof described === "string" ? described.split(/(?<!\b(?:e\.g|i\.e|vs))\.\s/)[0]?.trim().replace(/\.$/, "") : "";
|
|
73170
|
+
return description2 ? { flag: flag3, description: description2 } : { flag: flag3 };
|
|
72968
73171
|
}
|
|
72969
73172
|
function suggestionText(suggestion) {
|
|
72970
73173
|
if (!suggestion) {
|
|
@@ -73090,7 +73293,7 @@ function getCliVersion() {
|
|
|
73090
73293
|
}
|
|
73091
73294
|
|
|
73092
73295
|
// src/cli.ts
|
|
73093
|
-
var main =
|
|
73296
|
+
var main = defineCommand256({
|
|
73094
73297
|
meta: {
|
|
73095
73298
|
name: "baker",
|
|
73096
73299
|
version: getCliVersion(),
|