@optima-chat/comfy-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.claude/settings.local.json +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +228 -0
  4. package/dist/commands/config.d.ts +3 -0
  5. package/dist/commands/config.d.ts.map +1 -0
  6. package/dist/commands/config.js +87 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/commands/edit.d.ts +3 -0
  9. package/dist/commands/edit.d.ts.map +1 -0
  10. package/dist/commands/edit.js +63 -0
  11. package/dist/commands/edit.js.map +1 -0
  12. package/dist/commands/generate.d.ts +3 -0
  13. package/dist/commands/generate.d.ts.map +1 -0
  14. package/dist/commands/generate.js +51 -0
  15. package/dist/commands/generate.js.map +1 -0
  16. package/dist/commands/interrupt.d.ts +3 -0
  17. package/dist/commands/interrupt.d.ts.map +1 -0
  18. package/dist/commands/interrupt.js +19 -0
  19. package/dist/commands/interrupt.js.map +1 -0
  20. package/dist/commands/model.d.ts +3 -0
  21. package/dist/commands/model.d.ts.map +1 -0
  22. package/dist/commands/model.js +44 -0
  23. package/dist/commands/model.js.map +1 -0
  24. package/dist/commands/node.d.ts +3 -0
  25. package/dist/commands/node.d.ts.map +1 -0
  26. package/dist/commands/node.js +70 -0
  27. package/dist/commands/node.js.map +1 -0
  28. package/dist/commands/queue.d.ts +3 -0
  29. package/dist/commands/queue.d.ts.map +1 -0
  30. package/dist/commands/queue.js +97 -0
  31. package/dist/commands/queue.js.map +1 -0
  32. package/dist/commands/system.d.ts +3 -0
  33. package/dist/commands/system.d.ts.map +1 -0
  34. package/dist/commands/system.js +47 -0
  35. package/dist/commands/system.js.map +1 -0
  36. package/dist/commands/video.d.ts +3 -0
  37. package/dist/commands/video.d.ts.map +1 -0
  38. package/dist/commands/video.js +79 -0
  39. package/dist/commands/video.js.map +1 -0
  40. package/dist/commands/workflow.d.ts +3 -0
  41. package/dist/commands/workflow.d.ts.map +1 -0
  42. package/dist/commands/workflow.js +131 -0
  43. package/dist/commands/workflow.js.map +1 -0
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +31 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/services/api.d.ts +17 -0
  49. package/dist/services/api.d.ts.map +1 -0
  50. package/dist/services/api.js +62 -0
  51. package/dist/services/api.js.map +1 -0
  52. package/dist/services/config.d.ts +12 -0
  53. package/dist/services/config.d.ts.map +1 -0
  54. package/dist/services/config.js +21 -0
  55. package/dist/services/config.js.map +1 -0
  56. package/dist/utils/logger.d.ts +5 -0
  57. package/dist/utils/logger.d.ts.map +1 -0
  58. package/dist/utils/logger.js +14 -0
  59. package/dist/utils/logger.js.map +1 -0
  60. package/dist/utils/workflow.d.ts +17 -0
  61. package/dist/utils/workflow.d.ts.map +1 -0
  62. package/dist/utils/workflow.js +78 -0
  63. package/dist/utils/workflow.js.map +1 -0
  64. package/package.json +64 -0
@@ -0,0 +1,12 @@
1
+ import Conf from 'conf';
2
+ export interface ComfyConfig {
3
+ server: string;
4
+ timeout: number;
5
+ autoConnect: boolean;
6
+ outputDir: string;
7
+ }
8
+ export declare const config: Conf<ComfyConfig>;
9
+ export declare function getConfig(): ComfyConfig;
10
+ export declare function setConfig(key: keyof ComfyConfig, value: any): void;
11
+ export declare function resetConfig(): void;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,eAAO,MAAM,MAAM,mBAGjB,CAAC;AAEH,wBAAgB,SAAS,IAAI,WAAW,CAEvC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,WAAW,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAElE;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,21 @@
1
+ import Conf from 'conf';
2
+ const defaultConfig = {
3
+ server: 'http://dev.optima.chat:8188',
4
+ timeout: 30000,
5
+ autoConnect: true,
6
+ outputDir: './comfy-output',
7
+ };
8
+ export const config = new Conf({
9
+ projectName: 'comfy-cli',
10
+ defaults: defaultConfig,
11
+ });
12
+ export function getConfig() {
13
+ return config.store;
14
+ }
15
+ export function setConfig(key, value) {
16
+ config.set(key, value);
17
+ }
18
+ export function resetConfig() {
19
+ config.clear();
20
+ }
21
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,MAAM,aAAa,GAAgB;IACjC,MAAM,EAAE,6BAA6B;IACrC,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAc;IAC1C,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE,aAAa;CACxB,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAsB,EAAE,KAAU;IAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function success(message: string): void;
2
+ export declare function error(message: string): void;
3
+ export declare function info(message: string): void;
4
+ export declare function warning(message: string): void;
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C"}
@@ -0,0 +1,14 @@
1
+ import chalk from 'chalk';
2
+ export function success(message) {
3
+ console.log(chalk.green('✓'), message);
4
+ }
5
+ export function error(message) {
6
+ console.error(chalk.red('✗'), message);
7
+ }
8
+ export function info(message) {
9
+ console.log(chalk.blue('ℹ'), message);
10
+ }
11
+ export function warning(message) {
12
+ console.log(chalk.yellow('⚠'), message);
13
+ }
14
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 从 workflow 中提取所有 {{variable}} 变量
3
+ */
4
+ export declare function extractVariables(workflow: any): string[];
5
+ /**
6
+ * 替换 workflow 中的变量
7
+ */
8
+ export declare function replaceVariables(workflow: any, values: Record<string, any>): any;
9
+ /**
10
+ * 加载 workflow 文件
11
+ */
12
+ export declare function loadWorkflow(workflowPath: string): any;
13
+ /**
14
+ * 获取内置 workflow 路径
15
+ */
16
+ export declare function getBuiltinWorkflowPath(name: string): string;
17
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,CAmBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAwBhF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAatD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3D"}
@@ -0,0 +1,78 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * 从 workflow 中提取所有 {{variable}} 变量
5
+ */
6
+ export function extractVariables(workflow) {
7
+ const variables = new Set();
8
+ const regex = /\{\{(\w+)\}\}/g;
9
+ const traverse = (obj) => {
10
+ if (typeof obj === 'string') {
11
+ let match;
12
+ while ((match = regex.exec(obj)) !== null) {
13
+ variables.add(match[1]);
14
+ }
15
+ }
16
+ else if (Array.isArray(obj)) {
17
+ obj.forEach(traverse);
18
+ }
19
+ else if (obj && typeof obj === 'object') {
20
+ Object.values(obj).forEach(traverse);
21
+ }
22
+ };
23
+ traverse(workflow);
24
+ return Array.from(variables);
25
+ }
26
+ /**
27
+ * 替换 workflow 中的变量
28
+ */
29
+ export function replaceVariables(workflow, values) {
30
+ const result = JSON.parse(JSON.stringify(workflow));
31
+ const traverse = (obj) => {
32
+ if (typeof obj === 'string') {
33
+ return obj.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
34
+ if (varName in values) {
35
+ return String(values[varName]);
36
+ }
37
+ return match;
38
+ });
39
+ }
40
+ else if (Array.isArray(obj)) {
41
+ return obj.map(traverse);
42
+ }
43
+ else if (obj && typeof obj === 'object') {
44
+ const newObj = {};
45
+ for (const [key, value] of Object.entries(obj)) {
46
+ newObj[key] = traverse(value);
47
+ }
48
+ return newObj;
49
+ }
50
+ return obj;
51
+ };
52
+ return traverse(result);
53
+ }
54
+ /**
55
+ * 加载 workflow 文件
56
+ */
57
+ export function loadWorkflow(workflowPath) {
58
+ const fullPath = path.resolve(workflowPath);
59
+ if (!fs.existsSync(fullPath)) {
60
+ throw new Error(`Workflow file not found: ${fullPath}`);
61
+ }
62
+ try {
63
+ const content = fs.readFileSync(fullPath, 'utf-8');
64
+ return JSON.parse(content);
65
+ }
66
+ catch (error) {
67
+ throw new Error(`Failed to parse workflow file: ${error}`);
68
+ }
69
+ }
70
+ /**
71
+ * 获取内置 workflow 路径
72
+ */
73
+ export function getBuiltinWorkflowPath(name) {
74
+ // 从项目根目录的 workflows 目录加载
75
+ const projectRoot = path.resolve(__dirname, '../../');
76
+ return path.join(projectRoot, 'workflows', name);
77
+ }
78
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@optima-chat/comfy-cli",
3
+ "version": "0.1.0",
4
+ "description": "A CLI tool for ComfyUI designed for LLM interactions",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "comfy": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "comfyui",
18
+ "cli",
19
+ "ai",
20
+ "image-generation",
21
+ "llm",
22
+ "claude-code",
23
+ "stable-diffusion",
24
+ "flux",
25
+ "text-to-image",
26
+ "image-to-image"
27
+ ],
28
+ "author": "Optima Chat",
29
+ "license": "MIT",
30
+ "homepage": "https://github.com/Optima-Chat/comfy-cli#readme",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/Optima-Chat/comfy-cli.git"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/Optima-Chat/comfy-cli/issues"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "dependencies": {
45
+ "axios": "^1.7.9",
46
+ "chalk": "^5.4.1",
47
+ "cli-table3": "^0.6.5",
48
+ "commander": "^11.1.0",
49
+ "conf": "^12.0.0",
50
+ "dayjs": "^1.11.13",
51
+ "form-data": "^4.0.1",
52
+ "inquirer": "^9.3.7",
53
+ "open": "^9.1.0",
54
+ "ora": "^7.0.1",
55
+ "ws": "^8.18.0"
56
+ },
57
+ "devDependencies": {
58
+ "@types/inquirer": "^9.0.7",
59
+ "@types/node": "^20.17.10",
60
+ "@types/ws": "^8.5.13",
61
+ "tsx": "^4.19.2",
62
+ "typescript": "^5.7.2"
63
+ }
64
+ }