@teamflojo/floimg 0.2.0 → 0.3.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/QUICK_START.md ADDED
@@ -0,0 +1,199 @@
1
+ # Quick Start Guide
2
+
3
+ Get started with floimg in seconds using `npx` - no installation required.
4
+
5
+ ## Try It Now
6
+
7
+ ```bash
8
+ # Generate a QR code
9
+ npx @teamflojo/floimg qr "https://floimg.com" -o qr.png
10
+
11
+ # Create a chart
12
+ npx @teamflojo/floimg chart bar --labels "Q1,Q2,Q3" --values "10,20,30" -o chart.png
13
+
14
+ # Resize an image
15
+ npx @teamflojo/floimg resize photo.jpg 800x600 -o thumbnail.jpg
16
+
17
+ # Convert format (PNG to WebP)
18
+ npx @teamflojo/floimg convert image.png -o image.webp
19
+ ```
20
+
21
+ ## How Plugin Auto-Install Works
22
+
23
+ floimg is modular. The core package is lightweight, and plugins are installed on-demand.
24
+
25
+ When you run a command that requires a plugin (like `qr` or `chart`), floimg will:
26
+
27
+ 1. Check if the required plugin is installed
28
+ 2. If not, prompt you to install it
29
+ 3. Install and run your command
30
+
31
+ ```
32
+ $ npx @teamflojo/floimg qr "https://example.com"
33
+
34
+ šŸ” The 'qr' command requires @teamflojo/floimg-qr
35
+ QR Code Generator
36
+
37
+ Install it now? (y/n): y
38
+ šŸ“¦ Installing @teamflojo/floimg-qr...
39
+ āœ… Installed!
40
+
41
+ āœ… QR code saved to: qr.png
42
+ ```
43
+
44
+ **After the first run**, the plugin is cached and subsequent runs are fast.
45
+
46
+ ## Interactive Mode
47
+
48
+ Run floimg with no arguments to see an interactive menu:
49
+
50
+ ```bash
51
+ npx @teamflojo/floimg
52
+ ```
53
+
54
+ This shows all available commands and examples.
55
+
56
+ ## Command Reference
57
+
58
+ ### QR Code
59
+
60
+ ```bash
61
+ floimg qr <text> [options]
62
+
63
+ Options:
64
+ -o, --out <path> Output file (default: qr.png)
65
+ -s, --size <pixels> Size in pixels (default: 300)
66
+ -f, --format <format> png or svg (default: png)
67
+ -e, --error-correction L, M, Q, or H (default: M)
68
+ --dark <color> Dark color hex (default: #000000)
69
+ --light <color> Light color hex (default: #ffffff)
70
+
71
+ Examples:
72
+ floimg qr "https://floimg.com" -o qr.png
73
+ floimg qr "Hello World" --size 400 --format svg -o hello.svg
74
+ floimg qr "https://example.com" --error-correction H --dark "#1a1a2e"
75
+ ```
76
+
77
+ ### Chart
78
+
79
+ ```bash
80
+ floimg chart <type> [options]
81
+
82
+ Types: bar, line, pie, doughnut, radar, polarArea, scatter
83
+
84
+ Options:
85
+ -o, --out <path> Output file (default: chart.png)
86
+ -l, --labels <items> Comma-separated labels
87
+ -v, --values <items> Comma-separated values
88
+ -d, --data <file> JSON file with Chart.js config
89
+ --title <text> Chart title
90
+ -w, --width <pixels> Width (default: 500)
91
+ -h, --height <pixels> Height (default: 300)
92
+ -f, --format <format> png, svg, or webp (default: png)
93
+
94
+ Examples:
95
+ floimg chart bar --labels "A,B,C" --values "10,20,30" -o chart.png
96
+ floimg chart pie --labels "Yes,No" --values "70,30" --title "Survey Results"
97
+ floimg chart line --data sales.json -o sales-chart.png
98
+ ```
99
+
100
+ ### Resize
101
+
102
+ ```bash
103
+ floimg resize <input> <size> [options]
104
+
105
+ Size formats: WIDTHxHEIGHT (e.g., 800x600) or WIDTH (e.g., 800)
106
+
107
+ Options:
108
+ -o, --out <path> Output file (default: input-resized.ext)
109
+ --fit <mode> cover, contain, fill, inside, outside
110
+ --position <pos> center, top, bottom, left, right, etc.
111
+ --background <color> Background color for contain mode
112
+
113
+ Examples:
114
+ floimg resize photo.jpg 800x600 -o thumbnail.jpg
115
+ floimg resize hero.png 1200 -o hero-resized.png
116
+ floimg resize logo.png 200x200 --fit contain --background "#ffffff"
117
+ ```
118
+
119
+ ### Convert
120
+
121
+ ```bash
122
+ floimg convert <input> [options]
123
+
124
+ Options:
125
+ -o, --out <path> Output file (format inferred from extension)
126
+ -t, --to <format> Target format: png, jpg, webp, avif, svg
127
+ -q, --quality <number> Quality for lossy formats (1-100)
128
+
129
+ Examples:
130
+ floimg convert photo.png -o photo.webp
131
+ floimg convert image.jpg --to avif -o optimized.avif
132
+ floimg convert screenshot.png -o screenshot.jpg --quality 85
133
+ ```
134
+
135
+ ## Performance Tips
136
+
137
+ ### First Run
138
+
139
+ The first run with npx will:
140
+ - Download the @teamflojo/floimg package
141
+ - Compile native dependencies (sharp, canvas)
142
+ - This takes ~10-15 seconds
143
+
144
+ ### Subsequent Runs
145
+
146
+ After the first run:
147
+ - npx caches the package in `~/.npm/_npx/`
148
+ - Runs take ~2-3 seconds
149
+ - This is normal and matches tools like prettier, eslint
150
+
151
+ ### For Frequent Use
152
+
153
+ If you use floimg often, install it globally for faster startup:
154
+
155
+ ```bash
156
+ npm install -g @teamflojo/floimg
157
+ ```
158
+
159
+ Then just run `floimg` directly (no npx needed).
160
+
161
+ ## Troubleshooting
162
+
163
+ ### "Cannot find module" errors
164
+
165
+ This usually means native dependencies failed to compile. Try:
166
+
167
+ ```bash
168
+ # Clear npx cache and retry
169
+ rm -rf ~/.npm/_npx
170
+ npx @teamflojo/floimg doctor
171
+ ```
172
+
173
+ ### Plugin not installing
174
+
175
+ If auto-install fails in CI/scripts (non-interactive mode):
176
+
177
+ ```bash
178
+ # Pre-install plugins explicitly
179
+ npm install @teamflojo/floimg-qr @teamflojo/floimg-quickchart
180
+
181
+ # Then run commands
182
+ npx @teamflojo/floimg qr "text" --no-auto-install
183
+ ```
184
+
185
+ ### Permission errors
186
+
187
+ If you get EACCES errors:
188
+
189
+ ```bash
190
+ # Fix npm permissions
191
+ sudo chown -R $(whoami) ~/.npm
192
+ ```
193
+
194
+ ## Next Steps
195
+
196
+ - **[Full CLI Reference](https://floimg.com/docs/cli)** - All commands and options
197
+ - **[Library API](https://floimg.com/docs/api)** - Use floimg in your code
198
+ - **[MCP Integration](https://floimg.com/docs/mcp)** - Use with Claude/AI agents
199
+ - **[Plugin Development](https://floimg.com/docs/plugins)** - Create custom generators
@@ -0,0 +1,20 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Shorthand command for generating charts
4
+ *
5
+ * This command auto-installs @teamflojo/floimg-quickchart if not present.
6
+ *
7
+ * @example
8
+ * ```bash
9
+ * # Bar chart with inline data
10
+ * floimg chart bar --labels "Q1,Q2,Q3,Q4" --values "10,20,30,40" -o chart.png
11
+ *
12
+ * # Chart from JSON file
13
+ * floimg chart line --data sales.json -o sales-chart.png
14
+ *
15
+ * # Pie chart with title
16
+ * floimg chart pie --labels "A,B,C" --values "30,50,20" --title "Distribution"
17
+ * ```
18
+ */
19
+ export declare const chartCommand: Command;
20
+ //# sourceMappingURL=chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/chart.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,SAqHrB,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { readFile, writeFile } from "fs/promises";
2
+ import { Command } from "commander";
3
+ import createClient from "../../index.js";
4
+ import { loadConfig } from "../../config/loader.js";
5
+ import { loadPlugin, showNpxTip } from "../utils/plugin-loader.js";
6
+ /**
7
+ * Shorthand command for generating charts
8
+ *
9
+ * This command auto-installs @teamflojo/floimg-quickchart if not present.
10
+ *
11
+ * @example
12
+ * ```bash
13
+ * # Bar chart with inline data
14
+ * floimg chart bar --labels "Q1,Q2,Q3,Q4" --values "10,20,30,40" -o chart.png
15
+ *
16
+ * # Chart from JSON file
17
+ * floimg chart line --data sales.json -o sales-chart.png
18
+ *
19
+ * # Pie chart with title
20
+ * floimg chart pie --labels "A,B,C" --values "30,50,20" --title "Distribution"
21
+ * ```
22
+ */
23
+ export const chartCommand = new Command("chart")
24
+ .description("Generate a chart (auto-installs @teamflojo/floimg-quickchart if needed)")
25
+ .argument("<type>", "Chart type: bar, line, pie, doughnut, radar, polarArea, scatter")
26
+ .option("-o, --out <path>", "Output file path (default: chart.png)", "chart.png")
27
+ .option("-d, --data <file>", "JSON file with Chart.js data configuration")
28
+ .option("-l, --labels <items>", "Comma-separated labels (e.g., 'Q1,Q2,Q3,Q4')")
29
+ .option("-v, --values <items>", "Comma-separated values (e.g., '10,20,30,40')")
30
+ .option("--title <text>", "Chart title")
31
+ .option("-w, --width <pixels>", "Width in pixels", "500")
32
+ .option("-h, --height <pixels>", "Height in pixels", "300")
33
+ .option("--background <color>", "Background color", "transparent")
34
+ .option("-f, --format <format>", "Output format: png, svg, webp", "png")
35
+ .option("--no-auto-install", "Don't prompt to install missing plugins")
36
+ .option("--config <path>", "Path to config file")
37
+ .action(async (type, options) => {
38
+ try {
39
+ const config = await loadConfig(options.config);
40
+ const client = createClient(config);
41
+ // Load the QuickChart plugin (auto-installs if needed)
42
+ const quickchartPlugin = await loadPlugin("quickchart", options.autoInstall !== false);
43
+ if (!quickchartPlugin) {
44
+ process.exit(1);
45
+ }
46
+ client.registerGenerator(quickchartPlugin.default());
47
+ // Build chart data
48
+ let chartData;
49
+ if (options.data) {
50
+ // Load from JSON file
51
+ const fileContent = await readFile(options.data, "utf-8");
52
+ chartData = JSON.parse(fileContent);
53
+ }
54
+ else if (options.labels && options.values) {
55
+ // Build from command line options
56
+ const labels = options.labels.split(",").map((s) => s.trim());
57
+ const values = options.values.split(",").map((s) => parseFloat(s.trim()));
58
+ chartData = {
59
+ labels,
60
+ datasets: [
61
+ {
62
+ label: options.title || "Data",
63
+ data: values,
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ else {
69
+ console.error("Error: Provide --data <file> or both --labels and --values");
70
+ console.error("");
71
+ console.error("Examples:");
72
+ console.error(' floimg chart bar --labels "A,B,C" --values "10,20,30" -o chart.png');
73
+ console.error(" floimg chart line --data sales.json -o chart.png");
74
+ process.exit(1);
75
+ }
76
+ // Build chart options
77
+ const chartOptions = {};
78
+ if (options.title) {
79
+ chartOptions.plugins = {
80
+ title: {
81
+ display: true,
82
+ text: options.title,
83
+ },
84
+ };
85
+ }
86
+ const blob = await client.generate({
87
+ generator: "quickchart",
88
+ params: {
89
+ type,
90
+ data: chartData,
91
+ options: chartOptions,
92
+ width: parseInt(options.width, 10),
93
+ height: parseInt(options.height, 10),
94
+ backgroundColor: options.background,
95
+ format: options.format,
96
+ },
97
+ });
98
+ // Determine output path with correct extension
99
+ let outPath = options.out;
100
+ const extMap = {
101
+ png: ".png",
102
+ svg: ".svg",
103
+ webp: ".webp",
104
+ };
105
+ if (outPath === "chart.png" && options.format !== "png") {
106
+ outPath = `chart${extMap[options.format] || ".png"}`;
107
+ }
108
+ if (outPath.includes("://")) {
109
+ // Cloud storage
110
+ const result = await client.save(blob, outPath);
111
+ console.log(`āœ… Chart saved to: ${result.location}`);
112
+ }
113
+ else {
114
+ // Local file
115
+ await writeFile(outPath, blob.bytes);
116
+ console.log(`āœ… Chart saved to: ${outPath}`);
117
+ }
118
+ // Show tip for npx users
119
+ showNpxTip();
120
+ }
121
+ catch (error) {
122
+ console.error("Error generating chart:", error instanceof Error ? error.message : error);
123
+ process.exit(1);
124
+ }
125
+ });
126
+ //# sourceMappingURL=chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.js","sourceRoot":"","sources":["../../../src/cli/commands/chart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Shorthand command for converting image formats
4
+ *
5
+ * @example
6
+ * ```bash
7
+ * # Convert to WebP (format inferred from output extension)
8
+ * floimg convert input.png -o output.webp
9
+ *
10
+ * # Explicit format specification
11
+ * floimg convert input.png --to webp -o output.webp
12
+ *
13
+ * # With quality setting
14
+ * floimg convert input.png -o output.jpg --quality 85
15
+ * ```
16
+ */
17
+ export declare const convertCommand: Command;
18
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/convert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,SA2FvB,CAAC"}
@@ -0,0 +1,122 @@
1
+ import { readFile, writeFile } from "fs/promises";
2
+ import { Command } from "commander";
3
+ import createClient from "../../index.js";
4
+ import { loadConfig } from "../../config/loader.js";
5
+ /**
6
+ * Detect MIME type from file extension
7
+ */
8
+ function detectMime(filepath) {
9
+ const ext = filepath.split(".").pop()?.toLowerCase();
10
+ const mimeMap = {
11
+ png: "image/png",
12
+ jpg: "image/jpeg",
13
+ jpeg: "image/jpeg",
14
+ webp: "image/webp",
15
+ avif: "image/avif",
16
+ svg: "image/svg+xml",
17
+ };
18
+ return mimeMap[ext || ""] || "image/png";
19
+ }
20
+ /**
21
+ * Get format from output path extension
22
+ */
23
+ function getFormatFromPath(filepath) {
24
+ return detectMime(filepath);
25
+ }
26
+ /**
27
+ * Shorthand command for converting image formats
28
+ *
29
+ * @example
30
+ * ```bash
31
+ * # Convert to WebP (format inferred from output extension)
32
+ * floimg convert input.png -o output.webp
33
+ *
34
+ * # Explicit format specification
35
+ * floimg convert input.png --to webp -o output.webp
36
+ *
37
+ * # With quality setting
38
+ * floimg convert input.png -o output.jpg --quality 85
39
+ * ```
40
+ */
41
+ export const convertCommand = new Command("convert")
42
+ .description("Convert image format (shorthand for transform --op convert)")
43
+ .argument("<input>", "Input image file")
44
+ .option("-o, --out <path>", "Output file path (format inferred from extension)")
45
+ .option("-t, --to <format>", "Target format: png, jpg, jpeg, webp, avif, svg")
46
+ .option("-q, --quality <number>", "Quality for lossy formats (1-100)", "80")
47
+ .option("--config <path>", "Path to config file")
48
+ .action(async (input, options) => {
49
+ try {
50
+ const config = await loadConfig(options.config);
51
+ const client = createClient(config);
52
+ // Read input file
53
+ const inputBytes = await readFile(input);
54
+ const inputMime = detectMime(input);
55
+ const inputBlob = {
56
+ bytes: inputBytes,
57
+ mime: inputMime,
58
+ };
59
+ // Determine target format
60
+ let targetFormat;
61
+ if (options.to) {
62
+ // Explicit format specified
63
+ const formatMap = {
64
+ png: "image/png",
65
+ jpg: "image/jpeg",
66
+ jpeg: "image/jpeg",
67
+ webp: "image/webp",
68
+ avif: "image/avif",
69
+ svg: "image/svg+xml",
70
+ };
71
+ targetFormat = formatMap[options.to.toLowerCase()] || "image/png";
72
+ }
73
+ else if (options.out) {
74
+ // Infer from output extension
75
+ const inferred = getFormatFromPath(options.out);
76
+ if (!inferred) {
77
+ console.error("Error: Could not infer format from output path.");
78
+ console.error("Use --to to specify format explicitly.");
79
+ process.exit(1);
80
+ }
81
+ targetFormat = inferred;
82
+ }
83
+ else {
84
+ console.error("Error: Must specify --out or --to.");
85
+ process.exit(1);
86
+ }
87
+ const result = await client.transform({
88
+ blob: inputBlob,
89
+ op: "convert",
90
+ to: targetFormat,
91
+ params: {
92
+ quality: parseInt(options.quality, 10),
93
+ },
94
+ });
95
+ // Determine output path
96
+ const extMap = {
97
+ "image/png": "png",
98
+ "image/jpeg": "jpg",
99
+ "image/webp": "webp",
100
+ "image/avif": "avif",
101
+ "image/svg+xml": "svg",
102
+ };
103
+ const newExt = extMap[targetFormat] || "png";
104
+ const outPath = options.out || input.replace(/\.[^.]+$/, `.${newExt}`);
105
+ if (outPath.includes("://")) {
106
+ // Cloud storage
107
+ const saveResult = await client.save(result, outPath);
108
+ console.log(`Converted image saved to: ${saveResult.location}`);
109
+ }
110
+ else {
111
+ // Local file
112
+ await writeFile(outPath, result.bytes);
113
+ console.log(`Converted image saved to: ${outPath}`);
114
+ }
115
+ console.log(`Format: ${inputMime} → ${result.mime}`);
116
+ }
117
+ catch (error) {
118
+ console.error("Error converting image:", error instanceof Error ? error.message : error);
119
+ process.exit(1);
120
+ }
121
+ });
122
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/cli/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Shorthand command for generating QR codes
4
+ *
5
+ * This command auto-installs @teamflojo/floimg-qr if not present.
6
+ *
7
+ * @example
8
+ * ```bash
9
+ * # Basic usage - text as first argument
10
+ * floimg qr "https://floimg.com" -o qr.png
11
+ *
12
+ * # With options
13
+ * floimg qr "https://floimg.com" --size 400 --format svg -o qr.svg
14
+ *
15
+ * # High error correction
16
+ * floimg qr "https://floimg.com" --error-correction H
17
+ * ```
18
+ */
19
+ export declare const qrCommand: Command;
20
+ //# sourceMappingURL=qr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/qr.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,SAAS,SAqElB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { writeFile } from "fs/promises";
2
+ import { Command } from "commander";
3
+ import createClient from "../../index.js";
4
+ import { loadConfig } from "../../config/loader.js";
5
+ import { loadPlugin, showNpxTip } from "../utils/plugin-loader.js";
6
+ /**
7
+ * Shorthand command for generating QR codes
8
+ *
9
+ * This command auto-installs @teamflojo/floimg-qr if not present.
10
+ *
11
+ * @example
12
+ * ```bash
13
+ * # Basic usage - text as first argument
14
+ * floimg qr "https://floimg.com" -o qr.png
15
+ *
16
+ * # With options
17
+ * floimg qr "https://floimg.com" --size 400 --format svg -o qr.svg
18
+ *
19
+ * # High error correction
20
+ * floimg qr "https://floimg.com" --error-correction H
21
+ * ```
22
+ */
23
+ export const qrCommand = new Command("qr")
24
+ .description("Generate a QR code (auto-installs @teamflojo/floimg-qr if needed)")
25
+ .argument("<text>", "Text or URL to encode in the QR code")
26
+ .option("-o, --out <path>", "Output file path (default: qr.png)", "qr.png")
27
+ .option("-s, --size <pixels>", "Size in pixels", "300")
28
+ .option("-f, --format <format>", "Output format: png, svg", "png")
29
+ .option("-e, --error-correction <level>", "Error correction: L, M, Q, H", "M")
30
+ .option("-m, --margin <modules>", "Quiet zone margin", "4")
31
+ .option("--dark <color>", "Dark color (hex)", "#000000")
32
+ .option("--light <color>", "Light color (hex)", "#ffffff")
33
+ .option("--no-auto-install", "Don't prompt to install missing plugins")
34
+ .option("--config <path>", "Path to config file")
35
+ .action(async (text, options) => {
36
+ try {
37
+ const config = await loadConfig(options.config);
38
+ const client = createClient(config);
39
+ // Load the QR plugin (auto-installs if needed)
40
+ const qrPlugin = await loadPlugin("qr", options.autoInstall !== false);
41
+ if (!qrPlugin) {
42
+ process.exit(1);
43
+ }
44
+ client.registerGenerator(qrPlugin.default());
45
+ const blob = await client.generate({
46
+ generator: "qr",
47
+ params: {
48
+ text,
49
+ width: parseInt(options.size, 10),
50
+ format: options.format,
51
+ errorCorrectionLevel: options.errorCorrection,
52
+ margin: parseInt(options.margin, 10),
53
+ color: {
54
+ dark: options.dark,
55
+ light: options.light,
56
+ },
57
+ },
58
+ });
59
+ // Determine output path with correct extension
60
+ let outPath = options.out;
61
+ if (outPath === "qr.png" && options.format === "svg") {
62
+ outPath = "qr.svg";
63
+ }
64
+ if (outPath.includes("://")) {
65
+ // Cloud storage
66
+ const result = await client.save(blob, outPath);
67
+ console.log(`āœ… QR code saved to: ${result.location}`);
68
+ }
69
+ else {
70
+ // Local file
71
+ await writeFile(outPath, blob.bytes);
72
+ console.log(`āœ… QR code saved to: ${outPath}`);
73
+ }
74
+ // Show tip for npx users
75
+ showNpxTip();
76
+ }
77
+ catch (error) {
78
+ console.error("Error generating QR code:", error instanceof Error ? error.message : error);
79
+ process.exit(1);
80
+ }
81
+ });
82
+ //# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../src/cli/commands/qr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;KACvC,WAAW,CAAC,mEAAmE,CAAC;KAChF,QAAQ,CAAC,QAAQ,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,kBAAkB,EAAE,oCAAoC,EAAE,QAAQ,CAAC;KAC1E,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,KAAK,CAAC;KACtD,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,EAAE,KAAK,CAAC;KACjE,MAAM,CAAC,gCAAgC,EAAE,8BAA8B,EAAE,GAAG,CAAC;KAC7E,MAAM,CAAC,wBAAwB,EAAE,mBAAmB,EAAE,GAAG,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,SAAS,CAAC;KACvD,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,SAAS,CAAC;KACzD,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,IAAI,EACJ,OAAO,CAAC,WAAW,KAAK,KAAK,CAC9B,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAoD,CAAC,CAAC;QAE/F,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACjC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN,IAAI;gBACJ,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,oBAAoB,EAAE,OAAO,CAAC,eAAe;gBAC7C,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB;aACF;SACF,CAAC,CAAC;QAEH,+CAA+C;QAC/C,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrD,OAAO,GAAG,QAAQ,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,gBAAgB;YAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,aAAa;YACb,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,yBAAyB;QACzB,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Shorthand command for resizing images
4
+ *
5
+ * @example
6
+ * ```bash
7
+ * # Resize to specific dimensions
8
+ * floimg resize input.jpg 800x600 -o output.jpg
9
+ *
10
+ * # Resize width only (maintain aspect ratio)
11
+ * floimg resize input.jpg 800 -o output.jpg
12
+ *
13
+ * # Fit within bounds
14
+ * floimg resize input.jpg 800x600 --fit contain -o output.jpg
15
+ * ```
16
+ */
17
+ export declare const resizeCommand: Command;
18
+ //# sourceMappingURL=resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/resize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,SAqEtB,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { readFile, writeFile } from "fs/promises";
2
+ import { Command } from "commander";
3
+ import createClient from "../../index.js";
4
+ import { loadConfig } from "../../config/loader.js";
5
+ /**
6
+ * Parse size argument in format "WIDTHxHEIGHT" or just "WIDTH"
7
+ */
8
+ function parseSize(size) {
9
+ if (size.includes("x")) {
10
+ const [w, h] = size.split("x").map((s) => parseInt(s, 10));
11
+ return { width: w, height: h };
12
+ }
13
+ // Single number = width, maintain aspect ratio
14
+ return { width: parseInt(size, 10) };
15
+ }
16
+ /**
17
+ * Detect MIME type from file extension
18
+ */
19
+ function detectMime(filepath) {
20
+ const ext = filepath.split(".").pop()?.toLowerCase();
21
+ const mimeMap = {
22
+ png: "image/png",
23
+ jpg: "image/jpeg",
24
+ jpeg: "image/jpeg",
25
+ webp: "image/webp",
26
+ avif: "image/avif",
27
+ svg: "image/svg+xml",
28
+ };
29
+ return mimeMap[ext || ""] || "image/png";
30
+ }
31
+ /**
32
+ * Shorthand command for resizing images
33
+ *
34
+ * @example
35
+ * ```bash
36
+ * # Resize to specific dimensions
37
+ * floimg resize input.jpg 800x600 -o output.jpg
38
+ *
39
+ * # Resize width only (maintain aspect ratio)
40
+ * floimg resize input.jpg 800 -o output.jpg
41
+ *
42
+ * # Fit within bounds
43
+ * floimg resize input.jpg 800x600 --fit contain -o output.jpg
44
+ * ```
45
+ */
46
+ export const resizeCommand = new Command("resize")
47
+ .description("Resize an image (shorthand for transform --op resize)")
48
+ .argument("<input>", "Input image file")
49
+ .argument("<size>", "Target size: WIDTHxHEIGHT or WIDTH (e.g., 800x600 or 800)")
50
+ .option("-o, --out <path>", "Output file path")
51
+ .option("--fit <mode>", "Fit mode: cover, contain, fill, inside, outside", "cover")
52
+ .option("--position <pos>", "Position when cropping: center, top, bottom, left, right, etc.", "center")
53
+ .option("--background <color>", "Background color for contain mode", "#ffffff")
54
+ .option("--config <path>", "Path to config file")
55
+ .action(async (input, size, options) => {
56
+ try {
57
+ const config = await loadConfig(options.config);
58
+ const client = createClient(config);
59
+ // Read input file
60
+ const inputBytes = await readFile(input);
61
+ const mime = detectMime(input);
62
+ const inputBlob = {
63
+ bytes: inputBytes,
64
+ mime,
65
+ };
66
+ // Parse size
67
+ const { width, height } = parseSize(size);
68
+ const result = await client.transform({
69
+ blob: inputBlob,
70
+ op: "resize",
71
+ params: {
72
+ width,
73
+ height,
74
+ fit: options.fit,
75
+ position: options.position,
76
+ background: options.background,
77
+ },
78
+ });
79
+ // Determine output path
80
+ const outPath = options.out || input.replace(/(\.[^.]+)$/, "-resized$1");
81
+ if (outPath.includes("://")) {
82
+ // Cloud storage
83
+ const saveResult = await client.save(result, outPath);
84
+ console.log(`Resized image saved to: ${saveResult.location}`);
85
+ }
86
+ else {
87
+ // Local file
88
+ await writeFile(outPath, result.bytes);
89
+ console.log(`Resized image saved to: ${outPath}`);
90
+ }
91
+ if (result.width && result.height) {
92
+ console.log(`New size: ${result.width}x${result.height}`);
93
+ }
94
+ }
95
+ catch (error) {
96
+ console.error("Error resizing image:", error instanceof Error ? error.message : error);
97
+ process.exit(1);
98
+ }
99
+ });
100
+ //# sourceMappingURL=resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.js","sourceRoot":"","sources":["../../../src/cli/commands/resize.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -9,6 +9,13 @@ import { pluginsCommand } from "./commands/plugins.js";
9
9
  import { mcpCommand } from "./commands/mcp.js";
10
10
  import { filterCommand, presetCommand } from "./commands/filter.js";
11
11
  import { textCommand } from "./commands/text.js";
12
+ // Shorthand commands for common operations
13
+ import { qrCommand } from "./commands/qr.js";
14
+ import { resizeCommand } from "./commands/resize.js";
15
+ import { convertCommand } from "./commands/convert.js";
16
+ import { chartCommand } from "./commands/chart.js";
17
+ // Interactive mode
18
+ import { showInteractiveMenu, shouldShowInteractiveMenu } from "./interactive.js";
12
19
  import { readFile } from "fs/promises";
13
20
  import { fileURLToPath } from "url";
14
21
  import { dirname, join, resolve } from "path";
@@ -30,6 +37,7 @@ program
30
37
  .name("floimg")
31
38
  .description("Universal image workflow engine for developers and AI agents")
32
39
  .version(version);
40
+ // Core commands (full API)
33
41
  program.addCommand(generateCommand);
34
42
  program.addCommand(transformCommand);
35
43
  program.addCommand(saveCommand);
@@ -40,6 +48,11 @@ program.addCommand(mcpCommand);
40
48
  program.addCommand(filterCommand);
41
49
  program.addCommand(presetCommand);
42
50
  program.addCommand(textCommand);
51
+ // Shorthand commands (convenience wrappers)
52
+ program.addCommand(qrCommand);
53
+ program.addCommand(resizeCommand);
54
+ program.addCommand(convertCommand);
55
+ program.addCommand(chartCommand);
43
56
  // Enhanced doctor command
44
57
  program
45
58
  .command("doctor")
@@ -135,5 +148,11 @@ program
135
148
  console.log(" floimg mcp install # Set up MCP for Claude Code");
136
149
  console.log(" floimg generate --generator shapes --params '{\"type\":\"gradient\"}' --out test.svg");
137
150
  });
138
- program.parse();
151
+ // Check if we should show interactive menu (no args provided)
152
+ if (shouldShowInteractiveMenu(process.argv)) {
153
+ showInteractiveMenu().catch(console.error);
154
+ }
155
+ else {
156
+ program.parse();
157
+ }
139
158
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Display the interactive menu and handle user selection
3
+ */
4
+ export declare function showInteractiveMenu(): Promise<void>;
5
+ /**
6
+ * Check if we should show the interactive menu
7
+ * (called when floimg is run with no arguments)
8
+ */
9
+ export declare function shouldShowInteractiveMenu(args: string[]): boolean;
10
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AA0DA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiEzD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAKjE"}
@@ -0,0 +1,115 @@
1
+ import { createInterface } from "readline";
2
+ const MENU_OPTIONS = [
3
+ {
4
+ key: "1",
5
+ label: "Generate QR Code",
6
+ description: "Create a QR code from text or URL",
7
+ command: "floimg qr",
8
+ example: 'floimg qr "https://floimg.com" -o qr.png',
9
+ },
10
+ {
11
+ key: "2",
12
+ label: "Create Chart",
13
+ description: "Generate bar, line, pie charts and more",
14
+ command: "floimg chart",
15
+ example: 'floimg chart bar --labels "A,B,C" --values "10,20,30"',
16
+ },
17
+ {
18
+ key: "3",
19
+ label: "Resize Image",
20
+ description: "Resize an image to new dimensions",
21
+ command: "floimg resize",
22
+ example: "floimg resize input.jpg 800x600 -o output.jpg",
23
+ },
24
+ {
25
+ key: "4",
26
+ label: "Convert Format",
27
+ description: "Convert between image formats (PNG, WebP, JPEG, etc.)",
28
+ command: "floimg convert",
29
+ example: "floimg convert input.png -o output.webp",
30
+ },
31
+ {
32
+ key: "5",
33
+ label: "Run Workflow",
34
+ description: "Execute a YAML workflow file",
35
+ command: "floimg run",
36
+ example: "floimg run workflow.yaml",
37
+ },
38
+ {
39
+ key: "6",
40
+ label: "See All Commands",
41
+ description: "View help for all available commands",
42
+ command: "floimg --help",
43
+ example: "floimg --help",
44
+ },
45
+ ];
46
+ /**
47
+ * Display the interactive menu and handle user selection
48
+ */
49
+ export async function showInteractiveMenu() {
50
+ console.log("");
51
+ console.log("╭─────────────────────────────────────────────────────────╮");
52
+ console.log("│ │");
53
+ console.log("│ \x1b[1m\x1b[36mfloimg\x1b[0m - Universal Image Workflow Engine │");
54
+ console.log("│ │");
55
+ console.log("╰─────────────────────────────────────────────────────────╯");
56
+ console.log("");
57
+ console.log("\x1b[1mWhat would you like to do?\x1b[0m");
58
+ console.log("");
59
+ for (const option of MENU_OPTIONS) {
60
+ console.log(` \x1b[36m${option.key})\x1b[0m ${option.label}`);
61
+ console.log(` \x1b[2m${option.description}\x1b[0m`);
62
+ }
63
+ console.log("");
64
+ console.log(" \x1b[36mq)\x1b[0m Quit");
65
+ console.log("");
66
+ // Check if we're in a TTY
67
+ if (!process.stdin.isTTY) {
68
+ console.log("Run with a command, e.g.:");
69
+ console.log(' floimg qr "https://example.com" -o qr.png');
70
+ console.log("");
71
+ console.log("Or see all options with: floimg --help");
72
+ return;
73
+ }
74
+ const rl = createInterface({
75
+ input: process.stdin,
76
+ output: process.stdout,
77
+ });
78
+ const answer = await new Promise((resolve) => {
79
+ rl.question("Enter choice (1-6, or q): ", resolve);
80
+ });
81
+ rl.close();
82
+ const choice = answer.trim().toLowerCase();
83
+ if (choice === "q" || choice === "quit" || choice === "exit") {
84
+ console.log("\nGoodbye!");
85
+ return;
86
+ }
87
+ const selected = MENU_OPTIONS.find((o) => o.key === choice);
88
+ if (!selected) {
89
+ console.log("\nInvalid choice. Run floimg --help for all options.");
90
+ return;
91
+ }
92
+ console.log("");
93
+ console.log(`\x1b[1m${selected.label}\x1b[0m`);
94
+ console.log("");
95
+ console.log("Usage:");
96
+ console.log(` ${selected.command} [options]`);
97
+ console.log("");
98
+ console.log("Example:");
99
+ console.log(` ${selected.example}`);
100
+ console.log("");
101
+ console.log("For more options, run:");
102
+ console.log(` ${selected.command} --help`);
103
+ console.log("");
104
+ }
105
+ /**
106
+ * Check if we should show the interactive menu
107
+ * (called when floimg is run with no arguments)
108
+ */
109
+ export function shouldShowInteractiveMenu(args) {
110
+ // Show interactive menu if no command is provided
111
+ // args[0] is 'node', args[1] is the script path
112
+ // If there's a third argument, it's a command
113
+ return args.length <= 2;
114
+ }
115
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Plugin metadata for auto-installation
3
+ */
4
+ export interface PluginInfo {
5
+ /** npm package name */
6
+ package: string;
7
+ /** Human-readable name for display */
8
+ displayName: string;
9
+ /** The generator name it provides */
10
+ generatorName: string;
11
+ }
12
+ /**
13
+ * Registry of known plugins and their packages
14
+ */
15
+ export declare const PLUGIN_REGISTRY: Record<string, PluginInfo>;
16
+ /**
17
+ * Try to load a plugin, with auto-install if not found
18
+ *
19
+ * @param pluginKey - Key from PLUGIN_REGISTRY (e.g., "qr", "quickchart")
20
+ * @param autoInstall - Whether to prompt for auto-install (default: true)
21
+ * @returns The loaded plugin module, or null if not available
22
+ */
23
+ export declare function loadPlugin<T = unknown>(pluginKey: string, autoInstall?: boolean): Promise<T | null>;
24
+ /**
25
+ * Check if running via npx
26
+ */
27
+ export declare function isRunningViaNpx(): boolean;
28
+ /**
29
+ * Show a helpful tip for npx users after first successful run
30
+ */
31
+ export declare function showNpxTip(): void;
32
+ //# sourceMappingURL=plugin-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/plugin-loader.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA0BtD,CAAC;AA2DF;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,UAAO,GACjB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAsDnB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAMjC"}
@@ -0,0 +1,150 @@
1
+ import { execSync } from "child_process";
2
+ import { createInterface } from "readline";
3
+ /**
4
+ * Registry of known plugins and their packages
5
+ */
6
+ export const PLUGIN_REGISTRY = {
7
+ qr: {
8
+ package: "@teamflojo/floimg-qr",
9
+ displayName: "QR Code Generator",
10
+ generatorName: "qr",
11
+ },
12
+ quickchart: {
13
+ package: "@teamflojo/floimg-quickchart",
14
+ displayName: "QuickChart Generator",
15
+ generatorName: "quickchart",
16
+ },
17
+ mermaid: {
18
+ package: "@teamflojo/floimg-mermaid",
19
+ displayName: "Mermaid Diagram Generator",
20
+ generatorName: "mermaid",
21
+ },
22
+ d3: {
23
+ package: "@teamflojo/floimg-d3",
24
+ displayName: "D3 Visualization Generator",
25
+ generatorName: "d3",
26
+ },
27
+ screenshot: {
28
+ package: "@teamflojo/floimg-screenshot",
29
+ displayName: "Screenshot Generator",
30
+ generatorName: "screenshot",
31
+ },
32
+ };
33
+ /**
34
+ * Prompt user for confirmation (works in TTY)
35
+ */
36
+ async function promptConfirm(message) {
37
+ // Check if we're in an interactive terminal
38
+ if (!process.stdin.isTTY) {
39
+ return false;
40
+ }
41
+ return new Promise((resolve) => {
42
+ const rl = createInterface({
43
+ input: process.stdin,
44
+ output: process.stdout,
45
+ });
46
+ rl.question(`${message} (y/n): `, (answer) => {
47
+ rl.close();
48
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
49
+ });
50
+ });
51
+ }
52
+ /**
53
+ * Detect the package manager being used
54
+ */
55
+ function detectPackageManager() {
56
+ // Check for common environment variables
57
+ if (process.env.npm_config_user_agent?.includes("pnpm")) {
58
+ return "pnpm";
59
+ }
60
+ if (process.env.npm_config_user_agent?.includes("yarn")) {
61
+ return "yarn";
62
+ }
63
+ if (process.env.npm_config_user_agent?.includes("bun")) {
64
+ return "bun";
65
+ }
66
+ return "npm";
67
+ }
68
+ /**
69
+ * Install a package using the detected package manager
70
+ */
71
+ function installPackage(packageName) {
72
+ const pm = detectPackageManager();
73
+ const commands = {
74
+ npm: `npm install ${packageName}`,
75
+ pnpm: `pnpm add ${packageName}`,
76
+ yarn: `yarn add ${packageName}`,
77
+ bun: `bun add ${packageName}`,
78
+ };
79
+ console.log(`\nšŸ“¦ Installing ${packageName}...`);
80
+ execSync(commands[pm], { stdio: "inherit" });
81
+ console.log(`āœ… Installed ${packageName}\n`);
82
+ }
83
+ /**
84
+ * Try to load a plugin, with auto-install if not found
85
+ *
86
+ * @param pluginKey - Key from PLUGIN_REGISTRY (e.g., "qr", "quickchart")
87
+ * @param autoInstall - Whether to prompt for auto-install (default: true)
88
+ * @returns The loaded plugin module, or null if not available
89
+ */
90
+ export async function loadPlugin(pluginKey, autoInstall = true) {
91
+ const info = PLUGIN_REGISTRY[pluginKey];
92
+ if (!info) {
93
+ console.error(`Unknown plugin: ${pluginKey}`);
94
+ return null;
95
+ }
96
+ // Try to import the plugin
97
+ try {
98
+ const module = await import(info.package);
99
+ return module;
100
+ }
101
+ catch {
102
+ // Plugin not installed
103
+ }
104
+ // Plugin not found - offer to install
105
+ console.log(`\nšŸ” The '${pluginKey}' command requires ${info.package}`);
106
+ console.log(` ${info.displayName}\n`);
107
+ if (!autoInstall) {
108
+ console.log(`Install it with: npm install ${info.package}`);
109
+ return null;
110
+ }
111
+ // Check if we can prompt
112
+ if (!process.stdin.isTTY) {
113
+ console.log(`Install it with: npm install ${info.package}`);
114
+ console.log(`(Auto-install disabled in non-interactive mode)`);
115
+ return null;
116
+ }
117
+ const shouldInstall = await promptConfirm("Install it now?");
118
+ if (!shouldInstall) {
119
+ console.log(`\nYou can install it later with: npm install ${info.package}`);
120
+ return null;
121
+ }
122
+ // Install the package
123
+ try {
124
+ installPackage(info.package);
125
+ // Try to import again
126
+ const module = await import(info.package);
127
+ return module;
128
+ }
129
+ catch (error) {
130
+ console.error(`\nāŒ Failed to install ${info.package}:`, error instanceof Error ? error.message : error);
131
+ console.log(`Try installing manually: npm install ${info.package}`);
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Check if running via npx
137
+ */
138
+ export function isRunningViaNpx() {
139
+ // npx sets this environment variable
140
+ return Boolean(process.env.npm_execpath?.includes("npx"));
141
+ }
142
+ /**
143
+ * Show a helpful tip for npx users after first successful run
144
+ */
145
+ export function showNpxTip() {
146
+ if (isRunningViaNpx()) {
147
+ console.log("\nšŸ’” Tip: For faster runs, install globally: npm i -g @teamflojo/floimg");
148
+ }
149
+ }
150
+ //# sourceMappingURL=plugin-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../../src/cli/utils/plugin-loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamflojo/floimg",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Universal image workflow engine for developers and AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",