@koda-sl/baker-cli 0.111.0-dev.d06db2796 → 0.112.1

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 CHANGED
@@ -653,39 +653,6 @@ baker ads google library search-competitors "crm software" --location uk
653
653
 
654
654
  ---
655
655
 
656
- ### Staged writes (`baker ads google budgets|campaigns|...`)
657
-
658
- Write commands **never touch the Google Ads API at stage time**. Each command stages a create/update/pause/resume/remove op against the current chat's draft (`BAKER_CHAT_ID`); the dashboard shows it as a pending "Google Ads" change, and the whole draft applies as one atomic `GoogleAdsService.Mutate` when the chat is published. Feature-flagged per company (`companies.googleAdsWriteEnabled`) — off by default = a fully simulated publish with zero real API calls.
659
-
660
- Reference not-yet-created resources with `g_temp_*` refs returned by earlier `create` commands (they map to Google's temporary negative-ID resource names inside one atomic batch).
661
-
662
- ```bash
663
- # Build a Search campaign bottom-up, chaining temp refs
664
- baker ads google budgets create --customer-id 1234567890 --name "Search budget" --amount 50
665
- # → { ref: "g_temp_ab12", ... }
666
- baker ads google campaigns create --customer-id 1234567890 --name "Brand — Search" \
667
- --channel-type SEARCH --budget-ref g_temp_ab12 --bidding-strategy MANUAL_CPC
668
- baker ads google ad-groups create --customer-id 1234567890 --name "Brand terms" --campaign-ref g_temp_<campaign>
669
- baker ads google keywords add --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> --text "brand name" --match-type EXACT
670
- # Shared negative keyword list → attach to the campaign
671
- baker ads google keyword-lists create --customer-id 1234567890 --name "Brand exclusions"
672
- baker ads google keyword-lists add --customer-id 1234567890 --list-ref g_temp_<list> --text "free" --match-type BROAD
673
- baker ads google keyword-lists attach --customer-id 1234567890 --campaign-ref g_temp_<campaign> --list-ref g_temp_<list>
674
- # Responsive search ad
675
- baker ads google ads create --customer-id 1234567890 --ad-group-ref g_temp_<adgroup> \
676
- --headlines "Fast Widgets,Buy Online,Free Shipping" --descriptions "Best widgets around.,Ships tomorrow." \
677
- --final-url https://example.com
678
-
679
- # Review / undo staged changes
680
- baker ads google draft list
681
- baker ads google draft remove g_temp_ab12 # cascades to dependents
682
- baker ads google draft clear
683
- ```
684
-
685
- Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remove), `negative-keywords`, `keyword-lists`, `ads`, `assets`, `audiences`, `conversions`, `bidding-strategies`, `labels`, `campaign-criteria`, and `draft`. Amounts are in major currency units (converted to micros). Money/bids: `--amount`, `--cpc-bid`, `--target-cpa` take major units; `--target-roas` a ratio. Less-common ops accept a `--file <payload.json>` (flags override file keys). Updates target a resource name or bare id as the positional argument; a target that names an op staged earlier **amends it in place**.
686
-
687
- ---
688
-
689
656
  ### Caching
690
657
 
691
658
  Google Ads data is cached at two levels:
@@ -2520,6 +2487,24 @@ Permissions enforced server-side:
2520
2487
 
2521
2488
  ---
2522
2489
 
2490
+ ### `baker mcp list | add | remove`
2491
+
2492
+ Manage **custom MCP servers** — point the agent at any remote HTTPS MCP endpoint. Registered tools appear as `mcp__<name>__*` on the next chat message.
2493
+
2494
+ ```bash
2495
+ baker mcp list
2496
+ baker mcp add --name weather --url https://mcp.example.com/mcp
2497
+ baker mcp add --name acme --url https://acme.dev/mcp --header "Authorization: Bearer sk-…"
2498
+ baker mcp add --name mine --url https://my.dev/mcp --scope user
2499
+ baker mcp remove --name weather
2500
+ ```
2501
+
2502
+ - `--url` must be HTTPS and public; loopback / private / cloud-metadata hosts are rejected.
2503
+ - `--scope company` (default) shares with every chat in the company; `--scope org` needs an admin API key; `--scope user` binds to the current message sender (requires running inside a chat turn — the bridge supplies the sender via `BAKER_ACTING_USER_ID`).
2504
+ - Repeat `--header "Key: Value"` for multiple auth headers. Header values are stored server-side and ride the MCP transport — `list` returns only the header keys, never the values.
2505
+
2506
+ ---
2507
+
2523
2508
  ### `baker schema [command]`
2524
2509
 
2525
2510
  Inspect command argument schemas for AI agent introspection.
@@ -3855,10 +3840,12 @@ The two scaffold passes are billed (the full `video_deconstruct` is the heavy on
3855
3840
 
3856
3841
  #### `baker canvas scaffold-static-ad <image> [flags]`
3857
3842
 
3843
+ `<image>` is a **local path or an `http(s)` URL** (e.g. a presigned S3 link from ad-dna). A URL is passed straight into the `original` ingest node as `source: "url"` — do not `curl` it to a file first. Note a presigned URL embedded in the emitted canvas will **expire** (the `original` node is composition-only, so a later re-run just skips it); pass a stable URL or a local file if you need the canvas to stay runnable. For the URL case, `--out` defaults to the current directory — pass `--out` to scaffold two URL sources into distinct files, or the second run overwrites the first.
3844
+
3858
3845
  Turn a source/inspiration image into a **runnable, self-validated static-ad canvas** — the static counterpart of `scaffold-video`. Like the video scaffold, this runs **billed Gemini passes** up front:
3859
3846
 
3860
- 1. **`image_describe`** (`~google/gemini-pro-latest`) — reverse-engineers the image into a blueprint JSON, written next to the canvas as **`prompt.json`**. This is the editable "prompt": you rewrite it by hand into the ad you want (palette, copy, claims, subjects). It feeds the generator directly — there is **no automatic brand-transform step**.
3861
- 2. **element selection** (`~google/gemini-flash-latest`) — picks only the **main, identity-critical** elements (the brand logo, a showcased product, a foreground person/animal, a trust badge); background extras are dropped. Each is stamped back onto its blueprint entry as a `reference_image` label so the JSON self-documents which slot grounds which subject.
3847
+ 1. **`image_describe`** (`~google/gemini-pro-latest`) — reverse-engineers the image into a blueprint JSON, written next to the canvas as **`prompt.json`**. This is the editable "prompt": you rewrite it by hand into the ad you want (palette, copy, claims, subjects). It feeds the generator directly — there is **no automatic brand-transform step**. The blueprint also names the **`winning_mechanisms`** — the special sauce that makes the ad a candidate winner, each tagged `kind` (verbal: rhyme/pun/rhythm; visual: unexpected crop, visual gag, juxtaposition, pattern interrupt, before/after; structural: hook order/reveal) with a `device` and `why_it_works` — so your rewrite rebuilds the mechanism that makes the ad win instead of adapting only the surface and losing it.
3848
+ 2. **element selection** (`~google/gemini-flash-latest`) — picks the **main, identity-critical** elements (the brand logo, a showcased product, a trust badge) **plus any foreground/hero person or animal** — the emotional focal point — even a generic one, because a free-generated face/muzzle reads as AI and grows artifacts; the emotional hero always gets a real-reference slot. Background extras are dropped. Each is stamped back onto its blueprint entry as a `reference_image` label so the JSON self-documents which slot grounds which subject.
3862
3849
  3. **global layout** (`~google/gemini-flash-latest`) — produces a structured `layout` block in `prompt.json`: the column/row grid, each region's `x_pct`/`y_pct` bounds, panel splits, background/shape, and every text block's relative size/weight/case/alignment. This is what gives the generator a precise composition to rebuild.
3863
3850
 
3864
3851
  It then scaffolds a canvas that ingests `prompt.json`, wires **one `[TODO]` ingest slot per detected element** (plus an optional brand-font → type-specimen) into `image_generate`, and wires the original image in for composition only. The canvas is validated before it's written. stdout returns `{ ok, canvas_path, prompt_path, models, layout_regions, stats, checklist }` — the **checklist** lists every real asset to drop in.
@@ -3874,7 +3861,7 @@ baker canvas run ./static-ad.canvas.json
3874
3861
  | Flag | Default | Effect |
3875
3862
  |---|---|---|
3876
3863
  | `--context <text>` | — | Known provenance (advertiser, category, market) to ground the describe. |
3877
- | `--out <path>` | `<image-dir>/static-ad.canvas.json` | Where to write the canvas (`prompt.json` is written alongside). |
3864
+ | `--out <path>` | `<image-dir>/static-ad.canvas.json` (cwd when `<image>` is a URL) | Where to write the canvas (`prompt.json` is written alongside). |
3878
3865
  | `--describe-model <id>` | registry default (`~google/gemini-pro-latest`) | Override the `image_describe` model. |
3879
3866
  | `--select-model <id>` | registry default (`~google/gemini-flash-latest`) | Override the element-selection `text_generate` model. |
3880
3867
  | `--layout-model <id>` | registry default (`~google/gemini-flash-latest`) | Override the global-layout `text_generate` model. |
@@ -24,9 +24,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  mod
25
25
  ));
26
26
 
27
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js
27
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js
28
28
  var require_safe_stable_stringify = __commonJS({
29
- "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js"(exports, module) {
29
+ "../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js"(exports, module) {
30
30
  "use strict";
31
31
  var { hasOwnProperty } = Object.prototype;
32
32
  var stringify = configure2();
@@ -890,7 +890,7 @@ function describeCause(c) {
890
890
  }
891
891
  }
892
892
 
893
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/esm/wrapper.js
893
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/esm/wrapper.js
894
894
  var import__ = __toESM(require_safe_stable_stringify(), 1);
895
895
  var configure = import__.default.configure;
896
896
  var wrapper_default = import__.default;
@@ -6252,4 +6252,4 @@ export {
6252
6252
  defaultRegistry,
6253
6253
  createEngineFromEnv
6254
6254
  };
6255
- //# sourceMappingURL=chunk-26K7V346.js.map
6255
+ //# sourceMappingURL=chunk-3JVYU72O.js.map