@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 +161 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +607 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|