@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.
- package/.claude/settings.local.json +20 -0
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +87 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +63 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +51 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/interrupt.d.ts +3 -0
- package/dist/commands/interrupt.d.ts.map +1 -0
- package/dist/commands/interrupt.js +19 -0
- package/dist/commands/interrupt.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +44 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/node.d.ts +3 -0
- package/dist/commands/node.d.ts.map +1 -0
- package/dist/commands/node.js +70 -0
- package/dist/commands/node.js.map +1 -0
- package/dist/commands/queue.d.ts +3 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +97 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/system.d.ts +3 -0
- package/dist/commands/system.d.ts.map +1 -0
- package/dist/commands/system.js +47 -0
- package/dist/commands/system.js.map +1 -0
- package/dist/commands/video.d.ts +3 -0
- package/dist/commands/video.d.ts.map +1 -0
- package/dist/commands/video.js +79 -0
- package/dist/commands/video.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +131 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api.d.ts +17 -0
- package/dist/services/api.d.ts.map +1 -0
- package/dist/services/api.js +62 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/config.d.ts +12 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +21 -0
- package/dist/services/config.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/workflow.d.ts +17 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +78 -0
- package/dist/utils/workflow.js.map +1 -0
- 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 @@
|
|
|
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
|
+
}
|