@koda-sl/baker-cli 0.192.1 → 0.192.3
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 +2 -2
- package/dist/cli.js +19 -19
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -789,7 +789,7 @@ baker ads meta pixels --pixel-id 9988 --stats --days 7
|
|
|
789
789
|
|
|
790
790
|
Meta writes mirror the Google/LinkedIn model: they **never hit the Graph API when you run them**. Each op is validated at stage time (field shapes, budget rules, page/Instagram identity ownership, CBO/ABO exclusivity, status-transition legality), shows in the dashboard chat as a pending Meta change, and applies only when the chat is published. Meta has no atomic batch mutate, so ops apply **sequentially** on publish — one failure skips its dependents but the publish completes.
|
|
791
791
|
|
|
792
|
-
|
|
792
|
+
**That publish reaches the real ad account for every company** — Meta writes are generally available, with no per-company flag and no simulated mode to turn on. Discarding the chat before it completes is what undoes a staged change.
|
|
793
793
|
|
|
794
794
|
Chain a full ad from scratch with `meta_temp_*` refs (each create returns one):
|
|
795
795
|
|
|
@@ -999,7 +999,7 @@ draft [list|remove <ref>|clear|amend <ref>|show <ref>] # review/undo/amend sta
|
|
|
999
999
|
|
|
1000
1000
|
Write commands never call the LinkedIn API at stage time. Each stages an op on the current chat's draft, fully validated at staging (field limits, enums, budget minimums, URN shapes, parent existence, Baker media readiness, status-transition legality). Validation errors are structured per-field; non-blocking warnings (Maximum Delivery when no `--bid`, budget below playbook floor, audience under 300 rows, >4 lead-form questions, audience expansion/LAN on) come back in the stage envelope. Ops apply when the chat is published.
|
|
1001
1001
|
|
|
1002
|
-
|
|
1002
|
+
**That publish reaches the real ad account for every company** — LinkedIn writes are generally available, with no per-company flag and no simulated mode to turn on. Discarding the chat before it completes is what undoes a staged change.
|
|
1003
1003
|
|
|
1004
1004
|
```bash
|
|
1005
1005
|
# Chain creates via li_temp_* refs — group → campaign → creative in one chat
|
package/dist/cli.js
CHANGED
|
@@ -2477,7 +2477,7 @@ var CAPABILITY_SURFACE_SPECS = {
|
|
|
2477
2477
|
label: "Google Ads",
|
|
2478
2478
|
provider: "google-ads",
|
|
2479
2479
|
resourceNoun: "ad account",
|
|
2480
|
-
writePath: "staged-
|
|
2480
|
+
writePath: "staged-live",
|
|
2481
2481
|
writeScopes: ["https://www.googleapis.com/auth/adwords"],
|
|
2482
2482
|
commands: "baker ads google"
|
|
2483
2483
|
},
|
|
@@ -2486,7 +2486,7 @@ var CAPABILITY_SURFACE_SPECS = {
|
|
|
2486
2486
|
label: "Meta Ads",
|
|
2487
2487
|
provider: "meta",
|
|
2488
2488
|
resourceNoun: "ad account",
|
|
2489
|
-
writePath: "staged-
|
|
2489
|
+
writePath: "staged-live",
|
|
2490
2490
|
writeScopes: ["ads_management"],
|
|
2491
2491
|
commands: "baker ads meta"
|
|
2492
2492
|
},
|
|
@@ -2495,7 +2495,7 @@ var CAPABILITY_SURFACE_SPECS = {
|
|
|
2495
2495
|
label: "LinkedIn Ads",
|
|
2496
2496
|
provider: "linkedin",
|
|
2497
2497
|
resourceNoun: "ad account",
|
|
2498
|
-
writePath: "staged-
|
|
2498
|
+
writePath: "staged-live",
|
|
2499
2499
|
writeScopes: ["rw_ads"],
|
|
2500
2500
|
commands: "baker ads linkedin"
|
|
2501
2501
|
},
|
|
@@ -2575,7 +2575,7 @@ var capabilityLimitViewSchema = z6.object({
|
|
|
2575
2575
|
cause: z6.enum(["not_built", "provider_forbids", "no_permission"]),
|
|
2576
2576
|
detail: z6.string()
|
|
2577
2577
|
});
|
|
2578
|
-
var capabilityWriteModeSchema = z6.enum(["live", "
|
|
2578
|
+
var capabilityWriteModeSchema = z6.enum(["live", "applies-at-publish", "none"]);
|
|
2579
2579
|
var capabilitySurfaceReportSchema = z6.object({
|
|
2580
2580
|
surface: capabilitySurfaceSchema,
|
|
2581
2581
|
label: z6.string(),
|
|
@@ -12525,7 +12525,7 @@ registerSchema({
|
|
|
12525
12525
|
});
|
|
12526
12526
|
registerSchema({
|
|
12527
12527
|
command: "ads.linkedin.draft.list",
|
|
12528
|
-
description: "Show every LinkedIn write op staged in this chat: ref, summary, dependencies, warnings,
|
|
12528
|
+
description: "Show every LinkedIn write op staged in this chat: ref, summary, dependencies, warnings, and post-publish results. Ops are invisible to the read commands until publish, and publishing reaches the real ad account \u2014 check here before finishing.",
|
|
12529
12529
|
args: {
|
|
12530
12530
|
json: {
|
|
12531
12531
|
type: "boolean",
|
|
@@ -15270,7 +15270,7 @@ Performance \u2014 the workhorse (3 axes):
|
|
|
15270
15270
|
|
|
15271
15271
|
Staged writes (NEVER hit LinkedIn directly \u2014 ops stage on this chat's draft,
|
|
15272
15272
|
show in the dashboard as pending LinkedIn changes, and apply when the chat is
|
|
15273
|
-
published
|
|
15273
|
+
published, at which point they reach the real ad account):
|
|
15274
15274
|
baker ads linkedin campaign-groups create|update|pause|resume|duplicate
|
|
15275
15275
|
baker ads linkedin campaigns create|update|pause|resume|archive|duplicate
|
|
15276
15276
|
baker ads linkedin creatives create|update|pause|resume|duplicate
|
|
@@ -17260,7 +17260,7 @@ async function listDraft2(chat) {
|
|
|
17260
17260
|
var listCommand9 = defineCommand62({
|
|
17261
17261
|
meta: {
|
|
17262
17262
|
name: "list",
|
|
17263
|
-
description: "Show every Meta write op staged in this chat, its
|
|
17263
|
+
description: "Show every Meta write op staged in this chat, its dependencies, and post-publish results. Publishing reaches the real ad account, so review this before you finish. Example: baker ads meta draft"
|
|
17264
17264
|
},
|
|
17265
17265
|
args: { chat: CHAT_READ_ARG },
|
|
17266
17266
|
run: async ({ args }) => {
|
|
@@ -26535,7 +26535,7 @@ Full guide: __tooling__/docs/tools/baker/canvas.md`
|
|
|
26535
26535
|
import { defineCommand as defineCommand100 } from "citty";
|
|
26536
26536
|
registerSchema({
|
|
26537
26537
|
command: "capabilities",
|
|
26538
|
-
description: "Start here, before promising the user anything on an ad platform, in Analytics, or in Tag Manager. Answers three questions in one call: what is connected and with what access,
|
|
26538
|
+
description: "Start here, before promising the user anything on an ad platform, in Analytics, or in Tag Manager. Answers three questions in one call: what is connected and with what access, what a write on each surface actually does when it lands, and what CANNOT be done here and why. Run it with no arguments for every surface; name one surface to also get the exact fields every change on it accepts.",
|
|
26539
26539
|
args: {
|
|
26540
26540
|
surface: {
|
|
26541
26541
|
type: "positional",
|
|
@@ -26552,12 +26552,6 @@ registerSchema({
|
|
|
26552
26552
|
});
|
|
26553
26553
|
function capabilityHints(surfaces) {
|
|
26554
26554
|
const hints = [];
|
|
26555
|
-
const simulated = surfaces.filter((surface) => surface.writeMode === "simulated");
|
|
26556
|
-
if (simulated.length > 0) {
|
|
26557
|
-
hints.push(
|
|
26558
|
-
`SIMULATED: ${simulated.map((s) => s.label).join(", ")} \u2014 staging and publishing complete in full and nothing reaches the platform. Do the work, but never tell the user it is live.`
|
|
26559
|
-
);
|
|
26560
|
-
}
|
|
26561
26555
|
const immediate = surfaces.filter((surface) => surface.writeMode === "applies-at-publish");
|
|
26562
26556
|
if (immediate.length > 0) {
|
|
26563
26557
|
hints.push(
|
|
@@ -26586,7 +26580,7 @@ var runCapabilities = defineCommand100({
|
|
|
26586
26580
|
name: "capabilities",
|
|
26587
26581
|
description: `What Baker can and cannot do for this company, before any work starts.
|
|
26588
26582
|
|
|
26589
|
-
Reports, per surface: what is connected and with what access,
|
|
26583
|
+
Reports, per surface: what is connected and with what access, what a write there does when it lands, the entities that can be changed, and \u2014 the part nothing else tells you \u2014 what cannot be changed and why.
|
|
26590
26584
|
|
|
26591
26585
|
Examples:
|
|
26592
26586
|
baker capabilities
|
|
@@ -32249,6 +32243,9 @@ function isCreamColor(c) {
|
|
|
32249
32243
|
|
|
32250
32244
|
// src/engine/landing/lib/brand-tokens.ts
|
|
32251
32245
|
var EMPTY = { fonts: /* @__PURE__ */ new Set(), colors: [], hasTokens: false };
|
|
32246
|
+
function isWeightOrStyle(value) {
|
|
32247
|
+
return /^(?:\d+(?:\.\d+)?[a-z%]*|normal|bold|bolder|lighter|italic|oblique|none|auto)$/i.test(value);
|
|
32248
|
+
}
|
|
32252
32249
|
function parseBrandTokens(globalCss, brandMd) {
|
|
32253
32250
|
const fonts = /* @__PURE__ */ new Set();
|
|
32254
32251
|
const colors = [];
|
|
@@ -32257,10 +32254,13 @@ function parseBrandTokens(globalCss, brandMd) {
|
|
|
32257
32254
|
return { fonts, colors, hasTokens: fonts.size > 0 || colors.length > 0 };
|
|
32258
32255
|
}
|
|
32259
32256
|
function parseGlobalCss(rawCss, fonts, colors) {
|
|
32260
|
-
const globalCss = rawCss.replace(/\/\*[\s\S]*?\*\//g, " ");
|
|
32261
|
-
for (const m of globalCss.matchAll(
|
|
32262
|
-
const
|
|
32263
|
-
if (
|
|
32257
|
+
const globalCss = rawCss.replace(/\/\*[\s\S]*?\*\//g, (block) => block.replace(/[^\n]/g, " "));
|
|
32258
|
+
for (const m of globalCss.matchAll(/(?<![\w-])--font-([\w-]*)\s*:\s*([^;]+);/gi)) {
|
|
32259
|
+
const slug = m[1] ?? "";
|
|
32260
|
+
if (slug.includes("--") || /^weight(?:$|[-\s])/i.test(slug)) continue;
|
|
32261
|
+
const first = (m[2] ?? "").split(",")[0]?.trim().replace(/^['"]|['"]$/g, "").toLowerCase();
|
|
32262
|
+
if (!first || isWeightOrStyle(first)) continue;
|
|
32263
|
+
fonts.add(first);
|
|
32264
32264
|
}
|
|
32265
32265
|
for (const m of globalCss.matchAll(
|
|
32266
32266
|
/--color-[\w-]*\s*:\s*(#[0-9a-f]{3,8}\b|rgba?\([^)]+\)|oklch\([^)]+\)|hsla?\([^)]+\))/gi
|