@koda-sl/baker-cli 0.35.0 → 0.36.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 +131 -7
- package/dist/cli.js +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/ads/google/error-parser.js +1 -1
- package/dist/commands/ads/google/error-parser.js.map +1 -1
- package/dist/commands/ads/google/preflight.d.ts.map +1 -1
- package/dist/commands/ads/google/preflight.js +20 -0
- package/dist/commands/ads/google/preflight.js.map +1 -1
- package/dist/commands/ads/google/preflight.test.js +6 -0
- package/dist/commands/ads/google/preflight.test.js.map +1 -1
- package/dist/commands/images/crop.d.ts +33 -0
- package/dist/commands/images/crop.d.ts.map +1 -0
- package/dist/commands/images/crop.js +90 -0
- package/dist/commands/images/crop.js.map +1 -0
- package/dist/commands/images/dimensions.d.ts +8 -0
- package/dist/commands/images/dimensions.d.ts.map +1 -0
- package/dist/commands/images/dimensions.js +56 -0
- package/dist/commands/images/dimensions.js.map +1 -0
- package/dist/commands/images/index.d.ts.map +1 -1
- package/dist/commands/images/index.js +20 -2
- package/dist/commands/images/index.js.map +1 -1
- package/dist/commands/images/normalize.d.ts +54 -0
- package/dist/commands/images/normalize.d.ts.map +1 -0
- package/dist/commands/images/normalize.js +252 -0
- package/dist/commands/images/normalize.js.map +1 -0
- package/dist/commands/images/upscale.d.ts +13 -0
- package/dist/commands/images/upscale.d.ts.map +1 -0
- package/dist/commands/images/upscale.js +73 -0
- package/dist/commands/images/upscale.js.map +1 -0
- package/dist/lib/image/color-changer.d.ts +16 -0
- package/dist/lib/image/color-changer.d.ts.map +1 -0
- package/dist/lib/image/color-changer.js +366 -0
- package/dist/lib/image/color-changer.js.map +1 -0
- package/dist/lib/image/color-changer.test.d.ts +2 -0
- package/dist/lib/image/color-changer.test.d.ts.map +1 -0
- package/dist/lib/image/color-changer.test.js +131 -0
- package/dist/lib/image/color-changer.test.js.map +1 -0
- package/dist/lib/image/crop-sprite.d.ts +9 -0
- package/dist/lib/image/crop-sprite.d.ts.map +1 -0
- package/dist/lib/image/crop-sprite.js +13 -0
- package/dist/lib/image/crop-sprite.js.map +1 -0
- package/dist/lib/image/dimensions.d.ts +9 -0
- package/dist/lib/image/dimensions.d.ts.map +1 -0
- package/dist/lib/image/dimensions.js +13 -0
- package/dist/lib/image/dimensions.js.map +1 -0
- package/dist/lib/image/image-processor.d.ts +26 -0
- package/dist/lib/image/image-processor.d.ts.map +1 -0
- package/dist/lib/image/image-processor.js +185 -0
- package/dist/lib/image/image-processor.js.map +1 -0
- package/dist/lib/image/io.d.ts +29 -0
- package/dist/lib/image/io.d.ts.map +1 -0
- package/dist/lib/image/io.js +90 -0
- package/dist/lib/image/io.js.map +1 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -227,16 +227,17 @@ baker ads google query --list-presets
|
|
|
227
227
|
| `shopping-products` | Product-level shopping metrics | LAST_30_DAYS |
|
|
228
228
|
| `account-summary` | Account-level totals | LAST_30_DAYS |
|
|
229
229
|
|
|
230
|
-
**Pre-flight auto-fixes:**
|
|
230
|
+
**Pre-flight checks and auto-fixes:**
|
|
231
231
|
|
|
232
|
-
The CLI automatically corrects common GAQL mistakes before hitting the API:
|
|
232
|
+
The CLI rejects or automatically corrects common GAQL mistakes before hitting the API:
|
|
233
233
|
|
|
234
|
-
| Pattern |
|
|
235
|
-
|
|
234
|
+
| Pattern | Behavior | Warning/error emitted |
|
|
235
|
+
|---------|----------|-----------------------|
|
|
236
236
|
| Missing LIMIT | Adds `LIMIT 200` | `"Added LIMIT 200. Use --limit to override."` |
|
|
237
|
-
| `keyword.text` | `ad_group_criterion.keyword.text` | `"keyword.text → ad_group_criterion.keyword.text"` |
|
|
238
|
-
| `shopping_performance_view.product_*` | `segments.product_*` | Field renamed |
|
|
239
|
-
| `campaign.status = 'ACTIVE'` | `= 'ENABLED'` | Enum corrected |
|
|
237
|
+
| `keyword.text` | Rewrites to `ad_group_criterion.keyword.text` | `"keyword.text → ad_group_criterion.keyword.text"` |
|
|
238
|
+
| `shopping_performance_view.product_*` | Rewrites to `segments.product_*` | Field renamed |
|
|
239
|
+
| `campaign.status = 'ACTIVE'` | Rewrites to `= 'ENABLED'` | Enum corrected |
|
|
240
|
+
| `segments.conversion_action_name` with `metrics.cost_micros` | Rejects; split into separate conversion-action and spend queries | `INCOMPATIBLE_FIELDS` with `fix.action: "split_query"` |
|
|
240
241
|
| `FROM ad_group_criterion` without `negative` field | Warns | `"ad_group_criterion returns BOTH positive and negative keywords. Use --preset positive-keywords or negative-keywords."` |
|
|
241
242
|
|
|
242
243
|
Auto-fixed queries proceed normally. Warnings appear in the response:
|
|
@@ -1595,6 +1596,10 @@ Each external source is its own subcommand. Pick the verb that matches the sourc
|
|
|
1595
1596
|
| `baker images get <id>` | Single record | n/a |
|
|
1596
1597
|
| `baker images upload <file\|url>` | Upload a local file OR remote URL to the library | always on |
|
|
1597
1598
|
| `baker images delete <id>` | Delete a record | n/a |
|
|
1599
|
+
| `baker images normalize <files>` | Local recolor + bg removal + trim + resize | n/a (operates on disk, no upload) |
|
|
1600
|
+
| `baker images upscale <imageId>` | Real-ESRGAN super-resolution via backend ($0.05/image, cost-tracked) | n/a (operates on library image) |
|
|
1601
|
+
| `baker images crop <file>` | Coordinate-based rectangular extract — local file or URL | n/a |
|
|
1602
|
+
| `baker images dimensions <file\|url>` | Read width / height / aspect / format without decoding | n/a |
|
|
1598
1603
|
|
|
1599
1604
|
**Auto-ingest** runs the full `processImage` pipeline (Gemini describe + Voyage multimodal embed + OpenRouter text embed) on every hit. Override with `--auto-ingest N` (turn on) or `--no-auto-ingest` (turn off where default is on). After auto-ingest the next `baker images library` query for the same concept hits the local row.
|
|
1600
1605
|
|
|
@@ -1975,6 +1980,125 @@ baker images delete j571abc123def --dry-run
|
|
|
1975
1980
|
baker images delete j571abc123def
|
|
1976
1981
|
```
|
|
1977
1982
|
|
|
1983
|
+
### `baker images normalize <files> [options]`
|
|
1984
|
+
|
|
1985
|
+
Local-file image normalization for logos and brand assets. Declarative — describe the desired final state via flags and the pipeline runs the needed stages in order. Operates on files in the sandbox; pair with `baker images upload` to ship results to the library. For super-resolution, upload first then use `baker images upscale <imageId>` (runs on the Convex backend, cost-tracked).
|
|
1986
|
+
|
|
1987
|
+
```bash
|
|
1988
|
+
# Recolor a logo row to white, height-normalize for a "trusted by" strip
|
|
1989
|
+
baker images normalize "logos/*.png" --color '#FFFFFF' --height 200
|
|
1990
|
+
|
|
1991
|
+
# Strip background only, in-place
|
|
1992
|
+
baker images normalize logo.png --remove-bg --shrink-to-content
|
|
1993
|
+
|
|
1994
|
+
# Uniform 200x200 grid tiles, contain by default
|
|
1995
|
+
baker images normalize "a.png,b.png,c.png" --size 200x200 --output ./out
|
|
1996
|
+
|
|
1997
|
+
# Resolve the pipeline without writing files
|
|
1998
|
+
baker images normalize "logos/*.png" --color '#000' --height 100 --dry-run
|
|
1999
|
+
```
|
|
2000
|
+
|
|
2001
|
+
Inputs accept a single path, a quoted glob, or a comma-separated list. Writes in-place by default; `--output` accepts a file (single input) or a directory (multiple inputs).
|
|
2002
|
+
|
|
2003
|
+
Pipeline stages, each opt-in via flag presence and idempotent on already-correct input:
|
|
2004
|
+
|
|
2005
|
+
1. Rasterize SVG (only when raster ops are requested — pure resize keeps SVG)
|
|
2006
|
+
2. `--remove-bg` → two-pass background removal with gradient/solid branching (skipped when the source is already transparent)
|
|
2007
|
+
3. `--color <hex>` → alpha-preserving recolor that maps every foreground pixel to the target color while varying alpha to preserve the original tonal variation
|
|
2008
|
+
4. `--shrink-to-content` → trim transparent borders
|
|
2009
|
+
5. Resize:
|
|
2010
|
+
- `--height N` / `--width N` → preserve aspect ratio (e.g. logo row)
|
|
2011
|
+
- `--size WxH [--fit contain|cover]` → fit into a box (`contain` letterboxes to transparent, `cover` crops)
|
|
2012
|
+
|
|
2013
|
+
Success response includes the resolved `stages` array per file so the agent can verify its declaration took effect:
|
|
2014
|
+
|
|
2015
|
+
```json
|
|
2016
|
+
{
|
|
2017
|
+
"ok": true,
|
|
2018
|
+
"data": {
|
|
2019
|
+
"processed": [{
|
|
2020
|
+
"input": "logo.svg",
|
|
2021
|
+
"output": "logo.png",
|
|
2022
|
+
"format": "png",
|
|
2023
|
+
"width": 264,
|
|
2024
|
+
"height": 200,
|
|
2025
|
+
"sizeBytes": 11510,
|
|
2026
|
+
"stages": ["rasterize-svg", "recolor", "trim", "resize"]
|
|
2027
|
+
}]
|
|
2028
|
+
}
|
|
2029
|
+
}
|
|
2030
|
+
```
|
|
2031
|
+
|
|
2032
|
+
Validation errors return `VALIDATION_ERROR`:
|
|
2033
|
+
|
|
2034
|
+
- `--height`/`--width` together with `--size` (mutually exclusive)
|
|
2035
|
+
- `--fit` without `--size`
|
|
2036
|
+
- Malformed `--color` (must be `#RGB` or `#RRGGBB`)
|
|
2037
|
+
- Empty file pattern or no matches
|
|
2038
|
+
|
|
2039
|
+
### `baker images upscale <imageId>`
|
|
2040
|
+
|
|
2041
|
+
Super-resolution via the Convex backend (Replicate, cost-tracked at $0.05/image). Operates on a library image by ID — upload the file first via `baker images upload`, then upscale.
|
|
2042
|
+
|
|
2043
|
+
Waits for completion by default (polls every 1.5s, up to 2 min). Use `--max-wait 0` for fire-and-forget.
|
|
2044
|
+
|
|
2045
|
+
```bash
|
|
2046
|
+
baker images normalize logo.png --color '#FFFFFF' --remove-bg --height 100
|
|
2047
|
+
baker images upload logo.png --source uploaded
|
|
2048
|
+
# returns imageId — pass it to upscale
|
|
2049
|
+
baker images upscale j571abc123def
|
|
2050
|
+
baker images upscale j571abc123def --max-wait 0 # fire-and-forget
|
|
2051
|
+
```
|
|
2052
|
+
|
|
2053
|
+
Response on success:
|
|
2054
|
+
|
|
2055
|
+
```json
|
|
2056
|
+
{
|
|
2057
|
+
"ok": true,
|
|
2058
|
+
"data": {
|
|
2059
|
+
"imageId": "j571abc123def",
|
|
2060
|
+
"status": "completed",
|
|
2061
|
+
"image": { "_id": "...", "upscaledStorageKey": "...", "width": 400, "height": 400, ... }
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
```
|
|
2065
|
+
|
|
2066
|
+
Errors: `BAD_REQUEST` (not ready / not raster), `CONFLICT` (already upscaled / already processing), `TIMEOUT` (not complete within `--max-wait`).
|
|
2067
|
+
|
|
2068
|
+
### `baker images crop <file> --x N --y N --width N --height N`
|
|
2069
|
+
|
|
2070
|
+
Coordinate-based rectangular extract. Local file or remote URL. Writes a PNG.
|
|
2071
|
+
|
|
2072
|
+
```bash
|
|
2073
|
+
baker images crop sprite.png --x 0 --y 0 --width 64 --height 64 --output icon.png
|
|
2074
|
+
baker images crop https://example.com/sheet.png --x 128 --y 0 --width 128 --height 128 --output tile.png
|
|
2075
|
+
```
|
|
2076
|
+
|
|
2077
|
+
### `baker images dimensions <file-or-url>`
|
|
2078
|
+
|
|
2079
|
+
Width, height, aspect ratio, and format — read from the image header without full decode.
|
|
2080
|
+
|
|
2081
|
+
```bash
|
|
2082
|
+
baker images dimensions ./logo.png
|
|
2083
|
+
baker images dimensions https://acme.com/hero.png
|
|
2084
|
+
```
|
|
2085
|
+
|
|
2086
|
+
Response:
|
|
2087
|
+
|
|
2088
|
+
```json
|
|
2089
|
+
{
|
|
2090
|
+
"ok": true,
|
|
2091
|
+
"data": {
|
|
2092
|
+
"target": "./logo.png",
|
|
2093
|
+
"source": "file",
|
|
2094
|
+
"width": 553,
|
|
2095
|
+
"height": 419,
|
|
2096
|
+
"aspectRatio": 1.3198,
|
|
2097
|
+
"format": "png"
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
```
|
|
2101
|
+
|
|
1978
2102
|
### `baker videos search <query>`
|
|
1979
2103
|
|
|
1980
2104
|
Semantic search videos.
|
package/dist/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ import { videosCommand } from "./commands/videos/index.js";
|
|
|
13
13
|
const main = defineCommand({
|
|
14
14
|
meta: {
|
|
15
15
|
name: "baker",
|
|
16
|
-
version: "0.
|
|
16
|
+
version: "0.36.0",
|
|
17
17
|
description: `AI-agent CLI for finding and managing images, videos, testimonials, action items, scheduled actions, and ad platform data in Baker.
|
|
18
18
|
|
|
19
19
|
Auth: Set BAKER_API_KEY (starts with bk_) and BAKER_API_URL environment variables.
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type ErrorCode = "UNAUTHORIZED" | "NOT_FOUND" | "VALIDATION_ERROR" | "RATE_LIMITED" | "INTERNAL_ERROR" | "NETWORK_ERROR" | "TIMEOUT";
|
|
1
|
+
type ErrorCode = "UNAUTHORIZED" | "NOT_FOUND" | "VALIDATION_ERROR" | "RATE_LIMITED" | "INTERNAL_ERROR" | "NETWORK_ERROR" | "TIMEOUT" | "IMAGE_PROCESSING_ERROR";
|
|
2
2
|
export declare class ApiError extends Error {
|
|
3
3
|
code: ErrorCode;
|
|
4
4
|
constructor(code: ErrorCode, message: string);
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AA6BA,KAAK,SAAS,GACV,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AA6BA,KAAK,SAAS,GACV,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,SAAS,GACT,wBAAwB,CAAC;AAE7B,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,SAAS,CAAC;gBAEJ,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAK7C;AAqBD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIjD;AAsDD,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BzF;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBvG"}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,KAAK,UAAU,uBAAuB,CAAC,GAAW,EAAE,IAAiB;IACnE,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,sBAAsB,EAAE,OAAO,EAAE,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAExC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAAC;YACjE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC;QAExF,IAAI,WAAW,GAAG,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC7C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,WAAW,IAAI,MAAM,CAAC;QACtB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ function mapErrorCode(message) {
|
|
|
10
10
|
return "CUSTOMER_NOT_FOUND";
|
|
11
11
|
if (/login.customer.id|not.*accessible/i.test(message))
|
|
12
12
|
return "MISSING_MANAGER_ID";
|
|
13
|
-
if (/incompatible|mutually.*exclusive/i.test(message))
|
|
13
|
+
if (/incompatible|mutually.*exclusive|PROHIBITED_SEGMENT_WITH_METRIC/i.test(message))
|
|
14
14
|
return "INCOMPATIBLE_FIELDS";
|
|
15
15
|
if (/unauthenticated|authentication/i.test(message))
|
|
16
16
|
return "AUTH_ERROR";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-parser.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/error-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,0DAA0D,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACvG,IAAI,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACxF,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACvE,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACrE,IAAI,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACpF,IAAI,
|
|
1
|
+
{"version":3,"file":"error-parser.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/error-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,aAAa,CAAC;AAkD/D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,aAAa,CAAC;AAkD/D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAiHpG"}
|
|
@@ -108,6 +108,26 @@ export function validatePreflight(query, customerId, limit) {
|
|
|
108
108
|
},
|
|
109
109
|
};
|
|
110
110
|
}
|
|
111
|
+
// REJECT: conversion action segments are incompatible with cost metrics in GAQL.
|
|
112
|
+
// Split conversion-action breakdowns from spend/cost queries and join by campaign in report code.
|
|
113
|
+
if (/\bsegments\.conversion_action_name\b/i.test(corrected) && /\bmetrics\.cost_micros\b/i.test(corrected)) {
|
|
114
|
+
return {
|
|
115
|
+
valid: false,
|
|
116
|
+
warnings: [],
|
|
117
|
+
error: {
|
|
118
|
+
ok: false,
|
|
119
|
+
error: {
|
|
120
|
+
code: "INCOMPATIBLE_FIELDS",
|
|
121
|
+
message: "segments.conversion_action_name cannot be selected with metrics.cost_micros in one GAQL query.",
|
|
122
|
+
fix: {
|
|
123
|
+
action: "split_query",
|
|
124
|
+
explanation: "Run one campaign spend query with metrics.cost_micros and a separate conversion-action query without cost metrics, then join the results by campaign.",
|
|
125
|
+
},
|
|
126
|
+
retryable: false,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
111
131
|
// WARN: ad_group_criterion without negative field — positives and negatives will be mixed
|
|
112
132
|
if (/FROM\s+ad_group_criterion\b/i.test(corrected) && !/ad_group_criterion\.negative/i.test(corrected)) {
|
|
113
133
|
warnings.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ describe("validatePreflight", () => {
|
|
|
19
19
|
expect(result.error?.error.code).toBe("OPEN_ENDED_DATE");
|
|
20
20
|
expect(result.error?.error.fix.correctedCommand).toMatch(/BETWEEN/);
|
|
21
21
|
});
|
|
22
|
+
it("rejects conversion action segmentation with cost metrics", () => {
|
|
23
|
+
const result = validatePreflight("SELECT campaign.name, segments.conversion_action_name, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS", CID);
|
|
24
|
+
expect(result.valid).toBe(false);
|
|
25
|
+
expect(result.error?.error.code).toBe("INCOMPATIBLE_FIELDS");
|
|
26
|
+
expect(result.error?.error.fix.action).toBe("split_query");
|
|
27
|
+
});
|
|
22
28
|
it("auto-fixes keyword.text to ad_group_criterion.keyword.text", () => {
|
|
23
29
|
const result = validatePreflight("SELECT keyword.text FROM keyword_view", CID);
|
|
24
30
|
expect(result.valid).toBe(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.test.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preflight.test.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/preflight.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const cropCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly file: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Local file path or remote http(s) URL";
|
|
5
|
+
readonly required: false;
|
|
6
|
+
};
|
|
7
|
+
readonly x: {
|
|
8
|
+
readonly type: "string";
|
|
9
|
+
readonly description: "Left coordinate (px)";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
};
|
|
12
|
+
readonly y: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "Top coordinate (px)";
|
|
15
|
+
readonly required: false;
|
|
16
|
+
};
|
|
17
|
+
readonly width: {
|
|
18
|
+
readonly type: "string";
|
|
19
|
+
readonly description: "Region width (px)";
|
|
20
|
+
readonly required: false;
|
|
21
|
+
};
|
|
22
|
+
readonly height: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "Region height (px)";
|
|
25
|
+
readonly required: false;
|
|
26
|
+
};
|
|
27
|
+
readonly output: {
|
|
28
|
+
readonly type: "string";
|
|
29
|
+
readonly description: "Output path";
|
|
30
|
+
readonly required: false;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=crop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crop.d.ts","sourceRoot":"","sources":["../../../src/commands/images/crop.ts"],"names":[],"mappings":"AA+DA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCtB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { cropSprite } from "../../lib/image/crop-sprite.js";
|
|
3
|
+
import { atomicWrite, isRemoteUrl, readImageBuffer, resolveOutputPath } from "../../lib/image/io.js";
|
|
4
|
+
import { writeJson } from "../../output.js";
|
|
5
|
+
import { registerSchema } from "../../schemas.js";
|
|
6
|
+
registerSchema({
|
|
7
|
+
command: "images.crop",
|
|
8
|
+
description: "Crop a rectangular region from a local image or remote URL. Coordinate-based extract.",
|
|
9
|
+
args: {
|
|
10
|
+
file: { type: "string", description: "Local file path or remote http(s) URL", required: true },
|
|
11
|
+
x: { type: "number", description: "Left coordinate (px)", required: true },
|
|
12
|
+
y: { type: "number", description: "Top coordinate (px)", required: true },
|
|
13
|
+
width: { type: "number", description: "Region width (px)", required: true },
|
|
14
|
+
height: { type: "number", description: "Region height (px)", required: true },
|
|
15
|
+
output: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Output path. Default: in-place for local files, ./crop.png for URLs.",
|
|
18
|
+
required: false,
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
class ValidationError extends Error {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "ValidationError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function parseRegion(args) {
|
|
29
|
+
const result = { x: 0, y: 0, width: 0, height: 0 };
|
|
30
|
+
for (const key of ["x", "y", "width", "height"]) {
|
|
31
|
+
const raw = args[key];
|
|
32
|
+
const n = typeof raw === "number" ? raw : raw !== undefined && raw !== "" ? Number(raw) : Number.NaN;
|
|
33
|
+
if (!Number.isFinite(n) || n < 0) {
|
|
34
|
+
throw new ValidationError(`--${key} must be a non-negative number`);
|
|
35
|
+
}
|
|
36
|
+
result[key] = n;
|
|
37
|
+
}
|
|
38
|
+
if (result.width === 0 || result.height === 0) {
|
|
39
|
+
throw new ValidationError("--width and --height must be > 0");
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
function emitError(err) {
|
|
44
|
+
if (err instanceof ValidationError) {
|
|
45
|
+
writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message: err.message } });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const message = err instanceof Error ? err.message : "Unexpected error";
|
|
49
|
+
writeJson({ ok: false, error: { code: "IMAGE_PROCESSING_ERROR", message } });
|
|
50
|
+
}
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
export const cropCommand = defineCommand({
|
|
54
|
+
meta: {
|
|
55
|
+
name: "crop",
|
|
56
|
+
description: "Crop a rectangular region from an image.\n\nExample: baker images crop sprite.png --x 0 --y 0 --width 64 --height 64 --output icon.png",
|
|
57
|
+
},
|
|
58
|
+
args: {
|
|
59
|
+
file: { type: "positional", description: "Local file path or remote http(s) URL", required: false },
|
|
60
|
+
x: { type: "string", description: "Left coordinate (px)", required: false },
|
|
61
|
+
y: { type: "string", description: "Top coordinate (px)", required: false },
|
|
62
|
+
width: { type: "string", description: "Region width (px)", required: false },
|
|
63
|
+
height: { type: "string", description: "Region height (px)", required: false },
|
|
64
|
+
output: { type: "string", description: "Output path", required: false },
|
|
65
|
+
},
|
|
66
|
+
run: async ({ args }) => {
|
|
67
|
+
try {
|
|
68
|
+
const file = args.file;
|
|
69
|
+
if (!file) {
|
|
70
|
+
throw new ValidationError("file argument is required");
|
|
71
|
+
}
|
|
72
|
+
const region = parseRegion(args);
|
|
73
|
+
const outputArg = typeof args.output === "string" && args.output.length > 0 ? args.output : undefined;
|
|
74
|
+
const inputBuffer = await readImageBuffer(file);
|
|
75
|
+
const output = await cropSprite(inputBuffer, region);
|
|
76
|
+
const outputPath = isRemoteUrl(file)
|
|
77
|
+
? (outputArg ?? "./crop.png")
|
|
78
|
+
: await resolveOutputPath(file, outputArg, { multipleInputs: false, newExtension: ".png" });
|
|
79
|
+
await atomicWrite(outputPath, output);
|
|
80
|
+
writeJson({
|
|
81
|
+
ok: true,
|
|
82
|
+
data: { input: file, output: outputPath, sizeBytes: output.length, region },
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
emitError(err);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=crop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crop.js","sourceRoot":"","sources":["../../../src/commands/images/crop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,cAAc,CAAC;IACb,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,uFAAuF;IACpG,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC9F,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1E,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7E,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sEAAsE;YACnF,QAAQ,EAAE,KAAK;SAChB;KACF;CACF,CAAC,CAAC;AASH,MAAM,eAAgB,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,SAAS,WAAW,CAAC,IAA6B;IAChD,MAAM,MAAM,GAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACrG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,eAAe,CAAC,KAAK,GAAG,gCAAgC,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;QACnC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACxE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,wIAAwI;KAC3I;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,KAAK,EAAE;QACnG,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3E,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC5E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC9E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;KACxE;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAEtG,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC;gBAClC,CAAC,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC;gBAC7B,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;YAE9F,MAAM,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACtC,SAAS,CAAC;gBACR,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE;aAC5E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const dimensionsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly target: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Local file path or remote http(s) URL";
|
|
5
|
+
readonly required: false;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../../../src/commands/images/dimensions.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,iBAAiB;;;;;;EA2C5B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { getDimensionsFromBuffer } from "../../lib/image/dimensions.js";
|
|
3
|
+
import { isRemoteUrl, readImageBuffer } from "../../lib/image/io.js";
|
|
4
|
+
import { writeJson } from "../../output.js";
|
|
5
|
+
import { registerSchema } from "../../schemas.js";
|
|
6
|
+
registerSchema({
|
|
7
|
+
command: "images.dimensions",
|
|
8
|
+
description: "Return width, height, aspect ratio, and format for a local file or remote URL.",
|
|
9
|
+
args: {
|
|
10
|
+
target: { type: "string", description: "Local file path or remote http(s) URL", required: true },
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
export const dimensionsCommand = defineCommand({
|
|
14
|
+
meta: {
|
|
15
|
+
name: "dimensions",
|
|
16
|
+
description: "Read image dimensions without decoding the full file.\n\nExample: baker images dimensions ./logo.png\nExample: baker images dimensions https://acme.com/hero.png",
|
|
17
|
+
},
|
|
18
|
+
args: {
|
|
19
|
+
target: { type: "positional", description: "Local file path or remote http(s) URL", required: false },
|
|
20
|
+
},
|
|
21
|
+
run: async ({ args }) => {
|
|
22
|
+
try {
|
|
23
|
+
const target = args.target;
|
|
24
|
+
if (!target) {
|
|
25
|
+
writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message: "target argument is required" } });
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const buffer = await readImageBuffer(target);
|
|
29
|
+
const dims = getDimensionsFromBuffer(buffer);
|
|
30
|
+
if (!dims) {
|
|
31
|
+
writeJson({
|
|
32
|
+
ok: false,
|
|
33
|
+
error: { code: "IMAGE_PROCESSING_ERROR", message: `Could not extract dimensions from ${target}` },
|
|
34
|
+
});
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
writeJson({
|
|
38
|
+
ok: true,
|
|
39
|
+
data: {
|
|
40
|
+
target,
|
|
41
|
+
source: isRemoteUrl(target) ? "url" : "file",
|
|
42
|
+
width: dims.width,
|
|
43
|
+
height: dims.height,
|
|
44
|
+
aspectRatio: Math.round(dims.aspectRatio * 10000) / 10000,
|
|
45
|
+
format: dims.format,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const message = err instanceof Error ? err.message : "Unexpected error";
|
|
51
|
+
writeJson({ ok: false, error: { code: "IMAGE_PROCESSING_ERROR", message } });
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimensions.js","sourceRoot":"","sources":["../../../src/commands/images/dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,cAAc,CAAC;IACb,OAAO,EAAE,mBAAmB;IAC5B,WAAW,EAAE,gFAAgF;IAC7F,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjG;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;IAC7C,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,kKAAkK;KACrK;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,KAAK,EAAE;KACtG;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;YACjD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;gBACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS,CAAC;oBACR,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,qCAAqC,MAAM,EAAE,EAAE;iBAClG,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,SAAS,CAAC;gBACR,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE;oBACJ,MAAM;oBACN,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;oBAC5C,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK;oBACzD,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACxE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/images/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/images/index.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,aAAa,qDA0DxB,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
|
+
import { cropCommand } from "./crop.js";
|
|
2
3
|
import { deleteCommand } from "./delete.js";
|
|
4
|
+
import { dimensionsCommand } from "./dimensions.js";
|
|
3
5
|
import { extractCommand } from "./extract.js";
|
|
4
6
|
import { findCommand } from "./find.js";
|
|
5
7
|
import { getCommand } from "./get.js";
|
|
@@ -9,16 +11,18 @@ import { iconCommand } from "./icon.js";
|
|
|
9
11
|
import { ingestCommand } from "./ingest.js";
|
|
10
12
|
import { libraryCommand } from "./library.js";
|
|
11
13
|
import { logoCommand } from "./logo.js";
|
|
14
|
+
import { normalizeCommand } from "./normalize.js";
|
|
12
15
|
import { screenshotCommand } from "./screenshot.js";
|
|
13
16
|
import { searchCommand } from "./search.js";
|
|
14
17
|
import { stickerCommand } from "./sticker.js";
|
|
15
18
|
import { stockCommand } from "./stock.js";
|
|
16
19
|
import { uploadCommand } from "./upload.js";
|
|
20
|
+
import { upscaleCommand } from "./upscale.js";
|
|
17
21
|
import { useCommand } from "./use.js";
|
|
18
22
|
export const imagesCommand = defineCommand({
|
|
19
23
|
meta: {
|
|
20
24
|
name: "images",
|
|
21
|
-
description: `Find and
|
|
25
|
+
description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
|
|
22
26
|
|
|
23
27
|
Library + search:
|
|
24
28
|
baker images library <q> Search the company library (replaces search)
|
|
@@ -39,7 +43,17 @@ Ingest + management:
|
|
|
39
43
|
baker images use <url> Ingest and wait for ready
|
|
40
44
|
baker images upload ./file Upload local file
|
|
41
45
|
baker images get <id> Get a single record
|
|
42
|
-
baker images delete <id> Delete a record
|
|
46
|
+
baker images delete <id> Delete a record
|
|
47
|
+
|
|
48
|
+
Local transforms (operate on files in the sandbox, before upload):
|
|
49
|
+
baker images normalize <files> [--color …] [--remove-bg] [--height N | --width N | --size WxH]
|
|
50
|
+
Declarative recolor + bg removal + trim + resize
|
|
51
|
+
baker images crop <file> --x N --y N --width N --height N
|
|
52
|
+
Coordinate-based rectangular extract
|
|
53
|
+
baker images dimensions <file-or-url> Width / height / aspect / format without decoding the full image
|
|
54
|
+
|
|
55
|
+
Paid transforms (run on the Convex backend, cost-tracked):
|
|
56
|
+
baker images upscale <imageId> Real-ESRGAN super-resolution ($0.05/image, waits for completion)`,
|
|
43
57
|
},
|
|
44
58
|
subCommands: {
|
|
45
59
|
get: getCommand,
|
|
@@ -58,6 +72,10 @@ Ingest + management:
|
|
|
58
72
|
search: searchCommand,
|
|
59
73
|
upload: uploadCommand,
|
|
60
74
|
delete: deleteCommand,
|
|
75
|
+
normalize: normalizeCommand,
|
|
76
|
+
crop: cropCommand,
|
|
77
|
+
dimensions: dimensionsCommand,
|
|
78
|
+
upscale: upscaleCommand,
|
|
61
79
|
},
|
|
62
80
|
});
|
|
63
81
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/images/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/images/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wHA+BuG;KACrH;IACD,WAAW,EAAE;QACX,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,cAAc;QACvB,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,aAAa;QACrB,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,cAAc;KACxB;CACF,CAAC,CAAC"}
|