@inliner/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,161 @@
1
+ # @inliner/cli
2
+
3
+ CLI for [Inliner.ai](https://inliner.ai) — generate and edit AI images from the terminal.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @inliner/cli
9
+ ```
10
+
11
+ Or run directly with npx:
12
+
13
+ ```bash
14
+ npx @inliner/cli generate "hero image" --project mysite --size 1200x600
15
+ ```
16
+
17
+ ## Setup
18
+
19
+ Get an API key from **Account > API Keys** in the [Inliner dashboard](https://app.inliner.ai/account).
20
+
21
+ ```bash
22
+ export INLINER_API_KEY=your-key
23
+ ```
24
+
25
+ Or pass it per-command:
26
+
27
+ ```bash
28
+ inliner-ai generate "hero" --api-key=YOUR_KEY --project mysite
29
+ ```
30
+
31
+ ## Commands
32
+
33
+ ### generate
34
+
35
+ Generate an AI image from a text prompt.
36
+
37
+ ```bash
38
+ # Print image URL to terminal
39
+ inliner-ai generate "modern office hero" -p acme --size 1200x600
40
+
41
+ # Pipe binary to file
42
+ inliner-ai gen "sunset landscape" -p mysite > hero.png
43
+
44
+ # Save directly
45
+ inliner-ai g "product shot" -p store -o product.png
46
+ ```
47
+
48
+ Options:
49
+ | Flag | Description |
50
+ |------|-------------|
51
+ | `-p, --project` | Project namespace (required) |
52
+ | `--size WxH` | Dimensions (default: 800x600) |
53
+ | `--width`, `--height` | Alternative to --size |
54
+ | `-f, --format` | `png` or `jpg` (default: png) |
55
+ | `-o, --output` | Save to file |
56
+
57
+ ### edit
58
+
59
+ Edit an image with AI instructions. Accepts a local file, Inliner URL, or stdin.
60
+
61
+ ```bash
62
+ # Edit a local file
63
+ inliner-ai edit photo.png "remove the background" -p myproject -o clean.png
64
+
65
+ # Pipe from stdin
66
+ cat photo.jpg | inliner-ai edit - "make it warmer" -p proj > warm.jpg
67
+
68
+ # Edit an existing Inliner image by URL
69
+ inliner-ai edit https://img.inliner.ai/proj/hero_800x600.png "add sunset sky"
70
+ ```
71
+
72
+ For local files, the CLI uploads the image to your project first, then applies the AI edit.
73
+
74
+ ### inline
75
+
76
+ Process HTML files to resolve Inliner image references. Reads from stdin or a file.
77
+
78
+ ```bash
79
+ # Replace placeholders with Inliner image tags
80
+ inliner-ai inline template.html -p acme > output.html
81
+
82
+ # Embed images as base64 data URIs (for emails, offline HTML)
83
+ cat email.html | inliner-ai inline --embed > email-inlined.html
84
+ ```
85
+
86
+ Supported HTML patterns (with `--project`):
87
+
88
+ ```html
89
+ <!-- inliner: hero banner sunset landscape 1200x600 png -->
90
+ <!-- Becomes: <img src="https://img.inliner.ai/acme/hero-banner-sunset-landscape_1200x600.png" ...> -->
91
+
92
+ <img data-inliner="product shot on white background" width="800" height="600">
93
+ <!-- Gets an Inliner src URL added -->
94
+ ```
95
+
96
+ With `--embed`, downloads all `img.inliner.ai` images and replaces URLs with `data:` URIs.
97
+
98
+ ### projects
99
+
100
+ List your Inliner projects.
101
+
102
+ ```bash
103
+ inliner-ai projects
104
+ inliner-ai proj --json
105
+ ```
106
+
107
+ ### images
108
+
109
+ List generated images.
110
+
111
+ ```bash
112
+ inliner-ai images
113
+ inliner-ai img -p myproject --limit 20
114
+ inliner-ai img --search "hero" --json
115
+ ```
116
+
117
+ ### usage
118
+
119
+ Show credit usage for your account.
120
+
121
+ ```bash
122
+ inliner-ai usage
123
+ inliner-ai u --json
124
+ ```
125
+
126
+ ## Smart Output
127
+
128
+ The CLI adapts its output based on context:
129
+
130
+ | Context | Behavior |
131
+ |---------|----------|
132
+ | Interactive terminal (TTY) | Prints the image URL |
133
+ | Piped (`\| ...` or `> file`) | Outputs raw image bytes |
134
+ | `--output file.png` | Saves to file, prints URL to stderr |
135
+
136
+ This means standard Unix patterns work naturally:
137
+
138
+ ```bash
139
+ # Save to file via redirect
140
+ inliner-ai generate "hero" -p site > hero.png
141
+
142
+ # Pipe through ImageMagick
143
+ inliner-ai generate "logo" -p brand --size 400x400 | convert - -resize 200x200 logo-small.png
144
+
145
+ # Chain edit operations
146
+ inliner-ai edit photo.png "remove background" -p proj | inliner-ai edit - "add gradient bg" -p proj > final.png
147
+ ```
148
+
149
+ ## Environment Variables
150
+
151
+ | Variable | Description |
152
+ |----------|-------------|
153
+ | `INLINER_API_KEY` | API key (required) |
154
+ | `INLINER_API_URL` | API base URL (default: `https://app.inliner.ai`) |
155
+ | `INLINER_IMG_URL` | Image CDN URL (default: `https://img.inliner.ai`) |
156
+
157
+ ## Links
158
+
159
+ - [Inliner.ai](https://inliner.ai)
160
+ - [Tutorials](https://inliner.ai/tutorial)
161
+ - [@inliner/mcp-server](https://www.npmjs.com/package/@inliner/mcp-server) — MCP server for AI coding agents
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,607 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const promises_1 = require("node:fs/promises");
5
+ const node_path_1 = require("node:path");
6
+ const VERSION = '0.1.0';
7
+ const IMG_BASE = process.env.INLINER_IMG_URL || 'https://img.inliner.ai';
8
+ const API_BASE = process.env.INLINER_API_URL || 'https://app.inliner.ai';
9
+ function parseArgs(argv) {
10
+ const args = argv.slice(2);
11
+ const flags = {};
12
+ const positional = [];
13
+ let command = '';
14
+ for (let i = 0; i < args.length; i++) {
15
+ const arg = args[i];
16
+ if (arg === '--') {
17
+ positional.push(...args.slice(i + 1));
18
+ break;
19
+ }
20
+ if (arg.startsWith('--')) {
21
+ const eq = arg.indexOf('=');
22
+ if (eq !== -1) {
23
+ flags[arg.slice(2, eq)] = arg.slice(eq + 1);
24
+ }
25
+ else {
26
+ const next = args[i + 1];
27
+ if (next && !next.startsWith('-')) {
28
+ flags[arg.slice(2)] = next;
29
+ i++;
30
+ }
31
+ else {
32
+ flags[arg.slice(2)] = true;
33
+ }
34
+ }
35
+ }
36
+ else if (arg.startsWith('-') && arg.length === 2) {
37
+ const next = args[i + 1];
38
+ if (next && !next.startsWith('-')) {
39
+ flags[arg[1]] = next;
40
+ i++;
41
+ }
42
+ else {
43
+ flags[arg[1]] = true;
44
+ }
45
+ }
46
+ else if (!command) {
47
+ command = arg;
48
+ }
49
+ else {
50
+ positional.push(arg);
51
+ }
52
+ }
53
+ return { command, positional, flags };
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Helpers
57
+ // ---------------------------------------------------------------------------
58
+ function flag(flags, ...keys) {
59
+ for (const k of keys) {
60
+ if (flags[k] !== undefined)
61
+ return flags[k];
62
+ }
63
+ return undefined;
64
+ }
65
+ function flagStr(flags, ...keys) {
66
+ const v = flag(flags, ...keys);
67
+ return typeof v === 'string' ? v : undefined;
68
+ }
69
+ function flagBool(flags, ...keys) {
70
+ return flag(flags, ...keys) === true;
71
+ }
72
+ function getApiKey(flags) {
73
+ const k = flagStr(flags, 'api-key');
74
+ if (k)
75
+ return k;
76
+ if (process.env.INLINER_API_KEY)
77
+ return process.env.INLINER_API_KEY;
78
+ process.stderr.write('Error: No API key. Set INLINER_API_KEY or pass --api-key=KEY\n');
79
+ process.exit(1);
80
+ }
81
+ function getApiBase(flags) {
82
+ return flagStr(flags, 'api-url') || API_BASE;
83
+ }
84
+ async function apiFetch(path, apiKey, apiBase, opts) {
85
+ const url = `${apiBase}${path}`;
86
+ return fetch(url, {
87
+ ...opts,
88
+ headers: {
89
+ Authorization: `Bearer ${apiKey}`,
90
+ ...(opts?.headers || {}),
91
+ },
92
+ });
93
+ }
94
+ async function apiJson(path, apiKey, apiBase, opts) {
95
+ const res = await apiFetch(path, apiKey, apiBase, {
96
+ ...opts,
97
+ headers: {
98
+ 'Content-Type': 'application/json',
99
+ ...(opts?.headers || {}),
100
+ },
101
+ });
102
+ if (!res.ok) {
103
+ const body = await res.text().catch(() => '');
104
+ throw new Error(`API ${res.status}: ${body}`);
105
+ }
106
+ return res.json();
107
+ }
108
+ function sanitize(text) {
109
+ return text
110
+ .toLowerCase()
111
+ .replace(/[^a-z0-9-]+/g, '-')
112
+ .replace(/-{2,}/g, '-')
113
+ .replace(/^-|-$/g, '')
114
+ .slice(0, 100);
115
+ }
116
+ function parseDimensions(flags, defaultW = 800, defaultH = 600) {
117
+ const size = flagStr(flags, 'size');
118
+ if (size) {
119
+ const m = size.match(/^(\d+)x(\d+)$/);
120
+ if (m)
121
+ return { width: +m[1], height: +m[2] };
122
+ process.stderr.write('Error: --size must be WxH (e.g. 1200x600)\n');
123
+ process.exit(1);
124
+ }
125
+ return {
126
+ width: parseInt(flagStr(flags, 'width', 'w') || String(defaultW), 10),
127
+ height: parseInt(flagStr(flags, 'height', 'H') || String(defaultH), 10),
128
+ };
129
+ }
130
+ async function readStdin() {
131
+ const chunks = [];
132
+ for await (const chunk of process.stdin) {
133
+ chunks.push(Buffer.from(chunk));
134
+ }
135
+ return Buffer.concat(chunks);
136
+ }
137
+ function mimeForExt(ext) {
138
+ switch (ext.toLowerCase()) {
139
+ case 'jpg':
140
+ case 'jpeg': return 'image/jpeg';
141
+ case 'webp': return 'image/webp';
142
+ case 'gif': return 'image/gif';
143
+ default: return 'image/png';
144
+ }
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Smart output: TTY → URL, piped → binary, --output → file
148
+ // ---------------------------------------------------------------------------
149
+ async function outputImage(data, url, flags) {
150
+ const out = flagStr(flags, 'output', 'o');
151
+ if (out) {
152
+ await (0, promises_1.writeFile)(out, data);
153
+ process.stderr.write(`Saved to ${out}\n`);
154
+ process.stderr.write(`${url}\n`);
155
+ }
156
+ else if (process.stdout.isTTY) {
157
+ process.stdout.write(url + '\n');
158
+ }
159
+ else {
160
+ process.stdout.write(data);
161
+ }
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // Poll helper — fetches content/request-json, waits for 200
165
+ // ---------------------------------------------------------------------------
166
+ async function pollImage(contentPath, apiKey, apiBase, label, maxSeconds = 180) {
167
+ const jsonPath = `/content/request-json/${contentPath}`;
168
+ const imgUrl = `${IMG_BASE}/${contentPath}`;
169
+ const maxAttempts = Math.ceil(maxSeconds / 3);
170
+ for (let i = 0; i < maxAttempts; i++) {
171
+ const res = await apiFetch(jsonPath, apiKey, apiBase);
172
+ if (res.status === 200) {
173
+ const json = await res.json();
174
+ if (json.mediaAsset?.data) {
175
+ if (process.stderr.isTTY && i > 0)
176
+ process.stderr.write('\n');
177
+ const [header, base64] = json.mediaAsset.data.split(',');
178
+ return {
179
+ data: Buffer.from(base64 || header, 'base64'),
180
+ url: imgUrl,
181
+ };
182
+ }
183
+ // Fallback: fetch from CDN
184
+ const cdn = await fetch(imgUrl);
185
+ if (cdn.ok) {
186
+ if (process.stderr.isTTY && i > 0)
187
+ process.stderr.write('\n');
188
+ return {
189
+ data: Buffer.from(await cdn.arrayBuffer()),
190
+ url: imgUrl,
191
+ };
192
+ }
193
+ }
194
+ if (res.status !== 200 && res.status !== 202) {
195
+ const body = await res.text().catch(() => '');
196
+ throw new Error(`${label} failed (${res.status}): ${body}`);
197
+ }
198
+ // 202 — still processing
199
+ if (process.stderr.isTTY) {
200
+ process.stderr.write(`\r${label}... (${i * 3}s)`);
201
+ }
202
+ await new Promise(r => setTimeout(r, 3000));
203
+ }
204
+ throw new Error(`${label} timed out after ${maxSeconds}s. URL: ${imgUrl}`);
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // Commands
208
+ // ---------------------------------------------------------------------------
209
+ async function cmdGenerate(pos, flags) {
210
+ const prompt = pos.join(' ');
211
+ if (!prompt)
212
+ die('Usage: inliner-ai generate <prompt> --project <ns> [--size WxH] [--format png|jpg]');
213
+ const project = flagStr(flags, 'project', 'p');
214
+ if (!project)
215
+ die('Error: --project is required');
216
+ const { width, height } = parseDimensions(flags);
217
+ const format = flagStr(flags, 'format', 'f') || 'png';
218
+ const apiKey = getApiKey(flags);
219
+ const apiBase = getApiBase(flags);
220
+ const slug = sanitize(prompt);
221
+ const contentPath = `${project}/${slug}_${width}x${height}.${format}`;
222
+ process.stderr.write(`Generating: ${IMG_BASE}/${contentPath}\n`);
223
+ const result = await pollImage(contentPath, apiKey, apiBase, 'Generating');
224
+ await outputImage(result.data, result.url, flags);
225
+ }
226
+ async function cmdEdit(pos, flags) {
227
+ if (pos.length < 2) {
228
+ die('Usage: inliner-ai edit <file|url|-> <instruction> [--project <ns>] [--format png|jpg]');
229
+ }
230
+ const source = pos[0];
231
+ const instruction = pos.slice(1).join(' ');
232
+ const format = flagStr(flags, 'format', 'f') || 'png';
233
+ const apiKey = getApiKey(flags);
234
+ const apiBase = getApiBase(flags);
235
+ const editSlug = sanitize(instruction);
236
+ if (source.startsWith('http://') || source.startsWith('https://')) {
237
+ // URL source — chain edit via content/request path
238
+ let urlPath;
239
+ try {
240
+ urlPath = new URL(source).pathname;
241
+ }
242
+ catch {
243
+ die(`Invalid URL: ${source}`);
244
+ return; // unreachable, keeps TS happy
245
+ }
246
+ // Strip leading slash for content path
247
+ const basePath = urlPath.startsWith('/') ? urlPath.slice(1) : urlPath;
248
+ const contentPath = `${basePath}/${editSlug}.${format}`;
249
+ process.stderr.write(`Editing: ${instruction}\n`);
250
+ const result = await pollImage(contentPath, apiKey, apiBase, 'Editing');
251
+ await outputImage(result.data, result.url, flags);
252
+ }
253
+ else {
254
+ // Local file or stdin
255
+ const project = flagStr(flags, 'project', 'p');
256
+ if (!project)
257
+ die('Error: --project is required when editing local files');
258
+ let imageBuffer;
259
+ let filename;
260
+ if (source === '-') {
261
+ if (process.stdin.isTTY)
262
+ die('Error: No data piped to stdin. Use a file path or pipe data.');
263
+ imageBuffer = await readStdin();
264
+ filename = `upload.${format}`;
265
+ }
266
+ else {
267
+ imageBuffer = await (0, promises_1.readFile)(source);
268
+ filename = (0, node_path_1.basename)(source);
269
+ }
270
+ const ext = (0, node_path_1.extname)(filename).slice(1) || format;
271
+ // Step 1: Upload
272
+ process.stderr.write('Uploading image...\n');
273
+ const uploadName = sanitize(`edit-source-${Date.now()}`);
274
+ const form = new FormData();
275
+ form.append('file', new Blob([imageBuffer], { type: mimeForExt(ext) }), filename);
276
+ form.append('project', project);
277
+ form.append('prompt', uploadName);
278
+ const uploadRes = await apiFetch('/content/upload', apiKey, apiBase, {
279
+ method: 'POST',
280
+ body: form,
281
+ });
282
+ if (!uploadRes.ok) {
283
+ const body = await uploadRes.text().catch(() => '');
284
+ throw new Error(`Upload failed (${uploadRes.status}): ${body}`);
285
+ }
286
+ const uploadData = await uploadRes.json();
287
+ if (!uploadData.success)
288
+ throw new Error(`Upload failed: ${uploadData.message}`);
289
+ const uploadedPath = uploadData.content.prompt; // e.g. "project/edit-source-123.png"
290
+ // Step 2: Edit via URL chaining
291
+ const contentPath = `${uploadedPath}/${editSlug}.${format}`;
292
+ process.stderr.write(`Applying edit: ${instruction}\n`);
293
+ const result = await pollImage(contentPath, apiKey, apiBase, 'Editing');
294
+ await outputImage(result.data, result.url, flags);
295
+ }
296
+ }
297
+ async function cmdInline(pos, flags) {
298
+ let html;
299
+ if (pos.length > 0 && pos[0] !== '-') {
300
+ html = await (0, promises_1.readFile)(pos[0], 'utf-8');
301
+ }
302
+ else {
303
+ if (process.stdin.isTTY)
304
+ die('Usage: inliner-ai inline <file> [--project <ns>] [--embed]');
305
+ html = (await readStdin()).toString('utf-8');
306
+ }
307
+ const project = flagStr(flags, 'project', 'p');
308
+ const embed = flagBool(flags, 'embed', 'e');
309
+ const apiKey = getApiKey(flags);
310
+ if (embed) {
311
+ // Download img.inliner.ai images and replace with base64 data URIs
312
+ const srcRe = /src=["'](https?:\/\/img\.inliner\.ai\/[^"']+)["']/gi;
313
+ const urls = new Set();
314
+ let m;
315
+ while ((m = srcRe.exec(html)) !== null)
316
+ urls.add(m[1]);
317
+ for (const url of urls) {
318
+ process.stderr.write(`Fetching: ${url}\n`);
319
+ try {
320
+ const res = await fetch(url, {
321
+ headers: { Authorization: `Bearer ${apiKey}` },
322
+ });
323
+ if (res.ok) {
324
+ const buf = Buffer.from(await res.arrayBuffer());
325
+ const ct = res.headers.get('content-type') || 'image/png';
326
+ const dataUri = `data:${ct};base64,${buf.toString('base64')}`;
327
+ html = html.replaceAll(url, dataUri);
328
+ }
329
+ }
330
+ catch {
331
+ process.stderr.write(`Warning: Failed to fetch ${url}\n`);
332
+ }
333
+ }
334
+ }
335
+ if (project) {
336
+ // Replace <!-- inliner: description WxH [format] --> comments with img tags
337
+ html = html.replace(/<!--\s*inliner:\s*(.+?)\s+(\d+)x(\d+)\s*(png|jpg)?\s*-->/gi, (_match, desc, w, h, fmt) => {
338
+ const slug = sanitize(desc.trim());
339
+ const f = fmt || 'png';
340
+ const url = `${IMG_BASE}/${project}/${slug}_${w}x${h}.${f}`;
341
+ const alt = desc.trim();
342
+ return `<img src="${url}" alt="${alt}" width="${w}" height="${h}" loading="lazy" />`;
343
+ });
344
+ // Replace <img data-inliner="description" width="W" height="H"> with Inliner src
345
+ html = html.replace(/<img\s([^>]*?)data-inliner=["']([^"']+)["']([^>]*?)>/gi, (_match, before, desc, after) => {
346
+ const attrs = before + after;
347
+ const wm = attrs.match(/width=["']?(\d+)/i);
348
+ const hm = attrs.match(/height=["']?(\d+)/i);
349
+ const w = wm?.[1] || '800';
350
+ const h = hm?.[1] || '600';
351
+ const slug = sanitize(desc);
352
+ const url = `${IMG_BASE}/${project}/${slug}_${w}x${h}.png`;
353
+ const tag = `<img ${before}${after}>`;
354
+ if (/src=["'][^"']*["']/i.test(tag)) {
355
+ return tag.replace(/src=["'][^"']*["']/i, `src="${url}" alt="${desc}"`);
356
+ }
357
+ return `<img src="${url}" alt="${desc}" ${before}${after} loading="lazy">`;
358
+ });
359
+ }
360
+ const out = flagStr(flags, 'output', 'o');
361
+ if (out) {
362
+ await (0, promises_1.writeFile)(out, html);
363
+ process.stderr.write(`Saved to ${out}\n`);
364
+ }
365
+ else {
366
+ process.stdout.write(html);
367
+ }
368
+ }
369
+ async function cmdProjects(flags) {
370
+ const apiKey = getApiKey(flags);
371
+ const apiBase = getApiBase(flags);
372
+ const data = await apiJson('/account/projects', apiKey, apiBase);
373
+ if (flagBool(flags, 'json')) {
374
+ process.stdout.write(JSON.stringify(data.projects, null, 2) + '\n');
375
+ return;
376
+ }
377
+ const projects = data.projects || [];
378
+ if (!projects.length) {
379
+ console.log('No projects found.');
380
+ return;
381
+ }
382
+ const hdr = 'NAMESPACE'.padEnd(24) + 'NAME'.padEnd(30) + 'IMAGES';
383
+ console.log(hdr);
384
+ console.log('-'.repeat(hdr.length));
385
+ for (const p of projects) {
386
+ const ns = (p.namespace || '').padEnd(24);
387
+ const name = (p.projectName || '').padEnd(30);
388
+ const cnt = String(p.imageCount ?? '-');
389
+ console.log(`${ns}${name}${cnt}`);
390
+ }
391
+ }
392
+ async function cmdImages(flags) {
393
+ const apiKey = getApiKey(flags);
394
+ const apiBase = getApiBase(flags);
395
+ const params = new URLSearchParams();
396
+ const proj = flagStr(flags, 'project', 'p');
397
+ const search = flagStr(flags, 'search', 's');
398
+ const limit = flagStr(flags, 'limit', 'l');
399
+ const page = flagStr(flags, 'page');
400
+ if (proj)
401
+ params.set('projectId', proj);
402
+ if (search)
403
+ params.set('search', search);
404
+ if (limit)
405
+ params.set('pageSize', limit);
406
+ if (page)
407
+ params.set('page', page);
408
+ const q = params.toString();
409
+ const data = await apiJson(`/content/images${q ? '?' + q : ''}`, apiKey, apiBase);
410
+ if (flagBool(flags, 'json')) {
411
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
412
+ return;
413
+ }
414
+ const images = data.images || [];
415
+ if (!images.length) {
416
+ console.log('No images found.');
417
+ return;
418
+ }
419
+ for (const img of images) {
420
+ const url = img.url || `${IMG_BASE}/${img.prompt || ''}`;
421
+ const dims = img.width && img.height ? ` (${img.width}x${img.height})` : '';
422
+ const date = img.createdTs ? ` ${new Date(img.createdTs).toLocaleDateString()}` : '';
423
+ console.log(`${url}${dims}${date}`);
424
+ }
425
+ if (data.total)
426
+ console.log(`\n${images.length} of ${data.total} images`);
427
+ }
428
+ async function cmdUsage(flags) {
429
+ const apiKey = getApiKey(flags);
430
+ const apiBase = getApiBase(flags);
431
+ const data = await apiJson('/account/plan-usage', apiKey, apiBase);
432
+ if (flagBool(flags, 'json')) {
433
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
434
+ return;
435
+ }
436
+ console.log('Credit Usage');
437
+ console.log('============');
438
+ const features = data.features || [];
439
+ for (const f of features) {
440
+ const name = (f.description || f.featureCd || 'Unknown').padEnd(32);
441
+ const used = f.used ?? 0;
442
+ const total = f.quantity ?? '\u221e';
443
+ const pct = typeof f.quantity === 'number' && f.quantity > 0
444
+ ? ` (${Math.round((used / f.quantity) * 100)}%)`
445
+ : '';
446
+ console.log(` ${name}${used} / ${total}${pct}`);
447
+ }
448
+ }
449
+ // ---------------------------------------------------------------------------
450
+ // Help
451
+ // ---------------------------------------------------------------------------
452
+ function printHelp(cmd) {
453
+ if (cmd === 'generate' || cmd === 'gen' || cmd === 'g') {
454
+ console.log(`Usage: inliner-ai generate <prompt> [options]
455
+
456
+ Generate an AI image from a text description.
457
+
458
+ Options:
459
+ -p, --project <ns> Project namespace (required)
460
+ --size <WxH> Image dimensions (default: 800x600)
461
+ --width <n> Width (alternative to --size)
462
+ --height <n> Height (alternative to --size)
463
+ -f, --format <fmt> png or jpg (default: png)
464
+ -o, --output <file> Save image to file
465
+
466
+ Output:
467
+ TTY \u2192 prints the image URL
468
+ Pipe \u2192 outputs raw image bytes
469
+ -o \u2192 saves to file, prints URL to stderr
470
+
471
+ Examples:
472
+ inliner-ai generate "modern office hero" -p acme --size 1200x600
473
+ inliner-ai gen "sunset landscape" -p mysite > hero.png
474
+ inliner-ai g "product shot" -p store -o product.png`);
475
+ }
476
+ else if (cmd === 'edit' || cmd === 'e') {
477
+ console.log(`Usage: inliner-ai edit <source> <instruction> [options]
478
+
479
+ Edit an image using AI. Source can be a local file, an Inliner URL, or "-" for stdin.
480
+
481
+ Options:
482
+ -p, --project <ns> Project namespace (required for local files)
483
+ -f, --format <fmt> Output format: png or jpg (default: png)
484
+ -o, --output <file> Save result to file
485
+
486
+ Flow for local files:
487
+ 1. Uploads the image to your project
488
+ 2. Applies the AI edit via URL chaining
489
+ 3. Returns the edited image
490
+
491
+ Examples:
492
+ inliner-ai edit photo.png "remove the background" -p myproject -o clean.png
493
+ cat photo.jpg | inliner-ai edit - "make it warmer" -p proj > warm.jpg
494
+ inliner-ai edit https://img.inliner.ai/proj/img_800x600.png "add sunset"`);
495
+ }
496
+ else if (cmd === 'inline' || cmd === 'i') {
497
+ console.log(`Usage: inliner-ai inline [file] [options]
498
+
499
+ Process HTML to resolve Inliner image references. Reads from stdin if no file given.
500
+
501
+ Options:
502
+ -p, --project <ns> Default project namespace for placeholders
503
+ -e, --embed Download images and embed as base64 data URIs
504
+ -o, --output <file> Save result to file
505
+
506
+ Supported patterns (with --project):
507
+ <!-- inliner: hero image 1200x600 png --> \u2192 <img src="..." .../>
508
+ <img data-inliner="product shot" width="800" height="600">
509
+
510
+ With --embed:
511
+ Downloads all img.inliner.ai images and replaces with data: URIs.
512
+
513
+ Examples:
514
+ inliner-ai inline template.html -p acme > output.html
515
+ cat email.html | inliner-ai inline --embed > email-inlined.html
516
+ inliner-ai inline page.html -p site --embed -o final.html`);
517
+ }
518
+ else {
519
+ console.log(`inliner-ai \u2014 AI image generation from the terminal
520
+
521
+ Usage: inliner-ai <command> [options]
522
+
523
+ Commands:
524
+ generate, gen, g Generate an image from a text prompt
525
+ edit, e Edit an image with AI instructions
526
+ inline, i Process HTML with Inliner image references
527
+ projects, proj List your projects
528
+ images, img List generated images
529
+ usage, u Show credit usage
530
+
531
+ Global options:
532
+ --api-key <key> API key (or set INLINER_API_KEY)
533
+ --api-url <url> API base URL (default: https://app.inliner.ai)
534
+ --json Output raw JSON (projects, images, usage)
535
+ -h, --help Show help for a command
536
+ -v, --version Show version
537
+
538
+ Examples:
539
+ inliner-ai generate "hero image" -p mysite --size 1200x600
540
+ inliner-ai edit photo.png "remove background" -p proj -o clean.png
541
+ cat template.html | inliner-ai inline -p mysite > output.html
542
+ inliner-ai projects
543
+ inliner-ai usage
544
+
545
+ Environment:
546
+ INLINER_API_KEY API key (from Account > API Keys)
547
+ INLINER_API_URL API base URL override
548
+ INLINER_IMG_URL Image CDN URL override`);
549
+ }
550
+ }
551
+ function die(msg) {
552
+ process.stderr.write(msg + '\n');
553
+ process.exit(1);
554
+ }
555
+ // ---------------------------------------------------------------------------
556
+ // Main
557
+ // ---------------------------------------------------------------------------
558
+ async function main() {
559
+ const { command, positional, flags } = parseArgs(process.argv);
560
+ if (flagBool(flags, 'version', 'v')) {
561
+ console.log(`inliner-ai ${VERSION}`);
562
+ return;
563
+ }
564
+ if (!command || flagBool(flags, 'help', 'h')) {
565
+ printHelp(command || undefined);
566
+ return;
567
+ }
568
+ try {
569
+ switch (command) {
570
+ case 'generate':
571
+ case 'gen':
572
+ case 'g':
573
+ await cmdGenerate(positional, flags);
574
+ break;
575
+ case 'edit':
576
+ case 'e':
577
+ await cmdEdit(positional, flags);
578
+ break;
579
+ case 'inline':
580
+ case 'i':
581
+ await cmdInline(positional, flags);
582
+ break;
583
+ case 'projects':
584
+ case 'proj':
585
+ await cmdProjects(flags);
586
+ break;
587
+ case 'images':
588
+ case 'img':
589
+ await cmdImages(flags);
590
+ break;
591
+ case 'usage':
592
+ case 'u':
593
+ await cmdUsage(flags);
594
+ break;
595
+ default:
596
+ process.stderr.write(`Unknown command: ${command}\n`);
597
+ printHelp();
598
+ process.exit(1);
599
+ }
600
+ }
601
+ catch (err) {
602
+ process.stderr.write(`Error: ${err.message}\n`);
603
+ process.exit(1);
604
+ }
605
+ }
606
+ main();
607
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@inliner/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for Inliner.ai — generate and edit AI images from the terminal",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "inliner-ai": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "start": "node dist/index.js",
12
+ "dev": "ts-node src/index.ts"
13
+ },
14
+ "keywords": [
15
+ "inliner",
16
+ "cli",
17
+ "ai-images",
18
+ "image-generation",
19
+ "image-editing",
20
+ "terminal"
21
+ ],
22
+ "author": "Inliner <support@inliner.ai>",
23
+ "license": "MIT",
24
+ "homepage": "https://inliner.ai",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/inliner-ai/cli"
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.3.0",
31
+ "@types/node": "^20.0.0"
32
+ },
33
+ "files": [
34
+ "dist/",
35
+ "README.md"
36
+ ],
37
+ "engines": {
38
+ "node": ">=18"
39
+ }
40
+ }