@optima-chat/gen-cli 1.0.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 (153) hide show
  1. package/dist/backends/bfl.d.ts +18 -0
  2. package/dist/backends/bfl.d.ts.map +1 -0
  3. package/dist/backends/bfl.js +130 -0
  4. package/dist/backends/bfl.js.map +1 -0
  5. package/dist/backends/comfyui.d.ts +10 -0
  6. package/dist/backends/comfyui.d.ts.map +1 -0
  7. package/dist/backends/comfyui.js +121 -0
  8. package/dist/backends/comfyui.js.map +1 -0
  9. package/dist/backends/index.d.ts +24 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +59 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/types.d.ts +99 -0
  14. package/dist/backends/types.d.ts.map +1 -0
  15. package/dist/backends/types.js +2 -0
  16. package/dist/backends/types.js.map +1 -0
  17. package/dist/backends/video-dashscope.d.ts +10 -0
  18. package/dist/backends/video-dashscope.d.ts.map +1 -0
  19. package/dist/backends/video-dashscope.js +108 -0
  20. package/dist/backends/video-dashscope.js.map +1 -0
  21. package/dist/backends/video-index.d.ts +23 -0
  22. package/dist/backends/video-index.d.ts.map +1 -0
  23. package/dist/backends/video-index.js +57 -0
  24. package/dist/backends/video-index.js.map +1 -0
  25. package/dist/commands/asr.d.ts +3 -0
  26. package/dist/commands/asr.d.ts.map +1 -0
  27. package/dist/commands/asr.js +133 -0
  28. package/dist/commands/asr.js.map +1 -0
  29. package/dist/commands/config.d.ts +3 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +105 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/download.d.ts +3 -0
  34. package/dist/commands/download.d.ts.map +1 -0
  35. package/dist/commands/download.js +169 -0
  36. package/dist/commands/download.js.map +1 -0
  37. package/dist/commands/edit.d.ts +3 -0
  38. package/dist/commands/edit.d.ts.map +1 -0
  39. package/dist/commands/edit.js +155 -0
  40. package/dist/commands/edit.js.map +1 -0
  41. package/dist/commands/generate.d.ts +3 -0
  42. package/dist/commands/generate.d.ts.map +1 -0
  43. package/dist/commands/generate.js +135 -0
  44. package/dist/commands/generate.js.map +1 -0
  45. package/dist/commands/image.d.ts +3 -0
  46. package/dist/commands/image.d.ts.map +1 -0
  47. package/dist/commands/image.js +139 -0
  48. package/dist/commands/image.js.map +1 -0
  49. package/dist/commands/init.d.ts +3 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +144 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/interrupt.d.ts +3 -0
  54. package/dist/commands/interrupt.d.ts.map +1 -0
  55. package/dist/commands/interrupt.js +54 -0
  56. package/dist/commands/interrupt.js.map +1 -0
  57. package/dist/commands/model.d.ts +3 -0
  58. package/dist/commands/model.d.ts.map +1 -0
  59. package/dist/commands/model.js +82 -0
  60. package/dist/commands/model.js.map +1 -0
  61. package/dist/commands/node.d.ts +3 -0
  62. package/dist/commands/node.d.ts.map +1 -0
  63. package/dist/commands/node.js +148 -0
  64. package/dist/commands/node.js.map +1 -0
  65. package/dist/commands/queue.d.ts +3 -0
  66. package/dist/commands/queue.d.ts.map +1 -0
  67. package/dist/commands/queue.js +199 -0
  68. package/dist/commands/queue.js.map +1 -0
  69. package/dist/commands/system.d.ts +3 -0
  70. package/dist/commands/system.d.ts.map +1 -0
  71. package/dist/commands/system.js +85 -0
  72. package/dist/commands/system.js.map +1 -0
  73. package/dist/commands/task.d.ts +3 -0
  74. package/dist/commands/task.d.ts.map +1 -0
  75. package/dist/commands/task.js +176 -0
  76. package/dist/commands/task.js.map +1 -0
  77. package/dist/commands/tryon.d.ts +3 -0
  78. package/dist/commands/tryon.d.ts.map +1 -0
  79. package/dist/commands/tryon.js +178 -0
  80. package/dist/commands/tryon.js.map +1 -0
  81. package/dist/commands/tts.d.ts +3 -0
  82. package/dist/commands/tts.d.ts.map +1 -0
  83. package/dist/commands/tts.js +157 -0
  84. package/dist/commands/tts.js.map +1 -0
  85. package/dist/commands/video.d.ts +3 -0
  86. package/dist/commands/video.d.ts.map +1 -0
  87. package/dist/commands/video.js +137 -0
  88. package/dist/commands/video.js.map +1 -0
  89. package/dist/commands/workflow.d.ts +3 -0
  90. package/dist/commands/workflow.d.ts.map +1 -0
  91. package/dist/commands/workflow.js +244 -0
  92. package/dist/commands/workflow.js.map +1 -0
  93. package/dist/index.d.ts +3 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +58 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/services/api.d.ts +23 -0
  98. package/dist/services/api.d.ts.map +1 -0
  99. package/dist/services/api.js +108 -0
  100. package/dist/services/api.js.map +1 -0
  101. package/dist/services/auth.d.ts +10 -0
  102. package/dist/services/auth.d.ts.map +1 -0
  103. package/dist/services/auth.js +34 -0
  104. package/dist/services/auth.js.map +1 -0
  105. package/dist/services/bfl-api.d.ts +67 -0
  106. package/dist/services/bfl-api.d.ts.map +1 -0
  107. package/dist/services/bfl-api.js +108 -0
  108. package/dist/services/bfl-api.js.map +1 -0
  109. package/dist/services/config.d.ts +12 -0
  110. package/dist/services/config.d.ts.map +1 -0
  111. package/dist/services/config.js +30 -0
  112. package/dist/services/config.js.map +1 -0
  113. package/dist/services/dashscope-api.d.ts +69 -0
  114. package/dist/services/dashscope-api.d.ts.map +1 -0
  115. package/dist/services/dashscope-api.js +134 -0
  116. package/dist/services/dashscope-api.js.map +1 -0
  117. package/dist/services/dashscope-tts-api.d.ts +23 -0
  118. package/dist/services/dashscope-tts-api.d.ts.map +1 -0
  119. package/dist/services/dashscope-tts-api.js +56 -0
  120. package/dist/services/dashscope-tts-api.js.map +1 -0
  121. package/dist/services/fashn-api.d.ts +57 -0
  122. package/dist/services/fashn-api.d.ts.map +1 -0
  123. package/dist/services/fashn-api.js +84 -0
  124. package/dist/services/fashn-api.js.map +1 -0
  125. package/dist/services/generation-api.d.ts +139 -0
  126. package/dist/services/generation-api.d.ts.map +1 -0
  127. package/dist/services/generation-api.js +236 -0
  128. package/dist/services/generation-api.js.map +1 -0
  129. package/dist/services/groq-api.d.ts +18 -0
  130. package/dist/services/groq-api.d.ts.map +1 -0
  131. package/dist/services/groq-api.js +30 -0
  132. package/dist/services/groq-api.js.map +1 -0
  133. package/dist/services/websocket.d.ts +33 -0
  134. package/dist/services/websocket.d.ts.map +1 -0
  135. package/dist/services/websocket.js +217 -0
  136. package/dist/services/websocket.js.map +1 -0
  137. package/dist/utils/helpText.d.ts +15 -0
  138. package/dist/utils/helpText.d.ts.map +1 -0
  139. package/dist/utils/helpText.js +37 -0
  140. package/dist/utils/helpText.js.map +1 -0
  141. package/dist/utils/logger.d.ts +5 -0
  142. package/dist/utils/logger.d.ts.map +1 -0
  143. package/dist/utils/logger.js +14 -0
  144. package/dist/utils/logger.js.map +1 -0
  145. package/dist/utils/output.d.ts +54 -0
  146. package/dist/utils/output.d.ts.map +1 -0
  147. package/dist/utils/output.js +76 -0
  148. package/dist/utils/output.js.map +1 -0
  149. package/dist/utils/workflow.d.ts +17 -0
  150. package/dist/utils/workflow.d.ts.map +1 -0
  151. package/dist/utils/workflow.js +81 -0
  152. package/dist/utils/workflow.js.map +1 -0
  153. package/package.json +61 -0
@@ -0,0 +1,217 @@
1
+ import WebSocket from 'ws';
2
+ import { EventEmitter } from 'events';
3
+ import { getConfig } from './config.js';
4
+ export class ComfyWebSocket extends EventEmitter {
5
+ ws = null;
6
+ clientId;
7
+ reconnectAttempts = 0;
8
+ maxReconnectAttempts = 3;
9
+ constructor(clientId) {
10
+ super();
11
+ this.clientId = clientId || `comfy-cli-${Date.now()}`;
12
+ }
13
+ async connect() {
14
+ const config = getConfig();
15
+ const serverUrl = new URL(config.server);
16
+ // 构建 WebSocket URL
17
+ const protocol = serverUrl.protocol === 'https:' ? 'wss:' : 'ws:';
18
+ const wsUrl = `${protocol}//${serverUrl.host}/ws?clientId=${this.clientId}`;
19
+ return new Promise((resolve, reject) => {
20
+ try {
21
+ this.ws = new WebSocket(wsUrl);
22
+ // 添加连接超时
23
+ const connectTimeout = setTimeout(() => {
24
+ if (this.ws && this.ws.readyState !== WebSocket.OPEN) {
25
+ this.ws.terminate();
26
+ reject(new Error('WebSocket connection timeout'));
27
+ }
28
+ }, 10000); // 10秒超时
29
+ this.ws.on('open', () => {
30
+ clearTimeout(connectTimeout);
31
+ this.reconnectAttempts = 0;
32
+ this.emit('connected');
33
+ resolve();
34
+ });
35
+ this.ws.on('message', (data) => {
36
+ try {
37
+ const message = JSON.parse(data.toString());
38
+ this.handleMessage(message);
39
+ }
40
+ catch (error) {
41
+ this.emit('error', new Error(`Failed to parse message: ${error}`));
42
+ }
43
+ });
44
+ this.ws.on('error', (error) => {
45
+ clearTimeout(connectTimeout);
46
+ this.emit('error', error);
47
+ reject(error);
48
+ });
49
+ this.ws.on('close', () => {
50
+ clearTimeout(connectTimeout);
51
+ this.emit('disconnected');
52
+ this.ws = null;
53
+ });
54
+ }
55
+ catch (error) {
56
+ reject(error);
57
+ }
58
+ });
59
+ }
60
+ handleMessage(message) {
61
+ const { type, data } = message;
62
+ switch (type) {
63
+ case 'status':
64
+ this.emit('status', data);
65
+ break;
66
+ case 'progress':
67
+ this.emit('progress', data);
68
+ break;
69
+ case 'executing':
70
+ this.emit('executing', data);
71
+ break;
72
+ case 'executed':
73
+ this.emit('executed', data);
74
+ break;
75
+ case 'execution_start':
76
+ this.emit('execution_start', data);
77
+ break;
78
+ case 'execution_cached':
79
+ this.emit('execution_cached', data);
80
+ break;
81
+ case 'execution_success':
82
+ this.emit('execution_success', data);
83
+ break;
84
+ case 'execution_error':
85
+ this.emit('execution_error', data);
86
+ break;
87
+ default:
88
+ this.emit('message', message);
89
+ }
90
+ }
91
+ disconnect() {
92
+ if (this.ws) {
93
+ this.ws.close();
94
+ this.ws = null;
95
+ }
96
+ }
97
+ isConnected() {
98
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
99
+ }
100
+ getClientId() {
101
+ return this.clientId;
102
+ }
103
+ }
104
+ /**
105
+ * 监听特定 prompt_id 的执行进度
106
+ */
107
+ export async function monitorProgress(promptId, onProgress, onComplete) {
108
+ const ws = new ComfyWebSocket();
109
+ return new Promise(async (resolve, reject) => {
110
+ let currentStep = 0;
111
+ let totalSteps = 0;
112
+ let hasStarted = false;
113
+ let hasCompleted = false;
114
+ let timeout;
115
+ let completionCheckTimeout = null;
116
+ // 设置所有事件监听器
117
+ ws.on('connected', () => {
118
+ onProgress?.(0, 100, 'WebSocket 已连接,等待执行...');
119
+ });
120
+ ws.on('status', (data) => {
121
+ // 接收到初始状态消息
122
+ if (!hasStarted) {
123
+ onProgress?.(0, 100, '等待任务开始...');
124
+ }
125
+ // 检查队列是否为空且任务已完成
126
+ if (hasStarted && !hasCompleted && data.status?.exec_info?.queue_remaining === 0) {
127
+ if (currentStep === totalSteps && totalSteps > 0) {
128
+ hasCompleted = true;
129
+ clearTimeout(timeout);
130
+ if (completionCheckTimeout)
131
+ clearTimeout(completionCheckTimeout);
132
+ ws.disconnect();
133
+ onComplete?.();
134
+ resolve();
135
+ }
136
+ }
137
+ });
138
+ ws.on('progress', (data) => {
139
+ // 只处理我们的 prompt_id 的消息
140
+ if (data.prompt_id !== promptId) {
141
+ return;
142
+ }
143
+ hasStarted = true;
144
+ if (data.max > 0) {
145
+ currentStep = data.value;
146
+ totalSteps = data.max;
147
+ const percent = Math.round((currentStep / totalSteps) * 100);
148
+ onProgress?.(currentStep, totalSteps, `处理中: ${percent}%`);
149
+ // 如果达到最大步数,设置一个延迟检查
150
+ if (currentStep === totalSteps) {
151
+ if (completionCheckTimeout)
152
+ clearTimeout(completionCheckTimeout);
153
+ completionCheckTimeout = setTimeout(() => {
154
+ if (!hasCompleted) {
155
+ hasCompleted = true;
156
+ clearTimeout(timeout);
157
+ ws.disconnect();
158
+ onComplete?.();
159
+ resolve();
160
+ }
161
+ }, 2000); // 等待2秒确认完成
162
+ }
163
+ }
164
+ });
165
+ ws.on('executing', (data) => {
166
+ // 只处理我们的 prompt_id 的消息
167
+ if (data.prompt_id !== promptId) {
168
+ return;
169
+ }
170
+ hasStarted = true;
171
+ if (data.node === null) {
172
+ // 执行完成
173
+ hasCompleted = true;
174
+ clearTimeout(timeout);
175
+ if (completionCheckTimeout)
176
+ clearTimeout(completionCheckTimeout);
177
+ ws.disconnect();
178
+ onComplete?.();
179
+ resolve();
180
+ }
181
+ });
182
+ ws.on('execution_error', (data) => {
183
+ if (data.prompt_id === promptId) {
184
+ clearTimeout(timeout);
185
+ if (completionCheckTimeout)
186
+ clearTimeout(completionCheckTimeout);
187
+ ws.disconnect();
188
+ reject(new Error(`执行失败: ${JSON.stringify(data)}`));
189
+ }
190
+ });
191
+ ws.on('error', (error) => {
192
+ clearTimeout(timeout);
193
+ if (completionCheckTimeout)
194
+ clearTimeout(completionCheckTimeout);
195
+ ws.disconnect();
196
+ reject(error);
197
+ });
198
+ // 超时保护
199
+ timeout = setTimeout(() => {
200
+ if (ws.isConnected()) {
201
+ if (completionCheckTimeout)
202
+ clearTimeout(completionCheckTimeout);
203
+ ws.disconnect();
204
+ reject(new Error('执行超时'));
205
+ }
206
+ }, 5 * 60 * 1000); // 5分钟超时
207
+ // 连接 WebSocket
208
+ try {
209
+ await ws.connect();
210
+ }
211
+ catch (error) {
212
+ clearTimeout(timeout);
213
+ reject(error);
214
+ }
215
+ });
216
+ }
217
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/services/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAoBxC,MAAM,OAAO,cAAe,SAAQ,YAAY;IACtC,EAAE,GAAqB,IAAI,CAAC;IAC5B,QAAQ,CAAS;IACjB,iBAAiB,GAAG,CAAC,CAAC;IACtB,oBAAoB,GAAG,CAAC,CAAC;IAEjC,YAAY,QAAiB;QAC3B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEzC,mBAAmB;QACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,MAAM,KAAK,GAAG,GAAG,QAAQ,KAAK,SAAS,CAAC,IAAI,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE5E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;gBAE/B,SAAS;gBACT,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;oBACrC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;wBACrD,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;wBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;oBACpD,CAAC;gBACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ;gBAEnB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,YAAY,CAAC,cAAc,CAAC,CAAC;oBAC7B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACvB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAoB,EAAE,EAAE;oBAC7C,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC5C,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBAC9B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC5B,YAAY,CAAC,cAAc,CAAC,CAAC;oBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC1B,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACvB,YAAY,CAAC,cAAc,CAAC,CAAC;oBAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC1B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,OAAY;QAChC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAE/B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC1B,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAoB,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAqB,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAoB,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,iBAAiB;gBACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,kBAAkB;gBACrB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,mBAAmB;gBACtB,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,iBAAiB;gBACpB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;gBACnC,MAAM;YACR;gBACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IACnE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,UAAsE,EACtE,UAAuB;IAEvB,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;IAEhC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,OAAuB,CAAC;QAC5B,IAAI,sBAAsB,GAA0B,IAAI,CAAC;QAEzD,YAAY;QACZ,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;YACtB,UAAU,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,uBAAuB,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAS,EAAE,EAAE;YAC5B,YAAY;YACZ,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YACpC,CAAC;YAED,iBAAiB;YACjB,IAAI,UAAU,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,KAAK,CAAC,EAAE,CAAC;gBACjF,IAAI,WAAW,KAAK,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACjD,YAAY,GAAG,IAAI,CAAC;oBACpB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,IAAI,sBAAsB;wBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;oBACjE,EAAE,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,EAAE,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAkB,EAAE,EAAE;YACvC,uBAAuB;YACvB,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;gBACzB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC7D,UAAU,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,OAAO,GAAG,CAAC,CAAC;gBAE1D,oBAAoB;gBACpB,IAAI,WAAW,KAAK,UAAU,EAAE,CAAC;oBAC/B,IAAI,sBAAsB;wBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;oBACjE,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE;wBACvC,IAAI,CAAC,YAAY,EAAE,CAAC;4BAClB,YAAY,GAAG,IAAI,CAAC;4BACpB,YAAY,CAAC,OAAO,CAAC,CAAC;4BACtB,EAAE,CAAC,UAAU,EAAE,CAAC;4BAChB,UAAU,EAAE,EAAE,CAAC;4BACf,OAAO,EAAE,CAAC;wBACZ,CAAC;oBACH,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW;gBACvB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAmB,EAAE,EAAE;YACzC,uBAAuB;YACvB,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO;gBACP,YAAY,GAAG,IAAI,CAAC;gBACpB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,sBAAsB;oBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;gBACjE,EAAE,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,EAAE,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAS,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAChC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,sBAAsB;oBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;gBACjE,EAAE,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,sBAAsB;gBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;YACjE,EAAE,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO;QACP,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,IAAI,sBAAsB;oBAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;gBACjE,EAAE,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ;QAE3B,eAAe;QACf,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from 'commander';
2
+ export interface HelpTextOptions {
3
+ examples?: string[];
4
+ outputJson?: string;
5
+ relatedCommands?: Array<{
6
+ command: string;
7
+ description: string;
8
+ }>;
9
+ notes?: string[];
10
+ }
11
+ /**
12
+ * Add enhanced help text to a command with examples, output format, related commands, and notes
13
+ */
14
+ export declare function addEnhancedHelp(command: Command, options: HelpTextOptions): Command;
15
+ //# sourceMappingURL=helpText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpText.d.ts","sourceRoot":"","sources":["../../src/utils/helpText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAsCT"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Add enhanced help text to a command with examples, output format, related commands, and notes
3
+ */
4
+ export function addEnhancedHelp(command, options) {
5
+ command.addHelpText('after', () => {
6
+ let text = '';
7
+ if (options.examples && options.examples.length > 0) {
8
+ text += '\nExamples:\n';
9
+ options.examples.forEach(ex => {
10
+ text += ` ${ex}\n`;
11
+ });
12
+ }
13
+ if (options.outputJson) {
14
+ text += '\nOutput (JSON):\n';
15
+ const lines = options.outputJson.split('\n');
16
+ lines.forEach(line => {
17
+ text += ` ${line}\n`;
18
+ });
19
+ }
20
+ if (options.relatedCommands && options.relatedCommands.length > 0) {
21
+ text += '\nRelated Commands:\n';
22
+ options.relatedCommands.forEach(rc => {
23
+ const cmd = `gen ${rc.command}`.padEnd(30);
24
+ text += ` ${cmd} ${rc.description}\n`;
25
+ });
26
+ }
27
+ if (options.notes && options.notes.length > 0) {
28
+ text += '\nNotes:\n';
29
+ options.notes.forEach(note => {
30
+ text += ` - ${note}\n`;
31
+ });
32
+ }
33
+ return text;
34
+ });
35
+ return command;
36
+ }
37
+ //# sourceMappingURL=helpText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../src/utils/helpText.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,OAAwB;IAExB,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;QAChC,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,eAAe,CAAC;YACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBAC5B,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,IAAI,oBAAoB,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACnB,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,IAAI,IAAI,uBAAuB,CAAC;YAChC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;gBACnC,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC,WAAW,IAAI,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,IAAI,YAAY,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC3B,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,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,54 @@
1
+ /**
2
+ * 设置全局 pretty 模式
3
+ */
4
+ export declare function setGlobalPrettyMode(pretty: boolean): void;
5
+ /**
6
+ * 获取全局 pretty 模式状态
7
+ */
8
+ export declare function isGlobalPrettyMode(): boolean;
9
+ /**
10
+ * 判断是否应该使用 pretty 模式
11
+ * 优先级:命令级别 pretty 选项 > 全局 pretty 选项
12
+ */
13
+ export declare function isPrettyMode(options?: {
14
+ pretty?: boolean;
15
+ }): boolean;
16
+ /**
17
+ * 成功响应结构
18
+ */
19
+ export interface SuccessResponse<T = any> {
20
+ success: true;
21
+ data: T;
22
+ }
23
+ /**
24
+ * 错误响应结构
25
+ */
26
+ export interface ErrorResponse {
27
+ success: false;
28
+ error: {
29
+ code: string;
30
+ message: string;
31
+ };
32
+ }
33
+ /**
34
+ * 输出成功响应
35
+ */
36
+ export declare function outputSuccess<T>(data: T, options?: {
37
+ pretty?: boolean;
38
+ }): void;
39
+ /**
40
+ * 输出错误响应并退出
41
+ */
42
+ export declare function outputError(code: string, message: string, options?: {
43
+ pretty?: boolean;
44
+ }): never;
45
+ /**
46
+ * Pretty 模式下的日志函数
47
+ */
48
+ export declare const prettyLog: {
49
+ success(message: string): void;
50
+ error(message: string): void;
51
+ info(message: string): void;
52
+ warning(message: string): void;
53
+ };
54
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAKpE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAW9E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,KAAK,CAgBhG;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;qBACH,MAAM,GAAG,IAAI;mBAGf,MAAM,GAAG,IAAI;kBAGd,MAAM,GAAG,IAAI;qBAGV,MAAM,GAAG,IAAI;CAG/B,CAAC"}
@@ -0,0 +1,76 @@
1
+ import chalk from 'chalk';
2
+ // 全局状态,由主程序设置
3
+ let globalPrettyMode = false;
4
+ /**
5
+ * 设置全局 pretty 模式
6
+ */
7
+ export function setGlobalPrettyMode(pretty) {
8
+ globalPrettyMode = pretty;
9
+ }
10
+ /**
11
+ * 获取全局 pretty 模式状态
12
+ */
13
+ export function isGlobalPrettyMode() {
14
+ return globalPrettyMode;
15
+ }
16
+ /**
17
+ * 判断是否应该使用 pretty 模式
18
+ * 优先级:命令级别 pretty 选项 > 全局 pretty 选项
19
+ */
20
+ export function isPrettyMode(options) {
21
+ if (options?.pretty !== undefined) {
22
+ return options.pretty;
23
+ }
24
+ return globalPrettyMode;
25
+ }
26
+ /**
27
+ * 输出成功响应
28
+ */
29
+ export function outputSuccess(data, options) {
30
+ if (isPrettyMode(options)) {
31
+ // Pretty 模式:不输出 JSON,由调用方自行处理输出
32
+ return;
33
+ }
34
+ const response = {
35
+ success: true,
36
+ data,
37
+ };
38
+ console.log(JSON.stringify(response));
39
+ }
40
+ /**
41
+ * 输出错误响应并退出
42
+ */
43
+ export function outputError(code, message, options) {
44
+ if (isPrettyMode(options)) {
45
+ // Pretty 模式:使用带颜色的输出
46
+ console.error(chalk.red('✗'), message);
47
+ process.exit(1);
48
+ }
49
+ const response = {
50
+ success: false,
51
+ error: {
52
+ code,
53
+ message,
54
+ },
55
+ };
56
+ console.log(JSON.stringify(response));
57
+ process.exit(1);
58
+ }
59
+ /**
60
+ * Pretty 模式下的日志函数
61
+ */
62
+ export const prettyLog = {
63
+ success(message) {
64
+ console.log(chalk.green('✓'), message);
65
+ },
66
+ error(message) {
67
+ console.error(chalk.red('✗'), message);
68
+ },
69
+ info(message) {
70
+ console.log(chalk.blue('ℹ'), message);
71
+ },
72
+ warning(message) {
73
+ console.log(chalk.yellow('⚠'), message);
74
+ },
75
+ };
76
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,cAAc;AACd,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,gBAAgB,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAA8B;IACzD,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAqBD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAI,IAAO,EAAE,OAA8B;IACtE,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,gCAAgC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAuB;QACnC,OAAO,EAAE,IAAI;QACb,IAAI;KACL,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,OAA8B;IACvF,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,qBAAqB;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAkB;QAC9B,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI;YACJ,OAAO;SACR;KACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF,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":"AAIA;;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,CAM3D"}
@@ -0,0 +1,81 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ /**
5
+ * 从 workflow 中提取所有 {{variable}} 变量
6
+ */
7
+ export function extractVariables(workflow) {
8
+ const variables = new Set();
9
+ const regex = /\{\{(\w+)\}\}/g;
10
+ const traverse = (obj) => {
11
+ if (typeof obj === 'string') {
12
+ let match;
13
+ while ((match = regex.exec(obj)) !== null) {
14
+ variables.add(match[1]);
15
+ }
16
+ }
17
+ else if (Array.isArray(obj)) {
18
+ obj.forEach(traverse);
19
+ }
20
+ else if (obj && typeof obj === 'object') {
21
+ Object.values(obj).forEach(traverse);
22
+ }
23
+ };
24
+ traverse(workflow);
25
+ return Array.from(variables);
26
+ }
27
+ /**
28
+ * 替换 workflow 中的变量
29
+ */
30
+ export function replaceVariables(workflow, values) {
31
+ const result = JSON.parse(JSON.stringify(workflow));
32
+ const traverse = (obj) => {
33
+ if (typeof obj === 'string') {
34
+ return obj.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
35
+ if (varName in values) {
36
+ return String(values[varName]);
37
+ }
38
+ return match;
39
+ });
40
+ }
41
+ else if (Array.isArray(obj)) {
42
+ return obj.map(traverse);
43
+ }
44
+ else if (obj && typeof obj === 'object') {
45
+ const newObj = {};
46
+ for (const [key, value] of Object.entries(obj)) {
47
+ newObj[key] = traverse(value);
48
+ }
49
+ return newObj;
50
+ }
51
+ return obj;
52
+ };
53
+ return traverse(result);
54
+ }
55
+ /**
56
+ * 加载 workflow 文件
57
+ */
58
+ export function loadWorkflow(workflowPath) {
59
+ const fullPath = path.resolve(workflowPath);
60
+ if (!fs.existsSync(fullPath)) {
61
+ throw new Error(`Workflow file not found: ${fullPath}`);
62
+ }
63
+ try {
64
+ const content = fs.readFileSync(fullPath, 'utf-8');
65
+ return JSON.parse(content);
66
+ }
67
+ catch (error) {
68
+ throw new Error(`Failed to parse workflow file: ${error}`);
69
+ }
70
+ }
71
+ /**
72
+ * 获取内置 workflow 路径
73
+ */
74
+ export function getBuiltinWorkflowPath(name) {
75
+ // 从项目根目录的 workflows 目录加载
76
+ const __filename = fileURLToPath(import.meta.url);
77
+ const __dirname = path.dirname(__filename);
78
+ const projectRoot = path.resolve(__dirname, '../../');
79
+ return path.join(projectRoot, 'workflows', name);
80
+ }
81
+ //# 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,61 @@
1
+ {
2
+ "name": "@optima-chat/gen-cli",
3
+ "version": "1.0.0",
4
+ "description": "AI content generation CLI for LLM agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "gen": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest run",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "cli",
19
+ "ai",
20
+ "image-generation",
21
+ "llm",
22
+ "flux",
23
+ "text-to-image",
24
+ "tts",
25
+ "asr",
26
+ "video-generation"
27
+ ],
28
+ "author": "Optima Chat",
29
+ "license": "MIT",
30
+ "homepage": "https://github.com/Optima-Chat/optima-gen#readme",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/Optima-Chat/optima-gen.git"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/Optima-Chat/optima-gen/issues"
37
+ },
38
+ "files": [
39
+ "dist",
40
+ ".claude"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "engines": {
46
+ "node": ">=18.0.0"
47
+ },
48
+ "dependencies": {
49
+ "axios": "^1.7.9",
50
+ "chalk": "^5.4.1",
51
+ "commander": "^11.1.0",
52
+ "conf": "^12.0.0",
53
+ "ora": "^7.0.1"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^20.17.10",
57
+ "tsx": "^4.19.2",
58
+ "vitest": "^2.1.9",
59
+ "typescript": "^5.7.2"
60
+ }
61
+ }