@meterapp/car-image 1.0.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/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/agent-config.js +104 -0
- package/dist/agent-config.js.map +1 -0
- package/dist/args.js +145 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agents.js +38 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/billing.js +41 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/catalog.js +169 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/describe.js +52 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/doctor.js +53 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.js +58 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/images.js +168 -0
- package/dist/commands/images.js.map +1 -0
- package/dist/commands/index.js +44 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/login.js +64 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/maintenance.js +156 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/onboard.js +42 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/whoami.js +41 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/describe.js +226 -0
- package/dist/describe.js.map +1 -0
- package/dist/device-login.js +42 -0
- package/dist/device-login.js.map +1 -0
- package/dist/doctor.js +280 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -0
- package/dist/main.js +170 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.js +149 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/output.js +90 -0
- package/dist/output.js.map +1 -0
- package/dist/prompts.js +29 -0
- package/dist/prompts.js.map +1 -0
- package/dist/telemetry.js +50 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/update.js +142 -0
- package/dist/update.js.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { COLORS, VIEWS } from "@meterapp/car-image-sdk";
|
|
2
|
+
import { flagChoice, flagInteger, flagString } from "../args.js";
|
|
3
|
+
import { CliError } from "../errors.js";
|
|
4
|
+
import { cliCommandFor } from "../mcp/server.js";
|
|
5
|
+
import { keyValues, paint, printJson, table } from "../output.js";
|
|
6
|
+
function yearsLabel(years) {
|
|
7
|
+
if (!years || years.length === 0)
|
|
8
|
+
return "—";
|
|
9
|
+
const min = Math.min(...years);
|
|
10
|
+
const max = Math.max(...years);
|
|
11
|
+
return min === max ? String(min) : `${min}–${max}`;
|
|
12
|
+
}
|
|
13
|
+
export const searchCommand = {
|
|
14
|
+
name: "search",
|
|
15
|
+
summary: "Fuzzy-search the vehicle catalog (free, no key needed)",
|
|
16
|
+
usage: "car-image search <query…> [--limit 10] [--year <year>] [--json]",
|
|
17
|
+
async run(ctx) {
|
|
18
|
+
const query = ctx.args.positionals.join(" ").trim();
|
|
19
|
+
if (!query)
|
|
20
|
+
throw new CliError("Missing search query", 2, "Example: car-image search porsche 911");
|
|
21
|
+
const limit = flagInteger(ctx.args.flags, "limit", { min: 1, max: 100 });
|
|
22
|
+
const year = flagInteger(ctx.args.flags, "year", { min: 1900, max: 2100 });
|
|
23
|
+
const result = await ctx.clientContext.client.searchVehicles(query, { limit, year });
|
|
24
|
+
if (ctx.io.json) {
|
|
25
|
+
printJson(ctx.io, result);
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
const results = result.data.results;
|
|
29
|
+
if (results.length === 0) {
|
|
30
|
+
ctx.io.stdout(`No catalog matches for "${query}". Try fewer words or a different spelling.\n`);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
const rows = results.map((hit) => {
|
|
34
|
+
const view = searchHitView(hit);
|
|
35
|
+
return [view.kind, view.make, view.model ?? paint(ctx.io, "dim", "(make)"), yearsLabel(view.years), view.match, view.type];
|
|
36
|
+
});
|
|
37
|
+
ctx.io.stdout(`${table(rows, ["kind", "make", "model", "years", "match", "type"])}\n`);
|
|
38
|
+
const first = results.map(searchHitView).find((hit) => hit.kind === "model" && hit.model);
|
|
39
|
+
if (first?.model) {
|
|
40
|
+
const year = first.years?.length ? Math.max(...first.years) : new Date().getFullYear();
|
|
41
|
+
ctx.io.stdout(`\n${paint(ctx.io, "dim", `Try: ${cliCommandFor({ make: first.make, model: first.model, year })}`)}\n`);
|
|
42
|
+
}
|
|
43
|
+
return 0;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
export const resolveCommand = {
|
|
47
|
+
name: "resolve",
|
|
48
|
+
summary: "Turn free text into exact image parameters and a ready-to-run command",
|
|
49
|
+
usage: "car-image resolve <free text…> [--json]\n e.g. car-image resolve red 2024 porsche 911 side view",
|
|
50
|
+
async run(ctx) {
|
|
51
|
+
const query = ctx.args.positionals.join(" ").trim();
|
|
52
|
+
if (!query)
|
|
53
|
+
throw new CliError("Missing text to resolve", 2, "Example: car-image resolve red 2024 porsche 911 side view");
|
|
54
|
+
if (!ctx.clientContext.apiKey)
|
|
55
|
+
throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
|
|
56
|
+
const result = await ctx.clientContext.client.resolve(query);
|
|
57
|
+
const params = result.data.params;
|
|
58
|
+
const command = cliCommandFor(params);
|
|
59
|
+
if (ctx.io.json) {
|
|
60
|
+
printJson(ctx.io, { ...result, cli: command });
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
const rows = [
|
|
64
|
+
["make", params.make],
|
|
65
|
+
["model", params.model],
|
|
66
|
+
["year", String(params.year)],
|
|
67
|
+
["view", params.view],
|
|
68
|
+
["color", params.color],
|
|
69
|
+
];
|
|
70
|
+
if (params.size)
|
|
71
|
+
rows.push(["size", params.size]);
|
|
72
|
+
if (params.width)
|
|
73
|
+
rows.push(["width", String(params.width)]);
|
|
74
|
+
if (params.format)
|
|
75
|
+
rows.push(["format", params.format]);
|
|
76
|
+
rows.push(["confidence", String(result.data.confidence)]);
|
|
77
|
+
ctx.io.stdout(`${keyValues(ctx.io, rows)}\n\nRun:\n ${command}\n`);
|
|
78
|
+
const candidates = result.data.candidates ?? [];
|
|
79
|
+
if (candidates.length > 1) {
|
|
80
|
+
const alternatives = candidates.slice(0, 6).map((candidate) => [
|
|
81
|
+
String(candidate.make_name ?? candidate.make_slug ?? ""),
|
|
82
|
+
String(candidate.model_name ?? candidate.model_slug ?? ""),
|
|
83
|
+
yearsLabel(Array.isArray(candidate.years) ? candidate.years.map(Number) : undefined),
|
|
84
|
+
String(candidate.match_kind ?? ""),
|
|
85
|
+
]);
|
|
86
|
+
ctx.io.stdout(`\nOther candidates:\n${table(alternatives, ["make", "model", "years", "match"])}\n`);
|
|
87
|
+
}
|
|
88
|
+
return 0;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
export const optionsCommand = {
|
|
92
|
+
name: "options",
|
|
93
|
+
summary: "List views, colors, sizes, formats, pricing and catalog coverage",
|
|
94
|
+
usage: "car-image options [--json]",
|
|
95
|
+
async run(ctx) {
|
|
96
|
+
const result = await ctx.clientContext.client.options();
|
|
97
|
+
if (ctx.io.json) {
|
|
98
|
+
printJson(ctx.io, result);
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
const { data } = result;
|
|
102
|
+
const io = ctx.io;
|
|
103
|
+
io.stdout(`${paint(io, "bold", "Views")}\n${table(data.views.map((view) => [view.id, `${view.yaw_degrees}°`, view.label, view.description, view.aliases.length ? `aliases: ${view.aliases.join(", ")}` : ""]), ["id", "yaw", "label", "description", ""])}\n\n`);
|
|
104
|
+
io.stdout(`${paint(io, "bold", "Colors")}\n${table(data.colors.map((color) => [color.name, color.hex]), ["name", "hex"])}\n\n`);
|
|
105
|
+
io.stdout(`${paint(io, "bold", "Sizes")}\n${table(Object.entries(data.sizes.presets).map(([name, px]) => [name, `${px} px`]).concat([["max", `${data.sizes.max} px (use --width/--height for exact sizes)`]]), ["preset", "size"])}\n\n`);
|
|
106
|
+
io.stdout(`${paint(io, "bold", "Formats")} ${data.formats.join(", ")} (png keeps transparency)\n\n`);
|
|
107
|
+
io.stdout(`${paint(io, "bold", "Pricing")} ${data.pricing.credits_per_image} credit per image · $1 = ${data.pricing.credits_per_dollar.toLocaleString("en-US")} credits · ${data.pricing.free_credits} free credits · no subscription\n`);
|
|
108
|
+
io.stdout(`${paint(io, "bold", "Catalog")} ${data.catalog.makes.toLocaleString("en-US")} makes, ${data.catalog.models.toLocaleString("en-US")} models, ${data.catalog.years[0]}–${data.catalog.years[1]}${data.catalog.sources?.length ? ` · sources: ${data.catalog.sources.join(", ")}` : ""}\n`);
|
|
109
|
+
return 0;
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
export const feedbackCommand = {
|
|
113
|
+
name: "feedback",
|
|
114
|
+
summary: "Rate a delivered image (by request id or by vehicle) to improve renders",
|
|
115
|
+
usage: "car-image feedback (--request-id <id> | --make <make> --model <model> --year <year> [--view] [--color])\n (--rating 1-5 | --good | --bad) [--reason <text>] [--json]",
|
|
116
|
+
async run(ctx) {
|
|
117
|
+
const { flags } = ctx.args;
|
|
118
|
+
if (!ctx.clientContext.apiKey)
|
|
119
|
+
throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
|
|
120
|
+
const rating = flagInteger(flags, "rating", { min: 1, max: 5 });
|
|
121
|
+
const verdict = flags.good === true ? "good" : flags.bad === true ? "bad" : undefined;
|
|
122
|
+
if (flags.good === true && flags.bad === true)
|
|
123
|
+
throw new CliError("Choose either --good or --bad", 2);
|
|
124
|
+
if (rating === undefined && verdict === undefined)
|
|
125
|
+
throw new CliError("Provide --rating 1-5, --good or --bad", 2);
|
|
126
|
+
const reason = flagString(flags, "reason");
|
|
127
|
+
const requestId = flagString(flags, "request-id");
|
|
128
|
+
const base = { rating, verdict, reason };
|
|
129
|
+
const result = requestId
|
|
130
|
+
? await ctx.clientContext.client.feedback({ requestId, ...base })
|
|
131
|
+
: await (async () => {
|
|
132
|
+
const make = flagString(flags, "make");
|
|
133
|
+
const model = flagString(flags, "model");
|
|
134
|
+
const year = flagString(flags, "year");
|
|
135
|
+
if (!make || !model || !year)
|
|
136
|
+
throw new CliError("Identify the image with --request-id or with --make, --model and --year", 2);
|
|
137
|
+
const view = flagChoice(flags, "view", VIEWS);
|
|
138
|
+
const color = flagChoice(flags, "color", COLORS);
|
|
139
|
+
return ctx.clientContext.client.feedback({ make, model, year, view, color, ...base });
|
|
140
|
+
})();
|
|
141
|
+
if (ctx.io.json) {
|
|
142
|
+
printJson(ctx.io, result);
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
ctx.io.stdout(`Thanks — feedback recorded (${verdict ?? `rating ${rating}`}${reason ? `: ${reason}` : ""}). request ${result.request_id}\n`);
|
|
146
|
+
return 0;
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
/** Search hits may arrive camelCase (catalog lib) or snake_case (REST); normalize for display. */
|
|
150
|
+
export function searchHitView(hit) {
|
|
151
|
+
const pick = (...keys) => {
|
|
152
|
+
for (const key of keys) {
|
|
153
|
+
const value = hit[key];
|
|
154
|
+
if (typeof value === "string" && value)
|
|
155
|
+
return value;
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
};
|
|
159
|
+
const years = Array.isArray(hit.years) ? hit.years.map(Number).filter(Number.isFinite) : undefined;
|
|
160
|
+
return {
|
|
161
|
+
kind: pick("kind") ?? "model",
|
|
162
|
+
make: pick("makeName", "make_name", "make") ?? "",
|
|
163
|
+
model: pick("modelName", "model_name", "model"),
|
|
164
|
+
years,
|
|
165
|
+
match: pick("matchKind", "match_kind", "match") ?? "",
|
|
166
|
+
type: pick("vehicleType", "vehicle_type", "type") ?? "",
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAElE,SAAS,UAAU,CAAC,KAA2B;IAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,wDAAwD;IACjE,KAAK,EAAE,iEAAiE;IACxE,KAAK,CAAC,GAAG,CAAC,GAAmB;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,CAAC,EAAE,uCAAuC,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,2BAA2B,KAAK,+CAA+C,CAAC,CAAC;YAC/F,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7H,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1F,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACvF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACxH,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,uEAAuE;IAChF,KAAK,EAAE,kGAAkG;IACzG,KAAK,CAAC,GAAG,CAAC,GAAmB;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,CAAC,EAAE,2DAA2D,CAAC,CAAC;QAC1H,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAA4B;YACpC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;SACxB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1D,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC7D,MAAM,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC1D,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpF,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC;aACnC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wBAAwB,KAAK,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,kEAAkE;IAC3E,KAAK,EAAE,4BAA4B;IACnC,KAAK,CAAC,GAAG,CAAC,GAAmB;QAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACxD,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACxB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QAClB,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,CAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3J,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,CAC1C,MAAM,CAAC,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QAChI,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,CAC/C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,4CAA4C,CAAC,CAAC,CAAC,EAC3J,CAAC,QAAQ,EAAE,MAAM,CAAC,CACnB,MAAM,CAAC,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtG,EAAE,CAAC,MAAM,CACP,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,iBAAiB,4BAA4B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,YAAY,mCAAmC,CAChO,CAAC;QACF,EAAE,CAAC,MAAM,CACP,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAC1R,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,yEAAyE;IAClF,KAAK,EACH,wLAAwL;IAC1L,KAAK,CAAC,GAAG,CAAC,GAAmB;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM;YAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,iDAAiD,CAAC,CAAC;QAC1H,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAkC,CAAC;QACjG,MAAM,OAAO,GAA+B,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAClH,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI;YAAE,MAAM,IAAI,QAAQ,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;QACtG,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,uCAAuC,EAAE,CAAC,CAAC,CAAC;QAClH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,SAAS;YACtB,CAAC,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;YACjE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,QAAQ,CAAC,yEAAyE,EAAE,CAAC,CAAC,CAAC;gBAC/H,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACxF,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+BAA+B,OAAO,IAAI,UAAU,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QAC7I,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAC;AAEF,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,GAA4B;IACxD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAc,EAAsB,EAAE;QACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QACvD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO;QAC7B,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;QACjD,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC;QAC/C,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE;QACrD,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { formatApiReference } from "@meterapp/car-image-sdk/mcp";
|
|
2
|
+
import { findEndpoints, formatAll, formatEndpoint, formatEndpointList } from "../describe.js";
|
|
3
|
+
import { printJson, warn } from "../output.js";
|
|
4
|
+
export const describeCommand = {
|
|
5
|
+
name: "describe",
|
|
6
|
+
summary: "Explain the REST API from /openapi.json (endpoints, params, headers, errors, agent notes)",
|
|
7
|
+
usage: "car-image describe [<operationId>|<path>|all] [--json]\n e.g. car-image describe getCarImage · car-image describe /api/v1/image-urls · car-image describe all",
|
|
8
|
+
async run(ctx) {
|
|
9
|
+
const { io, clientContext } = ctx;
|
|
10
|
+
const target = ctx.args.positionals.join(" ").trim();
|
|
11
|
+
let doc;
|
|
12
|
+
try {
|
|
13
|
+
doc = await clientContext.client.openapi();
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (io.json)
|
|
17
|
+
throw error;
|
|
18
|
+
io.stderr(`${warn(io, `Could not fetch ${clientContext.baseUrl}/openapi.json (${error instanceof Error ? error.message : String(error)}); showing the built-in reference.`)}\n\n`);
|
|
19
|
+
io.stdout(`${formatApiReference(target && target !== "all" ? target : undefined)}\n`);
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
if (!target) {
|
|
23
|
+
if (io.json) {
|
|
24
|
+
printJson(io, findEndpoints(doc, "all").map(({ method, path, operationId, summary }) => ({ method, path, operationId, summary })));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
io.stdout(`${formatEndpointList(doc)}\n`);
|
|
28
|
+
}
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
if (target === "all") {
|
|
32
|
+
if (io.json)
|
|
33
|
+
printJson(io, doc);
|
|
34
|
+
else
|
|
35
|
+
io.stdout(`${formatAll(doc)}\n`);
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
const matches = findEndpoints(doc, target);
|
|
39
|
+
if (matches.length === 0) {
|
|
40
|
+
io.stderr(`No endpoint matches "${target}".\n\n`);
|
|
41
|
+
io.stdout(`${formatEndpointList(doc)}\n`);
|
|
42
|
+
return 1;
|
|
43
|
+
}
|
|
44
|
+
if (io.json) {
|
|
45
|
+
printJson(io, matches.map(({ method, path, operationId, operation }) => ({ method, path, operationId, operation })));
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
io.stdout(`${matches.map((endpoint) => formatEndpoint(doc, endpoint)).join("\n\n")}\n`);
|
|
49
|
+
return 0;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { doctorSummary, renderDoctorTable, runDoctor } from "../doctor.js";
|
|
2
|
+
import { fail, ok, paint, printJson } from "../output.js";
|
|
3
|
+
import { confirm } from "../prompts.js";
|
|
4
|
+
import { simpleEvent } from "../telemetry.js";
|
|
5
|
+
/** Shared by `doctor` and onboarding. Returns the exit code. */
|
|
6
|
+
export async function runDoctorCommand(ctx, options = {}) {
|
|
7
|
+
const { io, clientContext } = ctx;
|
|
8
|
+
const yes = ctx.args.flags.yes === true;
|
|
9
|
+
const noImage = ctx.args.flags.image === false || options.quick === true;
|
|
10
|
+
let includeImage = false;
|
|
11
|
+
if (!noImage && clientContext.apiKey) {
|
|
12
|
+
includeImage = yes ? true : await confirm(io, "Also fetch one keyed image to test GET /api/v1/images/car? Costs 1 credit.", false);
|
|
13
|
+
}
|
|
14
|
+
if (!io.json && !io.quiet) {
|
|
15
|
+
io.stderr(`Checking ${clientContext.baseUrl}${options.quick ? " (quick: no paid checks)" : ""}…\n`);
|
|
16
|
+
}
|
|
17
|
+
const checks = await runDoctor({
|
|
18
|
+
client: clientContext.client,
|
|
19
|
+
publicFetch: (url, init) => fetch(url, { ...init, headers: { ...init?.headers, "User-Agent": clientContext.userAgent } }),
|
|
20
|
+
hasKey: Boolean(clientContext.apiKey),
|
|
21
|
+
now: () => Date.now(),
|
|
22
|
+
includeImage,
|
|
23
|
+
quick: options.quick === true,
|
|
24
|
+
onCheck: (check) => {
|
|
25
|
+
if (io.json || io.quiet || !io.isTTY)
|
|
26
|
+
return;
|
|
27
|
+
const mark = check.status === "pass" ? paint(io, "green", "✓") : check.status === "fail" ? paint(io, "red", "✗") : paint(io, "dim", "·");
|
|
28
|
+
io.stderr(`${mark} ${check.name}${check.latencyMs !== null ? paint(io, "dim", ` ${check.latencyMs} ms`) : ""}\n`);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const summary = doctorSummary(checks);
|
|
32
|
+
if (ctx.telemetry.enabled && ctx.telemetry.anonymousId) {
|
|
33
|
+
ctx.emit(simpleEvent(ctx.telemetry.anonymousId, "cli_doctor", { passed: summary.passed, failed: summary.failed, skipped: summary.skipped, quick: options.quick === true }));
|
|
34
|
+
}
|
|
35
|
+
if (io.json) {
|
|
36
|
+
printJson(io, { ok: summary.ok, base_url: clientContext.baseUrl, summary, checks });
|
|
37
|
+
return summary.ok ? 0 : 1;
|
|
38
|
+
}
|
|
39
|
+
if (io.isTTY && !io.quiet)
|
|
40
|
+
io.stderr("\n");
|
|
41
|
+
io.stdout(`${renderDoctorTable(checks, io)}\n\n`);
|
|
42
|
+
const spent = checks.reduce((total, check) => total + (check.credits ?? 0), 0);
|
|
43
|
+
const line = `${summary.passed} passed, ${summary.failed} failed, ${summary.skipped} skipped · ${spent} credit${spent === 1 ? "" : "s"} spent`;
|
|
44
|
+
io.stdout(summary.ok ? `${ok(io, line)}\n` : `${fail(io, line)}\n`);
|
|
45
|
+
return summary.ok ? 0 : 1;
|
|
46
|
+
}
|
|
47
|
+
export const doctorCommand = {
|
|
48
|
+
name: "doctor",
|
|
49
|
+
summary: "Smoke-test every endpoint with your key (spends up to 2 credits; exit 1 on failure)",
|
|
50
|
+
usage: "car-image doctor [--json] [--yes] [--no-image]\n --yes fetch one keyed image without asking (1 credit)\n --no-image skip the keyed image fetch",
|
|
51
|
+
run: (ctx) => runDoctorCommand(ctx),
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BIN_NAME, CLI_VERSION, PACKAGE_NAME } from "../version.js";
|
|
2
|
+
export function helpText(entries, command) {
|
|
3
|
+
if (command) {
|
|
4
|
+
const entry = entries.find((candidate) => candidate.name === command);
|
|
5
|
+
if (entry) {
|
|
6
|
+
return `${BIN_NAME} ${entry.name} — ${entry.summary}\n\nUsage:\n ${entry.usage.split("\n").join("\n ")}\n\nGlobal options: --json --quiet --base-url <url> --api-key <key> --no-color -h/--help -v/--version\n`;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const width = Math.max(...entries.map((entry) => entry.name.length));
|
|
10
|
+
const commands = entries.map((entry) => ` ${entry.name.padEnd(width)} ${entry.summary}`).join("\n");
|
|
11
|
+
return `${BIN_NAME} ${CLI_VERSION} — Car Image API by Meter (${PACKAGE_NAME})
|
|
12
|
+
Studio-quality, transparent-background renders of any vehicle. 1 credit per image, $1 = 1,000 credits, 100 free.
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
${BIN_NAME} interactive onboarding (login, account, quick check)
|
|
16
|
+
${BIN_NAME} <command> [options]
|
|
17
|
+
|
|
18
|
+
Commands:
|
|
19
|
+
${commands}
|
|
20
|
+
|
|
21
|
+
Global options:
|
|
22
|
+
--json machine-readable output on stdout
|
|
23
|
+
--quiet, -q only errors and essential output
|
|
24
|
+
--base-url <url> API origin (default https://car-imgs.vercel.app; env CAR_IMAGE_API_URL)
|
|
25
|
+
--api-key <key> override the stored key for this run (env CAR_IMAGE_API_KEY)
|
|
26
|
+
--no-color disable colors (env NO_COLOR)
|
|
27
|
+
-h, --help show help (also \`${BIN_NAME} <command> --help\`)
|
|
28
|
+
-v, --version print the version
|
|
29
|
+
|
|
30
|
+
Environment:
|
|
31
|
+
CAR_IMAGE_API_KEY API key (takes priority over the saved credential)
|
|
32
|
+
CAR_IMAGE_API_URL API origin
|
|
33
|
+
CAR_IMAGE_CONFIG path to config.json (default $XDG_CONFIG_HOME/car-image-api/config.json)
|
|
34
|
+
CAR_IMAGE_TELEMETRY set to 0 to disable anonymous usage events
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
${BIN_NAME} login
|
|
38
|
+
${BIN_NAME} get --make Porsche --model 911 --year 2024 --view side --color red --out porsche.png
|
|
39
|
+
${BIN_NAME} url --make BMW --model M3 --year 2022 --ttl 86400
|
|
40
|
+
${BIN_NAME} resolve red 2024 porsche 911 side view
|
|
41
|
+
${BIN_NAME} agent-config --host claude-code
|
|
42
|
+
${BIN_NAME} doctor --yes
|
|
43
|
+
|
|
44
|
+
Exit codes: 0 ok, 1 failure, 2 usage error. Docs: https://car-imgs.vercel.app/docs
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
export function helpCommand(entries) {
|
|
48
|
+
return {
|
|
49
|
+
name: "help",
|
|
50
|
+
summary: "Show help for all commands or one command",
|
|
51
|
+
usage: "car-image help [command]",
|
|
52
|
+
async run(ctx) {
|
|
53
|
+
ctx.io.stdout(helpText(entries(), ctx.args.positionals[0] ?? null));
|
|
54
|
+
return 0;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQpE,MAAM,UAAU,QAAQ,CAAC,OAAoB,EAAE,OAAuB;IACpE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACtE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,GAAG,QAAQ,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,iBAAiB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yGAAyG,CAAC;QACpN,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,OAAO,GAAG,QAAQ,IAAI,WAAW,8BAA8B,YAAY;;;;IAIzE,QAAQ;IACR,QAAQ;;;EAGV,QAAQ;;;;;;;;2CAQiC,QAAQ;;;;;;;;;;IAU/C,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;;;CAGX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAA0B;IACpD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,2CAA2C;QACpD,KAAK,EAAE,0BAA0B;QACjC,KAAK,CAAC,GAAG,CAAC,GAAmB;YAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { COLORS, FORMATS, SIZES, VIEWS, suggestedFileName } from "@meterapp/car-image-sdk";
|
|
3
|
+
import { flagBoolean, flagChoice, flagInteger, flagString, requireString } from "../args.js";
|
|
4
|
+
import { CliError } from "../errors.js";
|
|
5
|
+
import { ok, paint, printJson } from "../output.js";
|
|
6
|
+
const SIZE_NAMES = Object.keys(SIZES);
|
|
7
|
+
/** Builds ImageParams from --make/--model/--year/--view/--color/--size/--width/--height/--format. */
|
|
8
|
+
export function imageParamsFromFlags(flags, options = {}) {
|
|
9
|
+
const require = options.requireVehicle !== false;
|
|
10
|
+
const make = require ? requireString(flags, "make", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "make");
|
|
11
|
+
const model = require ? requireString(flags, "model", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "model");
|
|
12
|
+
const year = require ? requireString(flags, "year", "Example: --make Porsche --model 911 --year 2024") : flagString(flags, "year");
|
|
13
|
+
const params = { make: make ?? "", model: model ?? "", year: year ?? "" };
|
|
14
|
+
const view = flagChoice(flags, "view", VIEWS);
|
|
15
|
+
if (view)
|
|
16
|
+
params.view = view;
|
|
17
|
+
const color = flagChoice(flags, "color", COLORS);
|
|
18
|
+
if (color)
|
|
19
|
+
params.color = color;
|
|
20
|
+
const size = flagChoice(flags, "size", SIZE_NAMES);
|
|
21
|
+
if (size)
|
|
22
|
+
params.size = size;
|
|
23
|
+
const width = flagInteger(flags, "width", { min: 1, max: 1024 });
|
|
24
|
+
if (width !== undefined)
|
|
25
|
+
params.width = width;
|
|
26
|
+
const height = flagInteger(flags, "height", { min: 1, max: 1024 });
|
|
27
|
+
if (height !== undefined)
|
|
28
|
+
params.height = height;
|
|
29
|
+
const rawFormat = flagString(flags, "format");
|
|
30
|
+
if (rawFormat) {
|
|
31
|
+
const normalized = rawFormat.toLowerCase() === "jpeg" ? "jpg" : rawFormat.toLowerCase();
|
|
32
|
+
if (!FORMATS.includes(normalized))
|
|
33
|
+
throw new CliError(`Invalid --format "${rawFormat}". Choose one of: ${FORMATS.join(", ")}`, 2);
|
|
34
|
+
params.format = normalized;
|
|
35
|
+
}
|
|
36
|
+
return params;
|
|
37
|
+
}
|
|
38
|
+
export const getCommand = {
|
|
39
|
+
name: "get",
|
|
40
|
+
summary: "Download one image (1 credit) or print a signed URL with --url",
|
|
41
|
+
usage: "car-image get --make <make> --model <model> --year <year> [--view front-3-4] [--color silver]\n [--size thumb|small|medium|large | --width <px> --height <px>] [--format png|webp|jpg]\n [--out <file> | --out -] [--url] [--json]",
|
|
42
|
+
async run(ctx) {
|
|
43
|
+
const { io, clientContext } = ctx;
|
|
44
|
+
const params = imageParamsFromFlags(ctx.args.flags);
|
|
45
|
+
if (!clientContext.apiKey)
|
|
46
|
+
throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
|
|
47
|
+
if (flagBoolean(ctx.args.flags, "url")) {
|
|
48
|
+
const result = await clientContext.client.getImageUrl(params);
|
|
49
|
+
if (io.json) {
|
|
50
|
+
printJson(io, result);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
io.stdout(`${result.data.url}\n`);
|
|
54
|
+
if (!io.quiet) {
|
|
55
|
+
io.stderr(`Expires ${result.data.expires_at} · charged ${result.billing.credits_charged} credit, ${result.billing.credits_remaining.toLocaleString("en-US")} remaining · request ${result.request_id}\n`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
const image = await clientContext.client.getImage(params);
|
|
61
|
+
const out = flagString(ctx.args.flags, "out") ?? suggestedFileName({ ...params, format: params.format ?? formatFromContentType(image.contentType) });
|
|
62
|
+
if (out === "-") {
|
|
63
|
+
process.stdout.write(Buffer.from(image.bytes));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await writeFile(out, Buffer.from(image.bytes));
|
|
67
|
+
}
|
|
68
|
+
const meta = {
|
|
69
|
+
file: out === "-" ? null : out,
|
|
70
|
+
bytes: image.bytes.byteLength,
|
|
71
|
+
content_type: image.contentType,
|
|
72
|
+
width: image.width,
|
|
73
|
+
height: image.height,
|
|
74
|
+
source: image.source,
|
|
75
|
+
credits_charged: image.creditsCharged,
|
|
76
|
+
credits_remaining: image.creditsRemaining,
|
|
77
|
+
request_id: image.requestId,
|
|
78
|
+
};
|
|
79
|
+
if (io.json) {
|
|
80
|
+
if (out === "-")
|
|
81
|
+
io.stderr(`${JSON.stringify(meta)}\n`);
|
|
82
|
+
else
|
|
83
|
+
printJson(io, meta);
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
const size = image.width && image.height ? `${image.width}×${image.height} ` : "";
|
|
87
|
+
const line = `${out === "-" ? "Wrote image to stdout" : `Saved ${out}`} (${size}${image.contentType.replace("image/", "")}, ${(image.bytes.byteLength / 1024).toFixed(1)} KB, ${image.source ?? "unknown"}) — charged ${image.creditsCharged ?? "?"} credit, ${image.creditsRemaining?.toLocaleString("en-US") ?? "?"} remaining${image.requestId ? ` · request ${image.requestId}` : ""}`;
|
|
88
|
+
(out === "-" ? io.stderr : io.stdout)(`${ok(io, line)}\n`);
|
|
89
|
+
if (!io.quiet && image.requestId && out !== "-") {
|
|
90
|
+
io.stdout(paint(io, "dim", `Rate it: car-image feedback --request-id ${image.requestId} --good|--bad\n`));
|
|
91
|
+
}
|
|
92
|
+
return 0;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function formatFromContentType(contentType) {
|
|
96
|
+
if (contentType.includes("webp"))
|
|
97
|
+
return "webp";
|
|
98
|
+
if (contentType.includes("jpeg") || contentType.includes("jpg"))
|
|
99
|
+
return "jpg";
|
|
100
|
+
return "png";
|
|
101
|
+
}
|
|
102
|
+
async function readBatch(path) {
|
|
103
|
+
let raw;
|
|
104
|
+
try {
|
|
105
|
+
raw = await readFile(path, "utf8");
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new CliError(`Cannot read batch file ${path}: ${error instanceof Error ? error.message : String(error)}`, 2);
|
|
109
|
+
}
|
|
110
|
+
let parsed;
|
|
111
|
+
try {
|
|
112
|
+
parsed = JSON.parse(raw);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new CliError(`Batch file ${path} is not valid JSON`, 2, 'Expected an array of {"make","model","year",...} objects or {"images":[...]}.');
|
|
116
|
+
}
|
|
117
|
+
const list = Array.isArray(parsed) ? parsed : parsed && typeof parsed === "object" && Array.isArray(parsed.images) ? parsed.images : null;
|
|
118
|
+
if (!list)
|
|
119
|
+
throw new CliError(`Batch file ${path} must contain an array or an {"images": [...]} object`, 2);
|
|
120
|
+
if (list.length < 1 || list.length > 50)
|
|
121
|
+
throw new CliError(`Batch file must contain 1 to 50 images (found ${list.length})`, 2);
|
|
122
|
+
return list.map((entry, index) => {
|
|
123
|
+
if (!entry || typeof entry !== "object")
|
|
124
|
+
throw new CliError(`Batch entry ${index} is not an object`, 2);
|
|
125
|
+
const record = entry;
|
|
126
|
+
const make = record.make ?? record.brand;
|
|
127
|
+
if (typeof make !== "string" || typeof record.model !== "string" || (typeof record.year !== "number" && typeof record.year !== "string")) {
|
|
128
|
+
throw new CliError(`Batch entry ${index} needs make, model and year`, 2);
|
|
129
|
+
}
|
|
130
|
+
const params = { make, model: record.model, year: record.year };
|
|
131
|
+
for (const key of ["view", "color", "size", "format"]) {
|
|
132
|
+
if (typeof record[key] === "string")
|
|
133
|
+
params[key] = record[key];
|
|
134
|
+
}
|
|
135
|
+
for (const key of ["width", "height"]) {
|
|
136
|
+
if (typeof record[key] === "number")
|
|
137
|
+
params[key] = record[key];
|
|
138
|
+
}
|
|
139
|
+
return params;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export const urlCommand = {
|
|
143
|
+
name: "url",
|
|
144
|
+
summary: "Create signed, key-free delivery URLs (1 credit each) for browsers and documents",
|
|
145
|
+
usage: "car-image url --make <make> --model <model> --year <year> [--view] [--color] [--size|--width|--height] [--format]\n [--ttl 3600] [--max-uses 0] [--json]\ncar-image url --batch images.json [--ttl 3600] [--max-uses 0] [--json]",
|
|
146
|
+
async run(ctx) {
|
|
147
|
+
const { io, clientContext } = ctx;
|
|
148
|
+
if (!clientContext.apiKey)
|
|
149
|
+
throw new CliError("Not signed in.", 1, "Run `car-image login` or set CAR_IMAGE_API_KEY.");
|
|
150
|
+
const batchPath = flagString(ctx.args.flags, "batch");
|
|
151
|
+
const images = batchPath ? await readBatch(batchPath) : [imageParamsFromFlags(ctx.args.flags)];
|
|
152
|
+
const ttlSeconds = flagInteger(ctx.args.flags, "ttl", { min: 60, max: 604800 });
|
|
153
|
+
const maxUses = flagInteger(ctx.args.flags, "max-uses", { min: 0 });
|
|
154
|
+
const result = await clientContext.client.createImageUrls(images, { ttlSeconds, maxUses });
|
|
155
|
+
if (io.json) {
|
|
156
|
+
printJson(io, result);
|
|
157
|
+
return 0;
|
|
158
|
+
}
|
|
159
|
+
for (const entry of result.data)
|
|
160
|
+
io.stdout(`${entry.url}\n`);
|
|
161
|
+
if (!io.quiet) {
|
|
162
|
+
const first = result.data[0];
|
|
163
|
+
io.stderr(`${result.data.length} URL${result.data.length === 1 ? "" : "s"}${first ? `, expire ${first.expires_at}, max uses ${first.max_uses === 0 ? "unlimited" : first.max_uses}` : ""} · charged ${result.billing.credits_charged} credit${result.billing.credits_charged === 1 ? "" : "s"}, ${result.billing.credits_remaining.toLocaleString("en-US")} remaining · request ${result.request_id}\n`);
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/commands/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { agentConfigCommand, mcpCommand } from "./agents.js";
|
|
2
|
+
import { billingCommand } from "./billing.js";
|
|
3
|
+
import { feedbackCommand, optionsCommand, resolveCommand, searchCommand } from "./catalog.js";
|
|
4
|
+
import { describeCommand } from "./describe.js";
|
|
5
|
+
import { doctorCommand } from "./doctor.js";
|
|
6
|
+
import { helpCommand } from "./help.js";
|
|
7
|
+
import { getCommand, urlCommand } from "./images.js";
|
|
8
|
+
import { loginCommand, logoutCommand } from "./login.js";
|
|
9
|
+
import { configCommand, telemetryCommand, updateCommand } from "./maintenance.js";
|
|
10
|
+
import { onboardCommand } from "./onboard.js";
|
|
11
|
+
import { whoamiCommand } from "./whoami.js";
|
|
12
|
+
export const COMMANDS = [
|
|
13
|
+
loginCommand,
|
|
14
|
+
logoutCommand,
|
|
15
|
+
whoamiCommand,
|
|
16
|
+
doctorCommand,
|
|
17
|
+
getCommand,
|
|
18
|
+
urlCommand,
|
|
19
|
+
searchCommand,
|
|
20
|
+
resolveCommand,
|
|
21
|
+
optionsCommand,
|
|
22
|
+
describeCommand,
|
|
23
|
+
feedbackCommand,
|
|
24
|
+
billingCommand,
|
|
25
|
+
mcpCommand,
|
|
26
|
+
agentConfigCommand,
|
|
27
|
+
updateCommand,
|
|
28
|
+
configCommand,
|
|
29
|
+
telemetryCommand,
|
|
30
|
+
onboardCommand,
|
|
31
|
+
helpCommand(() => helpEntries()),
|
|
32
|
+
];
|
|
33
|
+
export function helpEntries() {
|
|
34
|
+
return COMMANDS.filter((command) => command.name !== "onboard").map(({ name, summary, usage, aliases }) => ({
|
|
35
|
+
name: aliases?.length ? `${name} (${aliases.join(", ")})` : name,
|
|
36
|
+
summary,
|
|
37
|
+
usage,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
export function findCommand(name) {
|
|
41
|
+
const needle = name.toLowerCase();
|
|
42
|
+
return COMMANDS.find((command) => command.name === needle || command.aliases?.includes(needle));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,UAAU;IACV,UAAU;IACV,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,cAAc;IACd,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1G,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QAChE,OAAO;QACP,KAAK;KACN,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAClG,CAAC"}
|