@teamflojo/floimg 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.
Files changed (134) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli/commands/config.d.ts +3 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +165 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/filter.d.ts +4 -0
  7. package/dist/cli/commands/filter.d.ts.map +1 -0
  8. package/dist/cli/commands/filter.js +102 -0
  9. package/dist/cli/commands/filter.js.map +1 -0
  10. package/dist/cli/commands/generate.d.ts +3 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -0
  12. package/dist/cli/commands/generate.js +49 -0
  13. package/dist/cli/commands/generate.js.map +1 -0
  14. package/dist/cli/commands/mcp.d.ts +3 -0
  15. package/dist/cli/commands/mcp.d.ts.map +1 -0
  16. package/dist/cli/commands/mcp.js +88 -0
  17. package/dist/cli/commands/mcp.js.map +1 -0
  18. package/dist/cli/commands/plugins.d.ts +3 -0
  19. package/dist/cli/commands/plugins.d.ts.map +1 -0
  20. package/dist/cli/commands/plugins.js +66 -0
  21. package/dist/cli/commands/plugins.js.map +1 -0
  22. package/dist/cli/commands/run.d.ts +3 -0
  23. package/dist/cli/commands/run.d.ts.map +1 -0
  24. package/dist/cli/commands/run.js +45 -0
  25. package/dist/cli/commands/run.js.map +1 -0
  26. package/dist/cli/commands/save.d.ts +3 -0
  27. package/dist/cli/commands/save.d.ts.map +1 -0
  28. package/dist/cli/commands/save.js +54 -0
  29. package/dist/cli/commands/save.js.map +1 -0
  30. package/dist/cli/commands/text.d.ts +3 -0
  31. package/dist/cli/commands/text.d.ts.map +1 -0
  32. package/dist/cli/commands/text.js +143 -0
  33. package/dist/cli/commands/text.js.map +1 -0
  34. package/dist/cli/commands/transform.d.ts +3 -0
  35. package/dist/cli/commands/transform.d.ts.map +1 -0
  36. package/dist/cli/commands/transform.js +59 -0
  37. package/dist/cli/commands/transform.js.map +1 -0
  38. package/dist/cli/commands/upload.d.ts +3 -0
  39. package/dist/cli/commands/upload.d.ts.map +1 -0
  40. package/dist/cli/commands/upload.js +59 -0
  41. package/dist/cli/commands/upload.js.map +1 -0
  42. package/dist/cli/index.d.ts +3 -0
  43. package/dist/cli/index.d.ts.map +1 -0
  44. package/dist/cli/index.js +139 -0
  45. package/dist/cli/index.js.map +1 -0
  46. package/dist/config/index.d.ts +10 -0
  47. package/dist/config/index.d.ts.map +1 -0
  48. package/dist/config/index.js +38 -0
  49. package/dist/config/index.js.map +1 -0
  50. package/dist/config/loader.d.ts +23 -0
  51. package/dist/config/loader.d.ts.map +1 -0
  52. package/dist/config/loader.js +189 -0
  53. package/dist/config/loader.js.map +1 -0
  54. package/dist/core/client.d.ts +63 -0
  55. package/dist/core/client.d.ts.map +1 -0
  56. package/dist/core/client.js +318 -0
  57. package/dist/core/client.js.map +1 -0
  58. package/dist/core/errors.d.ts +38 -0
  59. package/dist/core/errors.d.ts.map +1 -0
  60. package/dist/core/errors.js +75 -0
  61. package/dist/core/errors.js.map +1 -0
  62. package/dist/core/logger.d.ts +12 -0
  63. package/dist/core/logger.d.ts.map +1 -0
  64. package/dist/core/logger.js +26 -0
  65. package/dist/core/logger.js.map +1 -0
  66. package/dist/core/pipeline-runner.d.ts +64 -0
  67. package/dist/core/pipeline-runner.d.ts.map +1 -0
  68. package/dist/core/pipeline-runner.js +109 -0
  69. package/dist/core/pipeline-runner.js.map +1 -0
  70. package/dist/core/types.d.ts +392 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +5 -0
  73. package/dist/core/types.js.map +1 -0
  74. package/dist/index.d.ts +18 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +49 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mcp/server.d.ts +3 -0
  79. package/dist/mcp/server.d.ts.map +1 -0
  80. package/dist/mcp/server.js +731 -0
  81. package/dist/mcp/server.js.map +1 -0
  82. package/dist/providers/ai/index.d.ts +3 -0
  83. package/dist/providers/ai/index.d.ts.map +1 -0
  84. package/dist/providers/ai/index.js +2 -0
  85. package/dist/providers/ai/index.js.map +1 -0
  86. package/dist/providers/ai/openai.d.ts +44 -0
  87. package/dist/providers/ai/openai.d.ts.map +1 -0
  88. package/dist/providers/ai/openai.js +133 -0
  89. package/dist/providers/ai/openai.js.map +1 -0
  90. package/dist/providers/save/FsSaveProvider.d.ts +20 -0
  91. package/dist/providers/save/FsSaveProvider.d.ts.map +1 -0
  92. package/dist/providers/save/FsSaveProvider.js +34 -0
  93. package/dist/providers/save/FsSaveProvider.js.map +1 -0
  94. package/dist/providers/save/S3SaveProvider.d.ts +26 -0
  95. package/dist/providers/save/S3SaveProvider.d.ts.map +1 -0
  96. package/dist/providers/save/S3SaveProvider.js +42 -0
  97. package/dist/providers/save/S3SaveProvider.js.map +1 -0
  98. package/dist/providers/store/fs.d.ts +20 -0
  99. package/dist/providers/store/fs.d.ts.map +1 -0
  100. package/dist/providers/store/fs.js +42 -0
  101. package/dist/providers/store/fs.js.map +1 -0
  102. package/dist/providers/store/index.d.ts +3 -0
  103. package/dist/providers/store/index.d.ts.map +1 -0
  104. package/dist/providers/store/index.js +3 -0
  105. package/dist/providers/store/index.js.map +1 -0
  106. package/dist/providers/store/s3.d.ts +62 -0
  107. package/dist/providers/store/s3.d.ts.map +1 -0
  108. package/dist/providers/store/s3.js +92 -0
  109. package/dist/providers/store/s3.js.map +1 -0
  110. package/dist/providers/svg/index.d.ts +2 -0
  111. package/dist/providers/svg/index.d.ts.map +1 -0
  112. package/dist/providers/svg/index.js +2 -0
  113. package/dist/providers/svg/index.js.map +1 -0
  114. package/dist/providers/svg/shapes.d.ts +18 -0
  115. package/dist/providers/svg/shapes.d.ts.map +1 -0
  116. package/dist/providers/svg/shapes.js +161 -0
  117. package/dist/providers/svg/shapes.js.map +1 -0
  118. package/dist/providers/transform/index.d.ts +2 -0
  119. package/dist/providers/transform/index.d.ts.map +1 -0
  120. package/dist/providers/transform/index.js +2 -0
  121. package/dist/providers/transform/index.js.map +1 -0
  122. package/dist/providers/transform/presets.d.ts +44 -0
  123. package/dist/providers/transform/presets.d.ts.map +1 -0
  124. package/dist/providers/transform/presets.js +205 -0
  125. package/dist/providers/transform/presets.js.map +1 -0
  126. package/dist/providers/transform/sharp.d.ts +64 -0
  127. package/dist/providers/transform/sharp.d.ts.map +1 -0
  128. package/dist/providers/transform/sharp.js +732 -0
  129. package/dist/providers/transform/sharp.js.map +1 -0
  130. package/dist/providers/transform/text.d.ts +38 -0
  131. package/dist/providers/transform/text.d.ts.map +1 -0
  132. package/dist/providers/transform/text.js +116 -0
  133. package/dist/providers/transform/text.js.map +1 -0
  134. package/package.json +84 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Brett Cooke
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const configCommand: Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA6KvB,CAAC"}
@@ -0,0 +1,165 @@
1
+ import { Command } from "commander";
2
+ import { saveGlobalConfig, loadConfig } from "../../config/loader.js";
3
+ import { join } from "path";
4
+ import { homedir } from "os";
5
+ export const configCommand = new Command("config")
6
+ .description("Manage imgflo configuration")
7
+ .addCommand(new Command("set")
8
+ .description("Set a configuration value")
9
+ .argument("<key>", "Configuration key (e.g., s3.bucket, s3.region)")
10
+ .argument("<value>", "Configuration value")
11
+ .action(async (key, value) => {
12
+ try {
13
+ const config = await loadConfig();
14
+ // Parse the key path (e.g., "s3.bucket" -> save.s3.bucket)
15
+ const parts = key.split(".");
16
+ if (parts[0] === "s3") {
17
+ if (!config.save)
18
+ config.save = {};
19
+ if (!config.save.s3)
20
+ config.save.s3 = {};
21
+ if (parts[1] === "bucket") {
22
+ config.save.s3.bucket = value;
23
+ }
24
+ else if (parts[1] === "region") {
25
+ config.save.s3.region = value;
26
+ }
27
+ else {
28
+ config.save.s3[parts[1]] = value;
29
+ }
30
+ // Set default save provider to s3
31
+ if (!config.save.default) {
32
+ config.save.default = "s3";
33
+ }
34
+ }
35
+ else if (parts[0] === "openai") {
36
+ if (!config.ai)
37
+ config.ai = {};
38
+ if (!config.ai.openai)
39
+ config.ai.openai = { apiKey: '' };
40
+ if (parts[1] === "apiKey" || parts[1] === "key") {
41
+ config.ai.openai.apiKey = value;
42
+ }
43
+ else {
44
+ config.ai.openai[parts[1]] = value;
45
+ }
46
+ if (!config.ai.default) {
47
+ config.ai.default = "openai";
48
+ }
49
+ }
50
+ else {
51
+ console.error(`Unknown configuration key: ${key}`);
52
+ console.error('Valid keys: s3.bucket, s3.region, openai.apiKey');
53
+ process.exit(1);
54
+ }
55
+ await saveGlobalConfig(config);
56
+ console.log(`āœ“ Configuration saved: ${key} = ${value.includes('key') || value.includes('secret') ? '***' : value}`);
57
+ console.log(` Location: ${join(homedir(), ".imgflo", "config.json")}`);
58
+ }
59
+ catch (error) {
60
+ console.error("Error saving configuration:", error instanceof Error ? error.message : error);
61
+ process.exit(1);
62
+ }
63
+ }))
64
+ .addCommand(new Command("get")
65
+ .description("Get a configuration value")
66
+ .argument("[key]", "Configuration key (omit to show all)")
67
+ .action(async (key) => {
68
+ try {
69
+ const config = await loadConfig();
70
+ if (!key) {
71
+ console.log("Current configuration:");
72
+ console.log(JSON.stringify(config, null, 2));
73
+ return;
74
+ }
75
+ const parts = key.split(".");
76
+ let value = config;
77
+ for (const part of parts) {
78
+ if (value && typeof value === 'object') {
79
+ value = value[part];
80
+ }
81
+ else {
82
+ value = undefined;
83
+ break;
84
+ }
85
+ }
86
+ if (value !== undefined) {
87
+ console.log(`${key} = ${JSON.stringify(value, null, 2)}`);
88
+ }
89
+ else {
90
+ console.log(`Configuration key not found: ${key}`);
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error("Error reading configuration:", error instanceof Error ? error.message : error);
95
+ process.exit(1);
96
+ }
97
+ }))
98
+ .addCommand(new Command("init")
99
+ .description("Initialize imgflo configuration interactively")
100
+ .action(async () => {
101
+ console.log("imgflo configuration setup");
102
+ console.log("=========================\n");
103
+ const readline = await import('readline');
104
+ const rl = readline.createInterface({
105
+ input: process.stdin,
106
+ output: process.stdout
107
+ });
108
+ const question = (prompt) => {
109
+ return new Promise((resolve) => {
110
+ rl.question(prompt, resolve);
111
+ });
112
+ };
113
+ try {
114
+ const config = {};
115
+ console.log("S3 Configuration (optional - press Enter to skip):");
116
+ const s3Bucket = await question(" S3 Bucket name: ");
117
+ if (s3Bucket) {
118
+ const s3Region = await question(" S3 Region [us-east-1]: ") || "us-east-1";
119
+ config.save = {
120
+ default: "s3",
121
+ s3: {
122
+ bucket: s3Bucket,
123
+ region: s3Region
124
+ }
125
+ };
126
+ }
127
+ console.log("\nOpenAI Configuration (optional - press Enter to skip):");
128
+ const openaiKey = await question(" OpenAI API Key: ");
129
+ if (openaiKey) {
130
+ config.ai = {
131
+ default: "openai",
132
+ openai: {
133
+ apiKey: openaiKey
134
+ }
135
+ };
136
+ }
137
+ if (Object.keys(config).length === 0) {
138
+ console.log("\nNo configuration provided. Exiting.");
139
+ rl.close();
140
+ return;
141
+ }
142
+ await saveGlobalConfig(config);
143
+ console.log("\nāœ“ Configuration saved to:", join(homedir(), ".imgflo", "config.json"));
144
+ console.log("\nYou can now use imgflo without setting environment variables!");
145
+ console.log("\nTry it:");
146
+ console.log(" imgflo generate --provider svg --params '{\"type\":\"gradient\"}' --out test.svg");
147
+ rl.close();
148
+ }
149
+ catch (error) {
150
+ rl.close();
151
+ console.error("\nError during configuration:", error instanceof Error ? error.message : error);
152
+ process.exit(1);
153
+ }
154
+ }))
155
+ .addCommand(new Command("path")
156
+ .description("Show configuration file location")
157
+ .action(() => {
158
+ console.log("Configuration file locations (in order of priority):");
159
+ console.log(" 1. ./imgflo.config.ts (current directory)");
160
+ console.log(" 2. ./.imgflorc.json (current directory)");
161
+ console.log(" 3. ~/.imgflo/config.json (global)");
162
+ console.log(" 4. Environment variables");
163
+ console.log("\nGlobal config location:", join(homedir(), ".imgflo", "config.json"));
164
+ }));
165
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const filterCommand: Command;
3
+ export declare const presetCommand: Command;
4
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAgDtB,CAAC;AAGL,eAAO,MAAM,aAAa,SA6CtB,CAAC"}
@@ -0,0 +1,102 @@
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
+ export const filterCommand = new Command("filter")
6
+ .description("Apply filters and effects to images")
7
+ .requiredOption("--in <path>", "Input file path")
8
+ .requiredOption("--op <operation>", "Filter operation: blur, sharpen, grayscale, negate, normalize, threshold, modulate, tint")
9
+ .option("--params <json>", "JSON parameters for the operation", "{}")
10
+ .option("--out <path>", "Output file path (if not provided, outputs to stdout)")
11
+ .option("--config <path>", "Path to config file")
12
+ .action(async (options) => {
13
+ try {
14
+ const config = await loadConfig(options.config);
15
+ const client = createClient(config);
16
+ // Read input file
17
+ const inputBytes = await readFile(options.in);
18
+ // Detect MIME type from file extension
19
+ const ext = options.in.split(".").pop()?.toLowerCase();
20
+ let mime = "image/png";
21
+ if (ext === "svg")
22
+ mime = "image/svg+xml";
23
+ else if (ext === "jpg" || ext === "jpeg")
24
+ mime = "image/jpeg";
25
+ else if (ext === "webp")
26
+ mime = "image/webp";
27
+ else if (ext === "avif")
28
+ mime = "image/avif";
29
+ const inputBlob = {
30
+ bytes: inputBytes,
31
+ mime,
32
+ };
33
+ const params = JSON.parse(options.params);
34
+ const result = await client.transform({
35
+ blob: inputBlob,
36
+ op: options.op,
37
+ params,
38
+ });
39
+ if (options.out) {
40
+ await writeFile(options.out, result.bytes);
41
+ console.log(`Filtered image saved to: ${options.out}`);
42
+ console.log(`Format: ${result.mime}`);
43
+ }
44
+ else {
45
+ // Write to stdout
46
+ process.stdout.write(result.bytes);
47
+ }
48
+ }
49
+ catch (error) {
50
+ console.error("Error applying filter:", error instanceof Error ? error.message : error);
51
+ process.exit(1);
52
+ }
53
+ });
54
+ // Add preset subcommand
55
+ export const presetCommand = new Command("preset")
56
+ .description("Apply preset filters to images")
57
+ .requiredOption("--in <path>", "Input file path")
58
+ .requiredOption("--name <preset>", "Preset name: vintage, vibrant, blackAndWhite, dramatic, soft, cool, warm, highContrast")
59
+ .option("--out <path>", "Output file path (if not provided, outputs to stdout)")
60
+ .option("--config <path>", "Path to config file")
61
+ .action(async (options) => {
62
+ try {
63
+ const config = await loadConfig(options.config);
64
+ const client = createClient(config);
65
+ // Read input file
66
+ const inputBytes = await readFile(options.in);
67
+ // Detect MIME type from file extension
68
+ const ext = options.in.split(".").pop()?.toLowerCase();
69
+ let mime = "image/png";
70
+ if (ext === "svg")
71
+ mime = "image/svg+xml";
72
+ else if (ext === "jpg" || ext === "jpeg")
73
+ mime = "image/jpeg";
74
+ else if (ext === "webp")
75
+ mime = "image/webp";
76
+ else if (ext === "avif")
77
+ mime = "image/avif";
78
+ const inputBlob = {
79
+ bytes: inputBytes,
80
+ mime,
81
+ };
82
+ const result = await client.transform({
83
+ blob: inputBlob,
84
+ op: "preset",
85
+ params: { name: options.name },
86
+ });
87
+ if (options.out) {
88
+ await writeFile(options.out, result.bytes);
89
+ console.log(`Preset '${options.name}' applied to: ${options.out}`);
90
+ console.log(`Format: ${result.mime}`);
91
+ }
92
+ else {
93
+ // Write to stdout
94
+ process.stdout.write(result.bytes);
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error("Error applying preset:", error instanceof Error ? error.message : error);
99
+ process.exit(1);
100
+ }
101
+ });
102
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/cli/commands/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qCAAqC,CAAC;KAClD,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAAC;KAChD,cAAc,CAAC,kBAAkB,EAAE,0FAA0F,CAAC;KAC9H,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,IAAI,CAAC;KACpE,MAAM,CAAC,cAAc,EAAE,uDAAuD,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,kBAAkB;QAClB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE9C,uCAAuC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QACvD,IAAI,IAAI,GAAa,WAAW,CAAC;QACjC,IAAI,GAAG,KAAK,KAAK;YAAE,IAAI,GAAG,eAAe,CAAC;aACrC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;aACzD,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;aACxC,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;QAE7C,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,UAAU;YACjB,IAAI;SACL,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,wBAAwB;AACxB,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAAC;KAChD,cAAc,CAAC,iBAAiB,EAAE,wFAAwF,CAAC;KAC3H,MAAM,CAAC,cAAc,EAAE,uDAAuD,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,kBAAkB;QAClB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE9C,uCAAuC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QACvD,IAAI,IAAI,GAAa,WAAW,CAAC;QACjC,IAAI,GAAG,KAAK,KAAK;YAAE,IAAI,GAAG,eAAe,CAAC;aACrC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;aACzD,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;aACxC,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,GAAG,YAAY,CAAC;QAE7C,MAAM,SAAS,GAAG;YAChB,KAAK,EAAE,UAAU;YACjB,IAAI;SACL,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;SAC/B,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,IAAI,iBAAiB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const generateCommand: Command;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,eAAe,SA2CxB,CAAC"}
@@ -0,0 +1,49 @@
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
+ export const generateCommand = new Command("generate")
6
+ .description("Generate an image using any registered generator")
7
+ .option("-g, --generator <name>", "Generator to use (e.g., shapes, openai)", "shapes")
8
+ .option("--params <json>", "JSON parameters for generation", "{}")
9
+ .option("--out <path>", "Output file path")
10
+ .option("--config <path>", "Path to config file")
11
+ .action(async (options) => {
12
+ try {
13
+ const config = await loadConfig(options.config);
14
+ const client = createClient(config);
15
+ const params = JSON.parse(options.params);
16
+ const blob = await client.generate({
17
+ generator: options.generator,
18
+ params,
19
+ });
20
+ if (options.out) {
21
+ // Check if destination is cloud storage (s3://, r2://, etc.) or local file
22
+ if (options.out.includes('://')) {
23
+ // Use imgflo's save provider (supports S3, etc.)
24
+ const result = await client.save(blob, options.out);
25
+ console.log(`Generated image saved to cloud storage!`);
26
+ console.log(`Provider: ${result.provider}`);
27
+ console.log(`Location: ${result.location}`);
28
+ console.log(`Format: ${blob.mime}`);
29
+ console.log(`Size: ${blob.width}x${blob.height}`);
30
+ }
31
+ else {
32
+ // Local filesystem
33
+ await writeFile(options.out, blob.bytes);
34
+ console.log(`Generated image saved to: ${options.out}`);
35
+ console.log(`Format: ${blob.mime}`);
36
+ console.log(`Size: ${blob.width}x${blob.height}`);
37
+ }
38
+ }
39
+ else {
40
+ // Write to stdout
41
+ process.stdout.write(blob.bytes);
42
+ }
43
+ }
44
+ catch (error) {
45
+ console.error("Error generating image:", error instanceof Error ? error.message : error);
46
+ process.exit(1);
47
+ }
48
+ });
49
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.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;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,wBAAwB,EAAE,yCAAyC,EAAE,QAAQ,CAAC;KACrF,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,EAAE,IAAI,CAAC;KACjE,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACjC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,2EAA2E;YAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,iDAAiD;gBACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,mBAAmB;gBACnB,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kBAAkB;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const mcpCommand: Command;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,UAAU,SAC2C,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { Command } from "commander";
2
+ import { join, resolve } from "path";
3
+ import { writeFile } from "fs/promises";
4
+ export const mcpCommand = new Command("mcp")
5
+ .description("MCP (Model Context Protocol) integration helpers");
6
+ mcpCommand
7
+ .command("install")
8
+ .description("Generate MCP configuration for Claude Code")
9
+ .option("--global", "Install to global Claude Code config")
10
+ .option("--output <path>", "Output path for MCP config snippet")
11
+ .action(async (options) => {
12
+ console.log("imgflo MCP Setup");
13
+ console.log("================\n");
14
+ // Get the path to the built MCP server
15
+ // When imgflo is installed globally, use require.resolve to find it
16
+ let serverPath;
17
+ try {
18
+ serverPath = require.resolve("imgflo/dist/mcp/server.js");
19
+ }
20
+ catch {
21
+ // Fallback to local path if not found via require.resolve
22
+ serverPath = resolve(join(process.cwd(), "node_modules/imgflo/dist/mcp/server.js"));
23
+ }
24
+ const mcpConfig = {
25
+ mcpServers: {
26
+ imgflo: {
27
+ command: "node",
28
+ args: [serverPath],
29
+ env: {
30
+ // These will be read from the user's environment or .env
31
+ OPENAI_API_KEY: "${OPENAI_API_KEY}",
32
+ AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}",
33
+ AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}",
34
+ AWS_REGION: "${AWS_REGION}",
35
+ S3_BUCKET: "${S3_BUCKET}",
36
+ },
37
+ },
38
+ },
39
+ };
40
+ if (options.output) {
41
+ // Write to specified file
42
+ await writeFile(options.output, JSON.stringify(mcpConfig, null, 2));
43
+ console.log(`āœ“ MCP configuration written to: ${options.output}\n`);
44
+ }
45
+ else {
46
+ // Just print to console
47
+ console.log("Add this to your Claude Code MCP configuration:\n");
48
+ console.log(JSON.stringify(mcpConfig, null, 2));
49
+ console.log("\n");
50
+ }
51
+ console.log("šŸ“ Claude Code MCP config locations:");
52
+ console.log(" - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json");
53
+ console.log(" - Windows: %APPDATA%\\Claude\\claude_desktop_config.json");
54
+ console.log(" - Linux: ~/.config/claude/claude_desktop_config.json");
55
+ console.log("\nšŸ’” Next steps:");
56
+ console.log(" 1. Set up your credentials (AWS, OpenAI) in environment or .env");
57
+ console.log(" 2. Add the config above to your Claude Code config file");
58
+ console.log(" 3. Restart Claude Code");
59
+ console.log(" 4. Try: 'Create a QR code for https://example.com'");
60
+ console.log("\nšŸ“– Documentation:");
61
+ console.log(" https://github.com/bcooke/imgflo/blob/main/packages/imgflo/docs/guides/MCP_SERVER.md");
62
+ });
63
+ mcpCommand
64
+ .command("test")
65
+ .description("Test MCP server with inspector (opens browser)")
66
+ .action(async () => {
67
+ console.log("Starting MCP Inspector...\n");
68
+ console.log("This will open a web interface to test imgflo's MCP tools.");
69
+ console.log("Press Ctrl+C to stop.\n");
70
+ const { spawn } = await import("child_process");
71
+ // Get the path to the built MCP server
72
+ let serverPath;
73
+ try {
74
+ serverPath = require.resolve("imgflo/dist/mcp/server.js");
75
+ }
76
+ catch {
77
+ // Fallback to local path if not found via require.resolve
78
+ serverPath = resolve(join(process.cwd(), "node_modules/imgflo/dist/mcp/server.js"));
79
+ }
80
+ const inspector = spawn("npx", ["@modelcontextprotocol/inspector", "node", serverPath], {
81
+ stdio: "inherit",
82
+ env: process.env,
83
+ });
84
+ inspector.on("close", (code) => {
85
+ console.log(`\nMCP Inspector exited with code ${code}`);
86
+ });
87
+ });
88
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const pluginsCommand: Command;
3
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,cAAc,SAqEvB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { Command } from "commander";
2
+ export const pluginsCommand = new Command("plugins")
3
+ .description("Manage and view available imgflo plugins")
4
+ .action(async () => {
5
+ console.log("imgflo Plugins");
6
+ console.log("==============\n");
7
+ // Try to load each known plugin
8
+ const knownPlugins = [
9
+ {
10
+ name: "imgflo-quickchart",
11
+ generator: "quickchart",
12
+ description: "Chart.js charts (bar, line, pie, etc.)",
13
+ docs: "https://github.com/bcooke/imgflo/tree/main/packages/imgflo-quickchart",
14
+ },
15
+ {
16
+ name: "imgflo-d3",
17
+ generator: "d3",
18
+ description: "D3 data visualizations (custom charts, complex viz)",
19
+ docs: "https://github.com/bcooke/imgflo/tree/main/packages/imgflo-d3",
20
+ },
21
+ {
22
+ name: "imgflo-mermaid",
23
+ generator: "mermaid",
24
+ description: "Mermaid diagrams (flowcharts, sequence, gantt)",
25
+ docs: "https://github.com/bcooke/imgflo/tree/main/packages/imgflo-mermaid",
26
+ },
27
+ {
28
+ name: "imgflo-qr",
29
+ generator: "qr",
30
+ description: "QR code generation",
31
+ docs: "https://github.com/bcooke/imgflo/tree/main/packages/imgflo-qr",
32
+ },
33
+ {
34
+ name: "imgflo-screenshot",
35
+ generator: "screenshot",
36
+ description: "Website screenshots (Playwright)",
37
+ docs: "https://github.com/bcooke/imgflo/tree/main/packages/imgflo-screenshot",
38
+ },
39
+ ];
40
+ console.log("Built-in generators:");
41
+ console.log(" āœ“ shapes - Simple SVG shapes and gradients");
42
+ console.log(" āœ“ openai - DALL-E image generation (requires API key)\n");
43
+ console.log("Available plugin generators:");
44
+ const installedPlugins = [];
45
+ const notInstalledPlugins = [];
46
+ for (const plugin of knownPlugins) {
47
+ try {
48
+ await import(plugin.name);
49
+ console.log(` āœ“ ${plugin.generator.padEnd(12)} - ${plugin.description}`);
50
+ installedPlugins.push(plugin.name);
51
+ }
52
+ catch {
53
+ console.log(` āœ— ${plugin.generator.padEnd(12)} - ${plugin.description} (not installed)`);
54
+ notInstalledPlugins.push(plugin.name);
55
+ }
56
+ }
57
+ if (notInstalledPlugins.length > 0) {
58
+ console.log("\nšŸ’” To install plugins:");
59
+ console.log(` npm install ${notInstalledPlugins.join(' ')}`);
60
+ console.log("\n Or install all at once:");
61
+ console.log(" npm install imgflo-quickchart imgflo-d3 imgflo-mermaid imgflo-qr imgflo-screenshot");
62
+ }
63
+ console.log("\nšŸ“– Documentation:");
64
+ console.log(" https://github.com/bcooke/imgflo");
65
+ });
66
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../src/cli/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEhC,gCAAgC;IAChC,MAAM,YAAY,GAAG;QACnB;YACE,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,wCAAwC;YACrD,IAAI,EAAE,uEAAuE;SAC9E;QACD;YACE,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,qDAAqD;YAClE,IAAI,EAAE,+DAA+D;SACtE;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,gDAAgD;YAC7D,IAAI,EAAE,oEAAoE;SAC3E;QACD;YACE,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,oBAAoB;YACjC,IAAI,EAAE,+DAA+D;SACtE;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,kCAAkC;YAC/C,IAAI,EAAE,uEAAuE;SAC9E;KACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,mBAAmB,GAAa,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1E,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,kBAAkB,CAAC,CAAC;YAC1F,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,kBAAkB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;IACvG,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const runCommand: Command;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SA0CnB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { Command } from "commander";
2
+ import { readFile } from "fs/promises";
3
+ import { parse } from "yaml";
4
+ import createClient from "../../index.js";
5
+ import { loadConfig } from "../../config/loader.js";
6
+ export const runCommand = new Command("run")
7
+ .description("Run a YAML pipeline")
8
+ .argument("<file>", "Path to YAML pipeline file")
9
+ .option("--config <path>", "Path to config file")
10
+ .action(async (file, options) => {
11
+ try {
12
+ const config = await loadConfig(options.config);
13
+ const client = createClient(config);
14
+ // Read and parse YAML
15
+ const yamlContent = await readFile(file, "utf-8");
16
+ const pipeline = parse(yamlContent);
17
+ console.log(`šŸš€ Running pipeline: ${pipeline.name || file}`);
18
+ // Execute pipeline
19
+ const results = await client.run(pipeline);
20
+ console.log(`\nāœ“ Pipeline completed with ${results.length} steps\n`);
21
+ // Output results
22
+ for (const result of results) {
23
+ if ('location' in result.value) {
24
+ // SaveResult
25
+ console.log(` ${result.out}:`);
26
+ console.log(` Location: ${result.value.location}`);
27
+ console.log(` Provider: ${result.value.provider}`);
28
+ console.log(` Size: ${result.value.size} bytes`);
29
+ }
30
+ else if ('bytes' in result.value) {
31
+ // ImageBlob
32
+ console.log(` ${result.out}:`);
33
+ console.log(` Type: ${result.value.mime}`);
34
+ console.log(` Size: ${result.value.width}x${result.value.height}`);
35
+ }
36
+ }
37
+ console.log('\n✨ Done!');
38
+ }
39
+ catch (error) {
40
+ console.error("\nāŒ Error running pipeline:");
41
+ console.error(error instanceof Error ? error.message : error);
42
+ process.exit(1);
43
+ }
44
+ });
45
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAChD,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,sBAAsB;QACtB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAa,KAAK,CAAC,WAAW,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAE7D,mBAAmB;QACnB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE3C,OAAO,CAAC,GAAG,CAAC,+BAA+B,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAErE,iBAAiB;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,UAAU,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC/B,aAAa;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACnC,YAAY;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}