@koda-sl/baker-cli 0.250.2-dev.e7a1a227e → 0.252.0-dev.e7a1a227e

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
@@ -5792,6 +5792,8 @@ This CLI is designed for AI agent consumption. Key patterns:
5792
5792
  - **0.217.0**: new family `baker avatars list|get|create|update|delete`, plus `--avatar <handle>` on `baker studio generate` and `baker studio animate` — company-scoped reusable presenters, typed from the shared `@baker/api` avatars contract. `--avatar` is the way to cast one: it grounds the render on the identity sheet, reuses the subject description verbatim, and records the avatar on the batch. Passing the sheet through `--reference` instead does none of those and leaves the batch unattributed, so the avatar can never show what it has appeared in; the route refuses a handle that is not `ready`, because generating a stranger is worse than an error. `get` returns the sheet URL and that description; every command's `hints` carry the next move (still building → re-check with `get`; changed `--subject` without `--regenerate-sheet` → the sheet is stale). `create` refuses `--source-image` without `--likeness-confirmed` and returns an `error.fix` telling the agent to ask the user for that permission, since only they can give it; an unknown handle returns an `error.fix` pointing at `baker avatars list`. Profile flags on `update` merge over the stored profile instead of replacing it.
5793
5793
 
5794
5794
  - **0.250.1**: `--avatar <handle>` on `baker studio generate` and `baker studio animate` never worked. Both were declared in `registerSchema` and read at the call site, but neither was in the command's own citty `args` — and citty does not reject an undeclared flag, it keeps it and sets it to `true`. So `--avatar elena` reached the route as `avatar: true` with `elena` dropped as a stray positional, and the body schema (`z.string()`) refused it. Documented since 0.217.0, broken since 0.217.0: casting an avatar into a render was not possible from the CLI at all, which is why a clip of a named presenter came back with neither the identity sheet nor the voice. Both flags are now declared. A new test in `command-reference-integrity` compares every registered schema against the args of the command that parses it, so the two cannot drift again — it found a third case on the way, `actions status`, whose schema advertised a `--refs` flag for what the command actually takes as positionals.
5795
+ - **0.251.0**: `--accent` on `baker avatars create|update` — the region an avatar's voice comes from, e.g. `"Spanish from Spain, Madrid accent"`. Its own field rather than a sentence inside `--speech`, because that is where it went to die: asked for "pace, register, accent", the agent wrote *"clear Spanish accent"* for a Madrid presenter, the video model read that as no accent, and the clip came out sounding like nowhere. A place can be checked; an adjective cannot. It reaches the render through `buildDeliveryDirection` as its own `ACCENT:` instruction, and `thinProfileHint` now names it first among the missing fields since it is the only one that fails silently — a clip with no accent still looks finished.
5796
+ - **0.252.0**: avatar voices removed. `--voice-id` / `--voice-description` are gone from `baker avatars create|update`, and an avatar no longer holds a voice at all — every clip is voiced by the video model as it renders, directed by the profile's `--accent`. The picker they replaced offered a voice, played its preview, and then shipped a clip that did not sound like it: the re-voice was speech-to-speech, which replaces timbre and keeps pronunciation, so the accent the user picked could never survive. Three other routes were built and judged on video before removing it — TTS + lip-sync (mouth), audio-driven avatar models (picture), and Seedance 2.5 driven by audio (refuses AI faces). Reasoning and the re-open condition: `docs/adr/0005-an-avatar-is-a-face-not-a-voice.md`.
5795
5797
  ## Publishing
5796
5798
 
5797
5799
  ### Auto-publish (CI)
package/dist/cli.js CHANGED
@@ -3682,6 +3682,7 @@ var avatarProfileSchema = z7.object({
3682
3682
  subjectDescription: z7.string().trim().min(1).max(2e3),
3683
3683
  persona: z7.string().trim().max(2e3).optional(),
3684
3684
  speech: z7.string().trim().max(2e3).optional(),
3685
+ accent: z7.string().trim().max(2e3).optional(),
3685
3686
  motion: z7.string().trim().max(2e3).optional(),
3686
3687
  wardrobe: z7.string().trim().max(2e3).optional(),
3687
3688
  setting: z7.string().trim().max(2e3).optional(),
@@ -3697,7 +3698,6 @@ var avatarSummarySchema = z7.object({
3697
3698
  /** The identity sheet to wire into `--reference`. Absent until the build settles. */
3698
3699
  sheetUrl: z7.string().optional(),
3699
3700
  coverUrl: z7.string().optional(),
3700
- hasVoice: z7.boolean(),
3701
3701
  errorMessage: z7.string().optional()
3702
3702
  });
3703
3703
  var avatarDetailSchema = avatarSummarySchema.extend({
@@ -24488,7 +24488,6 @@ function rosterRow(avatar) {
24488
24488
  status: avatar.status,
24489
24489
  likeness: avatar.likeness,
24490
24490
  sheetUrl: avatar.sheetUrl ?? null,
24491
- hasVoice: avatar.hasVoice,
24492
24491
  avatarId: avatar.avatarId,
24493
24492
  ...avatar.errorMessage ? { errorMessage: avatar.errorMessage } : {}
24494
24493
  };
@@ -24517,11 +24516,11 @@ function rosterHints(roster, statusFilter) {
24517
24516
  return hints;
24518
24517
  }
24519
24518
  function thinProfileHint(profile, handle) {
24520
- const missing = ["motion", "persona", "speech", "wardrobe", "setting"].filter(
24519
+ const missing = ["motion", "persona", "speech", "accent", "wardrobe", "setting"].filter(
24521
24520
  (field) => !profile?.[field]?.trim()
24522
24521
  );
24523
24522
  if (missing.length === 0) return null;
24524
- return `MISSING ${missing.map((field) => `--${field}`).join(" ")}. A bare subject description holds the face still and nothing else, so clips of @${handle} come out stiff and generic \u2014 measured, filling these in nearly doubled the movement in the same brief. The user almost certainly told you how this person talks and carries themselves; put it in: \`baker avatars update ${handle} ${missing.map((field) => `--${field} "\u2026"`).join(" ")}\`.`;
24523
+ return `MISSING ${missing.map((field) => `--${field}`).join(" ")}. A bare subject description holds the face still and nothing else, so clips of @${handle} come out stiff and generic \u2014 measured, filling these in nearly doubled the movement in the same brief. --accent is the one nobody guesses and the only one that fails silently: it decides the accent the avatar SPEAKS with in every clip, so name the region the user is writing to you from ("Spanish from Spain, Madrid accent") \u2014 "Spanish" on its own renders as no accent at all. The user almost certainly told you how this person talks and carries themselves; put it in: \`baker avatars update ${handle} ${missing.map((field) => `--${field} "\u2026"`).join(" ")}\`.`;
24525
24524
  }
24526
24525
  function creationHints(created, profile) {
24527
24526
  const thin = thinProfileHint(profile, created.handle);
@@ -24614,6 +24613,7 @@ var TEXT_FIELDS = [
24614
24613
  ["subject", "subjectDescription"],
24615
24614
  ["persona", "persona"],
24616
24615
  ["speech", "speech"],
24616
+ ["accent", "accent"],
24617
24617
  ["motion", "motion"],
24618
24618
  ["wardrobe", "wardrobe"],
24619
24619
  ["setting", "setting"]
@@ -24702,7 +24702,12 @@ registerSchema({
24702
24702
  required: true
24703
24703
  },
24704
24704
  persona: { type: "string", description: "Who they are on camera \u2014 role, attitude, energy", required: false },
24705
- speech: { type: "string", description: "How they speak \u2014 pace, register, accent, verbal habits", required: false },
24705
+ speech: { type: "string", description: "How they speak \u2014 pace, register, verbal habits", required: false },
24706
+ accent: {
24707
+ type: "string",
24708
+ description: "Where their voice is FROM, as a place: 'Spanish from Spain, Madrid accent', 'Mexican Spanish', 'British English, London'. Name the region \u2014 an adjective like 'clear Spanish accent' is read by the video model as NO accent, and the clip comes out sounding like nowhere. Set it whenever the avatar will speak; the user's own language is the default to assume, not English.",
24709
+ required: false
24710
+ },
24706
24711
  motion: { type: "string", description: "Body language and gesture in video", required: false },
24707
24712
  wardrobe: { type: "string", description: "Default outfit when the brief does not name one", required: false },
24708
24713
  setting: { type: "string", description: "Default surroundings when the brief leaves them open", required: false },
@@ -24736,6 +24741,11 @@ var createCommand2 = defineCommand89({
24736
24741
  subject: { type: "string", description: "The person, plainly described \u2014 reused verbatim", required: false },
24737
24742
  persona: { type: "string", description: "Who they are on camera", required: false },
24738
24743
  speech: { type: "string", description: "How they speak", required: false },
24744
+ accent: {
24745
+ type: "string",
24746
+ description: "Where their voice is FROM \u2014 name the region, e.g. 'Spanish from Spain, Madrid accent'",
24747
+ required: false
24748
+ },
24739
24749
  motion: { type: "string", description: "Body language in video", required: false },
24740
24750
  wardrobe: { type: "string", description: "Default outfit", required: false },
24741
24751
  setting: { type: "string", description: "Default surroundings", required: false },