@koda-sl/baker-cli 0.274.0-dev.bbba3d7fc → 0.274.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/{chunk-VWLNPPC6.js → chunk-36KVUYVL.js} +4 -4
- package/dist/chunk-36KVUYVL.js.map +1 -0
- package/dist/cli.js +253 -63
- package/dist/cli.js.map +1 -1
- package/dist/engine/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-VWLNPPC6.js.map +0 -1
package/README.md
CHANGED
|
@@ -5740,6 +5740,10 @@ baker landing critique spring-offer summer-offer claude # score three landings
|
|
|
5740
5740
|
|
|
5741
5741
|
- **Agent washing is a copy tell.** A page that claims autonomy ("fully autonomous", "while you sleep", "no human intervention") and never says anywhere what the buyer approves, overrides, or audits scores an `agent-washing` warn. One signal about oversight of the agent's actions — approval, review, override, undo/rollback, audit log, escalation — anywhere on the page clears it; the rule is page-scope precisely because the hero can defer the trust story to a section below it. Generic privacy boilerplate ("GDPR", "encrypted", "your data") deliberately does **not** clear it, since it appears in most footers and says nothing about who is in charge of the agent.
|
|
5742
5742
|
|
|
5743
|
+
- **Positioning integrity is scored too, and it is the one copy rule that blocks on a single sentence.** `competitor-concession` fires when the page ranks somebody else above the client, or says the client does not lead at what the page sells ("su constructor es mejor que el nuestro", "we're not the best"). Every other prose rule waits for a cluster because one AI tell proves nothing; this one is the whole defect on its own — the page is paid traffic, and it is arguing the visitor should leave. Two shapes that read identically are exempt by design: a concession about **price**, in either direction ("we are not the cheapest / the most expensive, and here is why" is premium positioning), and a superlative flipped by a negation ("ningún equipo trabaja más rápido que el nuestro"), which is the strongest claim *for* the client. Its warn-tier sibling `competitor-named-in-comparison` fires when a name from `src/content/competitors/` appears in a comparative sentence outside a `<table>` — a comparison table is a section the landing skill teaches, but naming a rival anywhere else on paid traffic is the client's call, not the build's. Spanish, Portuguese and English.
|
|
5744
|
+
|
|
5745
|
+
- **Copy held in component frontmatter is read like markup copy.** Astro landings keep FAQ pairs, testimonial quotes, feature cards and pricing rows as a `const items = [{ q, a }]` array above the `---` fence and render them in a `.map()`, so a critic that blanked the whole block was blind to a large share of every page's actual words. Prose string literals in that block now feed every copy rule; imports, class strings, URLs and config do not, and the bar is deliberately high in that direction — a Tailwind class list in front of the copy rules is worse than one missed tell.
|
|
5746
|
+
|
|
5743
5747
|
Output is the standard envelope `{ ok, data, hints }` with `data = { advisory, slug, overall, counts, dimensions, findings }`. `dimensions` scores seven design families (typography, color, borders_depth, motion, spacing, copy, integrity) 0–1 (higher is better); `counts` is the block/warn/advisory tally.
|
|
5744
5748
|
|
|
5745
5749
|
## Brand Fonts (`baker brand fonts`)
|
|
@@ -5875,6 +5879,8 @@ Pushing to `main` with changes in `packages/cli/` triggers the GitHub Actions wo
|
|
|
5875
5879
|
|
|
5876
5880
|
- **0.256.0**: a structured snippet value over 25 characters is refused before it is staged. Google caps each VALUE at 25 and answers a longer one with a bare `Too long.` at `structured_snippet_asset.values[i]` — no header, no value, nothing to act on — and it takes the asset's campaign link down with it as `RESOURCE_NOT_FOUND`. `assets create --values` and `assets update --values` now cap each entry; the per-asset 3-10 count check was already there, and only the per-value length was missing. Found on a live publish where four of five values were fine and "Bases de datos vectoriales" (26) was not, and confirmed fixed by re-publishing the same snippet at 25 characters against a real account, where it applied and linked cleanly.
|
|
5877
5881
|
|
|
5882
|
+
- **0.274.0**: `baker landing critique` gains a `positioning integrity` pair in the `integrity` family, and starts reading the copy Astro components keep in their frontmatter. `competitor-concession` is **block-tier and fires at a single sentence** — unlike every other prose rule, which needs a cluster — because a page that ranks a competitor above the client, or says the client does not lead at what it sells, spends the client's ad budget arguing the visitor should leave. A concession about **price** in either direction never fires it ("we are not the cheapest / the most expensive, and here is why" is premium positioning), and neither does a superlative flipped by a negation ("ningún equipo trabaja más rápido que el nuestro"), which is the strongest claim FOR the client. Its warn-tier sibling `competitor-named-in-comparison` fires when a name from `src/content/competitors/` appears in a comparative sentence outside a `<table>` — naming a rival on paid traffic is the client's call. Both read Spanish, Portuguese and English. Alongside them, prose string literals in a component's `---` block are now scored like markup copy (imports, class strings, URLs and config still are not), so an FAQ held as `const faqs = [{ q, a }]` — the standard Astro shape — is no longer invisible to the critic and to `BRAND.md` copy rules. `CRITIC_VERSION` bumps to `3`.
|
|
5883
|
+
|
|
5878
5884
|
- **0.273.0**: **an ad's name can no longer take a whole publish down.** `Ad.name` is IMMUTABLE, and `--ad-name` is shared by `ads create` and `ads update` (every content flag is), so an update restating the ad's name put `name` in the field mask and Google refused the operation — and, being one op inside an atomic batch, everything staged with it. The name is now dropped from an update's mutate, and an update that would actually RENAME the ad is refused at stage time instead, so a rename is answered rather than silently ignored. Two related corrections: `--ad-name` is required on `demandGenVideo` **only** — a multi-asset `demandGen` ad published with no name at all and Google created it, so the docs that called it a Demand-Gen-family requirement were wrong — and a content flag on `--format call` is now refused like every other format's, instead of being dropped because a call ad reads its content from `--file` alone. The Demand Gen video ad's live videos and logos are also read into the review card now, so an update that replaces them shows what it is replacing.
|
|
5879
5885
|
|
|
5880
5886
|
- **0.272.0**: what one live publish of a Demand Gen video ad found, all four fixed and each of them a whole-batch failure (a campaign, its ad group, its ad and its assets are one atomic mutate). `--type DEMAND_GEN_AD` and `--type VIDEO_OUTSTREAM` are **gone from `ad-groups create`** — v23's ad group types have never had either, and Google answers with a request-level `Invalid value` that fails every sibling operation. `--type` is now **optional and best omitted**: Google derives an ad group's type from its campaign's channel, and on a Demand Gen campaign that is the only way to create one (its `ad_group.type` comes back empty). `--bidding-strategy MANUAL_CPC` on a **Demand Gen** campaign is refused before staging — Google rejects it outright (`OPERATION_NOT_PERMITTED_FOR_CONTEXT`), and the Demand Gen playbook shipped in every sandbox was teaching it; `MAXIMIZE_CONVERSIONS` and `TARGET_CPC` work. And a new Demand Gen video ad now needs `--ad-name` (Google's "Ad name", required on Demand Gen ads and no other format) and at least one `--logo-image-assets` ref alongside its video — Google only says so at publish, once the assets in the same batch have already been created.
|
|
@@ -16,9 +16,9 @@ import {
|
|
|
16
16
|
shouldEscalate
|
|
17
17
|
} from "./chunk-DZUVUGEP.js";
|
|
18
18
|
|
|
19
|
-
//
|
|
19
|
+
// ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js
|
|
20
20
|
var require_safe_stable_stringify = __commonJS({
|
|
21
|
-
"
|
|
21
|
+
"../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js"(exports, module) {
|
|
22
22
|
"use strict";
|
|
23
23
|
var { hasOwnProperty } = Object.prototype;
|
|
24
24
|
var stringify = configure2();
|
|
@@ -1092,7 +1092,7 @@ function resolveAdaptFormats(params) {
|
|
|
1092
1092
|
return params.formats ?? [];
|
|
1093
1093
|
}
|
|
1094
1094
|
|
|
1095
|
-
//
|
|
1095
|
+
// ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/esm/wrapper.js
|
|
1096
1096
|
var import__ = __toESM(require_safe_stable_stringify(), 1);
|
|
1097
1097
|
var configure = import__.default.configure;
|
|
1098
1098
|
var wrapper_default = import__.default;
|
|
@@ -9154,4 +9154,4 @@ export {
|
|
|
9154
9154
|
defaultRegistry,
|
|
9155
9155
|
createEngineFromEnv
|
|
9156
9156
|
};
|
|
9157
|
-
//# sourceMappingURL=chunk-
|
|
9157
|
+
//# sourceMappingURL=chunk-36KVUYVL.js.map
|