pixcli 0.1.1 → 0.2.2

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,170 @@
1
+ # pixcli
2
+
3
+ The creative toolkit for AI agents — generate images, videos, voiceover, music, and sound effects from the command line.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g pixcli
9
+ ```
10
+
11
+ Or run without installing:
12
+
13
+ ```bash
14
+ npx pixcli image "a red fox in a forest"
15
+ ```
16
+
17
+ ## Auth
18
+
19
+ ```bash
20
+ export PIXCLI_API_KEY="px_live_..."
21
+ ```
22
+
23
+ Get your key at [pixcli.shellbot.sh](https://pixcli.shellbot.sh).
24
+
25
+ ## Commands
26
+
27
+ ### `pixcli image <prompt>` — Generate images
28
+
29
+ ```bash
30
+ pixcli image "Studio product shot of wireless earbuds, soft lighting" -r 16:9 -q high -o earbuds.png
31
+ pixcli image "Abstract pattern, dark blue and cyan" -n 4
32
+ pixcli image "Red sneaker, centered, clean edges" -t -o sneaker.png
33
+ pixcli image "Same product, warm background" --from product.png -o warm.png
34
+ ```
35
+
36
+ | Option | Default | Description |
37
+ |--------|---------|-------------|
38
+ | `-r, --ratio` | `1:1` | `1:1`, `16:9`, `9:16`, `4:3`, `3:4`, `3:2`, `2:3` |
39
+ | `-q, --quality` | `standard` | `draft`, `standard`, `high` |
40
+ | `-t, --transparent` | `false` | Transparent background (PNG) |
41
+ | `-n, --count` | `1` | Number of images (1-4) |
42
+ | `--from` | — | Source image for I2I |
43
+ | `-m, --model` | auto | Model ID (bypasses auto-classification) |
44
+ | `-o, --output` | auto | Output path |
45
+ | `--json` | `false` | JSON output |
46
+
47
+ ### `pixcli edit <prompt>` — Edit images
48
+
49
+ ```bash
50
+ pixcli edit "Remove the background" -i photo.jpg -o photo-nobg.png
51
+ pixcli edit "Upscale to max resolution" -i hero.png -q high -o hero-4k.png
52
+ pixcli edit "Apply the style from the reference" -i photo.jpg -i style-ref.jpg
53
+ ```
54
+
55
+ | Option | Default | Description |
56
+ |--------|---------|-------------|
57
+ | `-i, --image` | **required** | Source image (repeatable) |
58
+ | `-q, --quality` | `standard` | `draft`, `standard`, `high` |
59
+ | `-m, --model` | auto | Model ID |
60
+ | `-o, --output` | auto | Output path |
61
+ | `--json` | `false` | JSON output |
62
+
63
+ ### `pixcli video <prompt>` — Generate video
64
+
65
+ ```bash
66
+ pixcli video "Slow orbit around the product" --from product.png -d 5 -o reveal.mp4
67
+ pixcli video "A cat walking through a garden" -o cat.mp4
68
+ pixcli video "The cat jumps over a fence" --from cat.mp4 --extend -o extended.mp4
69
+ ```
70
+
71
+ | Option | Default | Description |
72
+ |--------|---------|-------------|
73
+ | `--from` | — | Source image (I2V) or video (extend) |
74
+ | `-d, --duration` | `5` | Duration in seconds (2-10) |
75
+ | `-r, --ratio` | `16:9` | `16:9`, `9:16`, `1:1`, `4:3`, `3:4` |
76
+ | `-q, --quality` | `standard` | `draft`, `standard`, `high` |
77
+ | `-m, --model` | auto | Model ID |
78
+ | `-o, --output` | auto | Output path |
79
+ | `--extend` | `false` | Extend source video |
80
+ | `--json` | `false` | JSON output |
81
+
82
+ ### `pixcli voice <text>` — Text-to-speech
83
+
84
+ ```bash
85
+ pixcli voice "Welcome to the future of productivity." -o voiceover.mp3
86
+ pixcli voice "Bienvenidos." --voice Sarah --language spa -o vo-es.mp3
87
+ ```
88
+
89
+ | Option | Default | Description |
90
+ |--------|---------|-------------|
91
+ | `--voice` | `Rachel` | Voice preset (Rachel, Aria, Roger, Sarah, Laura, Charlie, George, etc.) |
92
+ | `--language` | auto | ISO 639-1 code (eng, spa, fra, deu, jpn, ...) |
93
+ | `-o, --output` | auto | Output path (.mp3) |
94
+ | `--json` | `false` | JSON output |
95
+
96
+ ### `pixcli music <prompt>` — Generate music
97
+
98
+ ```bash
99
+ pixcli music "Ambient electronic, minimal beats, corporate feel" -d 45 -o bg.mp3
100
+ ```
101
+
102
+ | Option | Default | Description |
103
+ |--------|---------|-------------|
104
+ | `-d, --duration` | `30` | Duration in seconds (3-120) |
105
+ | `-o, --output` | auto | Output path (.mp3) |
106
+ | `--json` | `false` | JSON output |
107
+
108
+ ### `pixcli sfx <prompt>` — Generate sound effects
109
+
110
+ ```bash
111
+ pixcli sfx "Smooth cinematic whoosh" -d 1.5 -o whoosh.mp3
112
+ pixcli sfx "Soft digital click" -d 0.5 -o click.mp3
113
+ ```
114
+
115
+ | Option | Default | Description |
116
+ |--------|---------|-------------|
117
+ | `-d, --duration` | `5` | Duration in seconds (0.5-22) |
118
+ | `-o, --output` | auto | Output path (.mp3) |
119
+ | `--json` | `false` | JSON output |
120
+
121
+ ## Global options
122
+
123
+ | Option | Description |
124
+ |--------|-------------|
125
+ | `--key <key>` | Override `PIXCLI_API_KEY` |
126
+ | `--api-url <url>` | Override API URL (default: `https://pixcli.shellbot.sh`) |
127
+ | `--version` | Show version |
128
+ | `--help` | Show help |
129
+
130
+ ## JSON mode
131
+
132
+ All commands support `--json` for machine-readable output:
133
+
134
+ ```bash
135
+ pixcli image "hero shot" --json | jq '.files[0].path'
136
+ ```
137
+
138
+ ```json
139
+ {
140
+ "job_id": "abc123",
141
+ "status": "completed",
142
+ "files": [{ "path": "hero-shot.png", "width": 1024, "height": 1024, "mime_type": "image/png" }],
143
+ "model": "flux-pro",
144
+ "cost": 100000,
145
+ "elapsed_ms": 12340
146
+ }
147
+ ```
148
+
149
+ ## Models
150
+
151
+ ### Image generation
152
+ `flux-pro`, `flux-dev`, `seedream-v5`, `nano-banana-pro`, `nano-banana-2`, `imagen-4`, `imagen-4-fast`, `gpt-image-1`
153
+
154
+ ### Image editing
155
+ `seedream-v5-edit`, `phota-enhance`, `rembg`, `recraft-upscale`, `aura-sr`
156
+
157
+ ### Video
158
+ `kling-v3-pro-i2v`, `veo3-i2v`, `wan-v2-i2v`, `minimax-i2v`, `ltx-t2v`, `veo3-t2v`, `grok-extend-video`
159
+
160
+ ### Audio
161
+ `elevenlabs-tts-v3`, `elevenlabs-music`, `elevenlabs-sfx`
162
+
163
+ ## Requirements
164
+
165
+ - Node.js 18+
166
+ - `PIXCLI_API_KEY` environment variable
167
+
168
+ ## License
169
+
170
+ MIT
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const musicCommand: Command;
@@ -0,0 +1,90 @@
1
+ import { Command } from "commander";
2
+ import { PixClient } from "../lib/client.js";
3
+ import { resolveApiKey, resolveBaseUrl } from "../lib/config.js";
4
+ import { pollJob, getJobResult } from "../lib/poller.js";
5
+ import { downloadAssets } from "../lib/download.js";
6
+ import { setJsonMode, isJsonMode, startSpinner, updateSpinner, succeedSpinner, failSpinner, printSuccess, printInfo, printJson, printError, } from "../lib/output.js";
7
+ import { ApiError } from "../lib/client.js";
8
+ export const musicCommand = new Command("music")
9
+ .description("Generate background music from a text prompt")
10
+ .argument("<prompt>", "Description of the music to generate")
11
+ .option("-d, --duration <seconds>", "Duration in seconds (3-120)", "30")
12
+ .option("-o, --output <path>", "Output file path (.mp3)")
13
+ .option("--json", "Output machine-readable JSON", false)
14
+ .action(async (prompt, opts) => {
15
+ const globalOpts = musicCommand.parent?.opts();
16
+ if (opts.json)
17
+ setJsonMode(true);
18
+ let client;
19
+ try {
20
+ const apiKey = resolveApiKey(globalOpts);
21
+ const baseUrl = resolveBaseUrl(globalOpts);
22
+ client = new PixClient(baseUrl, apiKey);
23
+ }
24
+ catch (err) {
25
+ printError(err.message);
26
+ process.exit(1);
27
+ }
28
+ const start = Date.now();
29
+ try {
30
+ startSpinner("Generating music...");
31
+ const response = await client.post("/api/v1/audio/music", {
32
+ prompt,
33
+ duration: parseInt(opts.duration, 10),
34
+ });
35
+ if (!isJsonMode()) {
36
+ printInfo(`Job ${response.job_id} submitted (model: ${response.model || "auto"})`);
37
+ }
38
+ updateSpinner("Processing...");
39
+ const finalStatus = await pollJob(client, response.job_id, {
40
+ timeoutMs: 180_000, // 3 min for music
41
+ onStatus: () => { },
42
+ });
43
+ if (finalStatus.status !== "completed") {
44
+ failSpinner(`Job failed: ${finalStatus.error || "unknown error"}`);
45
+ if (isJsonMode()) {
46
+ printJson({ job_id: response.job_id, status: finalStatus.status, error: finalStatus.error, elapsed_ms: Date.now() - start });
47
+ }
48
+ process.exit(1);
49
+ }
50
+ const result = await getJobResult(client, response.job_id);
51
+ if (result.assets.length === 0) {
52
+ failSpinner("No assets returned");
53
+ process.exit(1);
54
+ }
55
+ updateSpinner("Downloading...");
56
+ const files = await downloadAssets(client, result.assets, prompt, opts.output);
57
+ const elapsed = Date.now() - start;
58
+ succeedSpinner("Done!");
59
+ if (isJsonMode()) {
60
+ printJson({
61
+ job_id: response.job_id,
62
+ status: "completed",
63
+ files: files.map((f) => ({ path: f.path, mime_type: f.mime_type })),
64
+ model: response.model,
65
+ cost: finalStatus.cost,
66
+ elapsed_ms: elapsed,
67
+ });
68
+ }
69
+ else {
70
+ for (const f of files)
71
+ printSuccess(`Created ${f.path}`);
72
+ printInfo(`${files.length} file(s) · ${(elapsed / 1000).toFixed(1)}s · cost: ${finalStatus.cost ?? "n/a"}`);
73
+ }
74
+ }
75
+ catch (err) {
76
+ failSpinner("Failed");
77
+ if (err instanceof ApiError) {
78
+ printError(`API error (${err.status}): ${err.message}`);
79
+ if (isJsonMode())
80
+ printJson({ error: err.message, status: err.status, elapsed_ms: Date.now() - start });
81
+ }
82
+ else {
83
+ printError(err.message);
84
+ if (isJsonMode())
85
+ printJson({ error: err.message, elapsed_ms: Date.now() - start });
86
+ }
87
+ process.exit(1);
88
+ }
89
+ });
90
+ //# sourceMappingURL=music.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"music.js","sourceRoot":"","sources":["../../src/commands/music.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACN,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAU5C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC9C,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC5D,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,EAAE,IAAI,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,8BAA8B,EAAE,KAAK,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAI,EAAE,EAAE;IACtC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,EAAgB,CAAC;IAE7D,IAAI,IAAI,CAAC,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,MAAiB,CAAC;IACtB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,IAAI,CAAC;QACJ,YAAY,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,qBAAqB,EAAE;YACzE,MAAM;YACN,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACnB,SAAS,CAAC,OAAO,QAAQ,CAAC,MAAM,sBAAsB,QAAQ,CAAC,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;YAC1D,SAAS,EAAE,OAAO,EAAE,kBAAkB;YACtC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;SAClB,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACxC,WAAW,CAAC,eAAe,WAAW,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YACnE,IAAI,UAAU,EAAE,EAAE,CAAC;gBAClB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC9H,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,WAAW,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,IAAI,UAAU,EAAE,EAAE,CAAC;YAClB,SAAS,CAAC;gBACT,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBACnE,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,UAAU,EAAE,OAAO;aACnB,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,WAAW,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAC7G,CAAC;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC7B,UAAU,CAAC,cAAc,GAAG,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,IAAI,UAAU,EAAE;gBAAE,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACP,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,UAAU,EAAE;gBAAE,SAAS,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const sfxCommand: Command;
@@ -0,0 +1,89 @@
1
+ import { Command } from "commander";
2
+ import { PixClient } from "../lib/client.js";
3
+ import { resolveApiKey, resolveBaseUrl } from "../lib/config.js";
4
+ import { pollJob, getJobResult } from "../lib/poller.js";
5
+ import { downloadAssets } from "../lib/download.js";
6
+ import { setJsonMode, isJsonMode, startSpinner, updateSpinner, succeedSpinner, failSpinner, printSuccess, printInfo, printJson, printError, } from "../lib/output.js";
7
+ import { ApiError } from "../lib/client.js";
8
+ export const sfxCommand = new Command("sfx")
9
+ .description("Generate a sound effect from a text description")
10
+ .argument("<prompt>", "Description of the sound effect to generate")
11
+ .option("-d, --duration <seconds>", "Duration in seconds (0.5-22)", "5")
12
+ .option("-o, --output <path>", "Output file path (.mp3)")
13
+ .option("--json", "Output machine-readable JSON", false)
14
+ .action(async (prompt, opts) => {
15
+ const globalOpts = sfxCommand.parent?.opts();
16
+ if (opts.json)
17
+ setJsonMode(true);
18
+ let client;
19
+ try {
20
+ const apiKey = resolveApiKey(globalOpts);
21
+ const baseUrl = resolveBaseUrl(globalOpts);
22
+ client = new PixClient(baseUrl, apiKey);
23
+ }
24
+ catch (err) {
25
+ printError(err.message);
26
+ process.exit(1);
27
+ }
28
+ const start = Date.now();
29
+ try {
30
+ startSpinner("Generating sound effect...");
31
+ const response = await client.post("/api/v1/audio/sfx", {
32
+ prompt,
33
+ duration: parseFloat(opts.duration),
34
+ });
35
+ if (!isJsonMode()) {
36
+ printInfo(`Job ${response.job_id} submitted (model: ${response.model || "auto"})`);
37
+ }
38
+ updateSpinner("Processing...");
39
+ const finalStatus = await pollJob(client, response.job_id, {
40
+ onStatus: () => { },
41
+ });
42
+ if (finalStatus.status !== "completed") {
43
+ failSpinner(`Job failed: ${finalStatus.error || "unknown error"}`);
44
+ if (isJsonMode()) {
45
+ printJson({ job_id: response.job_id, status: finalStatus.status, error: finalStatus.error, elapsed_ms: Date.now() - start });
46
+ }
47
+ process.exit(1);
48
+ }
49
+ const result = await getJobResult(client, response.job_id);
50
+ if (result.assets.length === 0) {
51
+ failSpinner("No assets returned");
52
+ process.exit(1);
53
+ }
54
+ updateSpinner("Downloading...");
55
+ const files = await downloadAssets(client, result.assets, prompt, opts.output);
56
+ const elapsed = Date.now() - start;
57
+ succeedSpinner("Done!");
58
+ if (isJsonMode()) {
59
+ printJson({
60
+ job_id: response.job_id,
61
+ status: "completed",
62
+ files: files.map((f) => ({ path: f.path, mime_type: f.mime_type })),
63
+ model: response.model,
64
+ cost: finalStatus.cost,
65
+ elapsed_ms: elapsed,
66
+ });
67
+ }
68
+ else {
69
+ for (const f of files)
70
+ printSuccess(`Created ${f.path}`);
71
+ printInfo(`${files.length} file(s) · ${(elapsed / 1000).toFixed(1)}s · cost: ${finalStatus.cost ?? "n/a"}`);
72
+ }
73
+ }
74
+ catch (err) {
75
+ failSpinner("Failed");
76
+ if (err instanceof ApiError) {
77
+ printError(`API error (${err.status}): ${err.message}`);
78
+ if (isJsonMode())
79
+ printJson({ error: err.message, status: err.status, elapsed_ms: Date.now() - start });
80
+ }
81
+ else {
82
+ printError(err.message);
83
+ if (isJsonMode())
84
+ printJson({ error: err.message, elapsed_ms: Date.now() - start });
85
+ }
86
+ process.exit(1);
87
+ }
88
+ });
89
+ //# sourceMappingURL=sfx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfx.js","sourceRoot":"","sources":["../../src/commands/sfx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const videoCommand: Command;
@@ -0,0 +1,161 @@
1
+ import { Command } from "commander";
2
+ import { PixClient } from "../lib/client.js";
3
+ import { resolveApiKey, resolveBaseUrl } from "../lib/config.js";
4
+ import { pollJob, getJobResult } from "../lib/poller.js";
5
+ import { downloadAssets } from "../lib/download.js";
6
+ import { setJsonMode, isJsonMode, startSpinner, updateSpinner, succeedSpinner, failSpinner, printSuccess, printInfo, printJson, printError, } from "../lib/output.js";
7
+ import { ApiError } from "../lib/client.js";
8
+ import { resolveImageArg, resolveVideoArg } from "../lib/upload.js";
9
+ export const videoCommand = new Command("video")
10
+ .description("Generate a video from a text prompt and optional source image")
11
+ .argument("<prompt>", "Text description of the video to generate")
12
+ .option("--from <path-or-url>", "Source image (I2V) or video (extend) — local file or URL")
13
+ .option("-d, --duration <seconds>", "Duration in seconds (2-10)", "5")
14
+ .option("-r, --ratio <ratio>", "Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)", "16:9")
15
+ .option("-q, --quality <level>", "Quality level (draft, standard, high)", "standard")
16
+ .option("-m, --model <model>", "Specific model ID (uses advanced endpoint)")
17
+ .option("-o, --output <path>", "Output file or directory path")
18
+ .option("--json", "Output machine-readable JSON", false)
19
+ .option("--no-enrich", "Skip prompt enrichment (advanced mode only)")
20
+ .option("--extend", "Extend the source video instead of generating from image", false)
21
+ .action(async (prompt, opts) => {
22
+ const globalOpts = videoCommand.parent?.opts();
23
+ if (opts.json)
24
+ setJsonMode(true);
25
+ let client;
26
+ try {
27
+ const apiKey = resolveApiKey(globalOpts);
28
+ const baseUrl = resolveBaseUrl(globalOpts);
29
+ client = new PixClient(baseUrl, apiKey);
30
+ }
31
+ catch (err) {
32
+ printError(err.message);
33
+ process.exit(1);
34
+ }
35
+ const start = Date.now();
36
+ try {
37
+ let fromUrl;
38
+ if (opts.from) {
39
+ startSpinner("Preparing...");
40
+ if (opts.extend) {
41
+ fromUrl = await resolveVideoArg(client, opts.from, () => {
42
+ updateSpinner("Uploading source video...");
43
+ });
44
+ }
45
+ else {
46
+ fromUrl = await resolveImageArg(client, opts.from, () => {
47
+ updateSpinner("Uploading source image...");
48
+ });
49
+ }
50
+ }
51
+ let response;
52
+ const duration = parseInt(opts.duration, 10);
53
+ if (opts.extend) {
54
+ if (!fromUrl) {
55
+ printError("--extend requires --from <video>");
56
+ process.exit(1);
57
+ }
58
+ startSpinner("Extending video...");
59
+ response = await client.post("/api/v1/video/extend", {
60
+ prompt,
61
+ video: fromUrl,
62
+ duration,
63
+ });
64
+ }
65
+ else if (opts.model) {
66
+ startSpinner(`Generating video with ${opts.model}...`);
67
+ response = await client.post("/api/v1/video/advanced", {
68
+ prompt,
69
+ model: opts.model,
70
+ image: fromUrl,
71
+ enrich_prompt: opts.enrich !== false ? true : false,
72
+ params: {
73
+ duration,
74
+ aspect_ratio: opts.ratio,
75
+ },
76
+ });
77
+ }
78
+ else {
79
+ startSpinner("Generating video...");
80
+ response = await client.post("/api/v1/video", {
81
+ prompt,
82
+ image: fromUrl,
83
+ duration,
84
+ aspect_ratio: opts.ratio,
85
+ quality: opts.quality,
86
+ });
87
+ }
88
+ if (!isJsonMode()) {
89
+ printInfo(`Job ${response.job_id} submitted (model: ${response.model || "auto"})`);
90
+ }
91
+ updateSpinner("Processing...");
92
+ const finalStatus = await pollJob(client, response.job_id, {
93
+ timeoutMs: 300_000, // 5 min for video
94
+ onStatus: (s) => {
95
+ if (s.total_steps > 1) {
96
+ updateSpinner(`Processing step ${s.current_step}/${s.total_steps}...`);
97
+ }
98
+ },
99
+ });
100
+ if (finalStatus.status !== "completed") {
101
+ failSpinner(`Job failed: ${finalStatus.error || "unknown error"}`);
102
+ if (isJsonMode()) {
103
+ printJson({
104
+ job_id: response.job_id,
105
+ status: finalStatus.status,
106
+ error: finalStatus.error,
107
+ elapsed_ms: Date.now() - start,
108
+ });
109
+ }
110
+ process.exit(1);
111
+ }
112
+ const result = await getJobResult(client, response.job_id);
113
+ if (result.assets.length === 0) {
114
+ failSpinner("No assets returned");
115
+ process.exit(1);
116
+ }
117
+ updateSpinner("Downloading...");
118
+ const files = await downloadAssets(client, result.assets, prompt, opts.output);
119
+ const elapsed = Date.now() - start;
120
+ succeedSpinner("Done!");
121
+ if (isJsonMode()) {
122
+ printJson({
123
+ job_id: response.job_id,
124
+ status: "completed",
125
+ files: files.map((f) => ({
126
+ path: f.path,
127
+ width: f.width,
128
+ height: f.height,
129
+ mime_type: f.mime_type,
130
+ })),
131
+ model: response.model,
132
+ cost: finalStatus.cost,
133
+ elapsed_ms: elapsed,
134
+ });
135
+ }
136
+ else {
137
+ for (const f of files) {
138
+ const dims = f.width && f.height ? ` (${f.width}x${f.height})` : "";
139
+ printSuccess(`Created ${f.path}${dims}`);
140
+ }
141
+ printInfo(`${files.length} file(s) · ${(elapsed / 1000).toFixed(1)}s · cost: ${finalStatus.cost ?? "n/a"}`);
142
+ }
143
+ }
144
+ catch (err) {
145
+ failSpinner("Failed");
146
+ if (err instanceof ApiError) {
147
+ printError(`API error (${err.status}): ${err.message}`);
148
+ if (isJsonMode()) {
149
+ printJson({ error: err.message, status: err.status, elapsed_ms: Date.now() - start });
150
+ }
151
+ }
152
+ else {
153
+ printError(err.message);
154
+ if (isJsonMode()) {
155
+ printJson({ error: err.message, elapsed_ms: Date.now() - start });
156
+ }
157
+ }
158
+ process.exit(1);
159
+ }
160
+ });
161
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/commands/video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const voiceCommand: Command;
@@ -0,0 +1,91 @@
1
+ import { Command } from "commander";
2
+ import { PixClient } from "../lib/client.js";
3
+ import { resolveApiKey, resolveBaseUrl } from "../lib/config.js";
4
+ import { pollJob, getJobResult } from "../lib/poller.js";
5
+ import { downloadAssets } from "../lib/download.js";
6
+ import { setJsonMode, isJsonMode, startSpinner, updateSpinner, succeedSpinner, failSpinner, printSuccess, printInfo, printJson, printError, } from "../lib/output.js";
7
+ import { ApiError } from "../lib/client.js";
8
+ export const voiceCommand = new Command("voice")
9
+ .description("Generate speech from text (text-to-speech)")
10
+ .argument("<text>", "Text to convert to speech")
11
+ .option("--voice <name>", "Voice preset (Rachel, Aria, Roger, Sarah, Laura, Charlie, George, etc.)", "Rachel")
12
+ .option("--language <code>", "Language code (eng, spa, fra, deu, jpn, etc.)")
13
+ .option("-o, --output <path>", "Output file path (.mp3)")
14
+ .option("--json", "Output machine-readable JSON", false)
15
+ .action(async (text, opts) => {
16
+ const globalOpts = voiceCommand.parent?.opts();
17
+ if (opts.json)
18
+ setJsonMode(true);
19
+ let client;
20
+ try {
21
+ const apiKey = resolveApiKey(globalOpts);
22
+ const baseUrl = resolveBaseUrl(globalOpts);
23
+ client = new PixClient(baseUrl, apiKey);
24
+ }
25
+ catch (err) {
26
+ printError(err.message);
27
+ process.exit(1);
28
+ }
29
+ const start = Date.now();
30
+ try {
31
+ startSpinner("Generating speech...");
32
+ const response = await client.post("/api/v1/audio/voice", {
33
+ text,
34
+ voice: opts.voice,
35
+ language: opts.language,
36
+ });
37
+ if (!isJsonMode()) {
38
+ printInfo(`Job ${response.job_id} submitted (model: ${response.model || "auto"})`);
39
+ }
40
+ updateSpinner("Processing...");
41
+ const finalStatus = await pollJob(client, response.job_id, {
42
+ onStatus: () => { },
43
+ });
44
+ if (finalStatus.status !== "completed") {
45
+ failSpinner(`Job failed: ${finalStatus.error || "unknown error"}`);
46
+ if (isJsonMode()) {
47
+ printJson({ job_id: response.job_id, status: finalStatus.status, error: finalStatus.error, elapsed_ms: Date.now() - start });
48
+ }
49
+ process.exit(1);
50
+ }
51
+ const result = await getJobResult(client, response.job_id);
52
+ if (result.assets.length === 0) {
53
+ failSpinner("No assets returned");
54
+ process.exit(1);
55
+ }
56
+ updateSpinner("Downloading...");
57
+ const files = await downloadAssets(client, result.assets, text, opts.output);
58
+ const elapsed = Date.now() - start;
59
+ succeedSpinner("Done!");
60
+ if (isJsonMode()) {
61
+ printJson({
62
+ job_id: response.job_id,
63
+ status: "completed",
64
+ files: files.map((f) => ({ path: f.path, mime_type: f.mime_type })),
65
+ model: response.model,
66
+ cost: finalStatus.cost,
67
+ elapsed_ms: elapsed,
68
+ });
69
+ }
70
+ else {
71
+ for (const f of files)
72
+ printSuccess(`Created ${f.path}`);
73
+ printInfo(`${files.length} file(s) · ${(elapsed / 1000).toFixed(1)}s · cost: ${finalStatus.cost ?? "n/a"}`);
74
+ }
75
+ }
76
+ catch (err) {
77
+ failSpinner("Failed");
78
+ if (err instanceof ApiError) {
79
+ printError(`API error (${err.status}): ${err.message}`);
80
+ if (isJsonMode())
81
+ printJson({ error: err.message, status: err.status, elapsed_ms: Date.now() - start });
82
+ }
83
+ else {
84
+ printError(err.message);
85
+ if (isJsonMode())
86
+ printJson({ error: err.message, elapsed_ms: Date.now() - start });
87
+ }
88
+ process.exit(1);
89
+ }
90
+ });
91
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/commands/voice.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -2,14 +2,22 @@
2
2
  import { Command } from "commander";
3
3
  import { imageCommand } from "./commands/image.js";
4
4
  import { editCommand } from "./commands/edit.js";
5
+ import { videoCommand } from "./commands/video.js";
6
+ import { voiceCommand } from "./commands/voice.js";
7
+ import { musicCommand } from "./commands/music.js";
8
+ import { sfxCommand } from "./commands/sfx.js";
5
9
  const program = new Command();
6
10
  program
7
11
  .name("pixcli")
8
- .description("The creative toolkit for AI agents — generate and edit images from the command line.")
9
- .version("0.1.0")
12
+ .description("The creative toolkit for AI agents — generate images, videos, and audio from the command line.")
13
+ .version("0.2.0")
10
14
  .option("--key <api_key>", "API key (overrides PIXCLI_API_KEY env var)")
11
15
  .option("--api-url <url>", "Base API URL (overrides PIXCLI_API_URL env var)");
12
16
  program.addCommand(imageCommand);
13
17
  program.addCommand(editCommand);
18
+ program.addCommand(videoCommand);
19
+ program.addCommand(voiceCommand);
20
+ program.addCommand(musicCommand);
21
+ program.addCommand(sfxCommand);
14
22
  program.parse();
15
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sFAAsF,CAAC;KACnG,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC,CAAC;AAE/E,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACL,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gGAAgG,CAAC;KAC7G,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC,CAAC;AAE/E,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -8,6 +8,10 @@ const MIME_TO_EXT = {
8
8
  "image/svg+xml": ".svg",
9
9
  "video/mp4": ".mp4",
10
10
  "video/webm": ".webm",
11
+ "audio/mpeg": ".mp3",
12
+ "audio/wav": ".wav",
13
+ "audio/mp4": ".m4a",
14
+ "audio/ogg": ".ogg",
11
15
  };
12
16
  function slugify(text) {
13
17
  return text
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/lib/download.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/lib/download.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,11 @@ import type { PixClient } from "./client.js";
4
4
  * If it's already a URL, returns it as-is.
5
5
  */
6
6
  export declare function resolveImageArg(client: PixClient, value: string, onUploadStart?: () => void): Promise<string>;
7
+ /**
8
+ * If the value is a local video file, uploads it and returns the remote URL.
9
+ * If it's already a URL, returns it as-is.
10
+ */
11
+ export declare function resolveVideoArg(client: PixClient, value: string, onUploadStart?: () => void): Promise<string>;
7
12
  /**
8
13
  * Resolve an array of image arguments (local files or URLs) to remote URLs.
9
14
  */
@@ -8,6 +8,13 @@ const EXT_TO_MIME = {
8
8
  ".webp": "image/webp",
9
9
  ".gif": "image/gif",
10
10
  ".avif": "image/avif",
11
+ ".mp4": "video/mp4",
12
+ ".webm": "video/webm",
13
+ ".mov": "video/quicktime",
14
+ ".mp3": "audio/mpeg",
15
+ ".wav": "audio/wav",
16
+ ".m4a": "audio/mp4",
17
+ ".ogg": "audio/ogg",
11
18
  };
12
19
  function isLocalPath(value) {
13
20
  if (value.startsWith("http://") || value.startsWith("https://"))
@@ -16,7 +23,7 @@ function isLocalPath(value) {
16
23
  }
17
24
  function mimeFromPath(filePath) {
18
25
  const ext = filePath.toLowerCase().match(/\.\w+$/)?.[0] || "";
19
- return EXT_TO_MIME[ext] || "image/png";
26
+ return EXT_TO_MIME[ext] || "application/octet-stream";
20
27
  }
21
28
  /**
22
29
  * If the value is a local file path, uploads it and returns the remote URL.
@@ -38,6 +45,13 @@ export async function resolveImageArg(client, value, onUploadStart) {
38
45
  const result = await client.upload("/api/v1/uploads", formData);
39
46
  return result.url;
40
47
  }
48
+ /**
49
+ * If the value is a local video file, uploads it and returns the remote URL.
50
+ * If it's already a URL, returns it as-is.
51
+ */
52
+ export async function resolveVideoArg(client, value, onUploadStart) {
53
+ return resolveImageArg(client, value, onUploadStart);
54
+ }
41
55
  /**
42
56
  * Resolve an array of image arguments (local files or URLs) to remote URLs.
43
57
  */
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,WAAW,GAA2B;IAC3C,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;CACrB,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa;IACjC,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,MAAiB,EACjB,KAAa,EACb,aAA0B;IAE1B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,aAAa,EAAE,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,MAAiB,EACjB,MAAgB,EAChB,aAAsD;IAEtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,eAAe,CAChC,MAAM,EACN,MAAM,CAAC,CAAC,CAAC,EACT,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAC3C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixcli",
3
- "version": "0.1.1",
3
+ "version": "0.2.2",
4
4
  "description": "The creative toolkit for AI agents — generate images, edit visuals, and more from the command line.",
5
5
  "type": "module",
6
6
  "bin": {