workplace-pua-cli 0.4.1 → 0.7.1
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/LICENSE +21 -0
- package/README.md +512 -243
- package/dist/commands/chat-new-imports.js +2 -0
- package/dist/commands/config.js +14 -6
- package/dist/commands/email.js +301 -0
- package/dist/commands/interview.js +660 -0
- package/dist/commands/jargon.js +153 -0
- package/dist/commands/meeting-room.js +384 -0
- package/dist/commands/meeting.js +323 -0
- package/dist/commands/weekly.js +302 -0
- package/dist/index.js +29 -7
- package/dist/prompts/hr.js +126 -0
- package/dist/prompts/index.js +82 -1
- package/dist/prompts/intern.js +126 -0
- package/dist/prompts/interview-prompts.js +286 -0
- package/dist/prompts/meeting-prompts.js +229 -0
- package/dist/prompts/pm.js +123 -0
- package/dist/prompts/techlead.js +126 -0
- package/dist/utils/box.js +141 -0
- package/dist/utils/meeting-utils.js +194 -0
- package/dist/utils/resume-parser.js +122 -0
- package/dist/utils/stream.js +97 -13
- package/dist/utils/theme.js +177 -0
- package/package.json +73 -52
- package/.env.example +0 -4
- package/.eslintrc.json +0 -21
- package/.prettierrc.json +0 -9
- package/CHANGELOG.md +0 -113
- package/docs/OPTIMIZATION.md +0 -772
- package/docs/TECHNICAL_PRINCIPLES.md +0 -663
- package/sample/1.png +0 -0
- package/sample/2.png +0 -0
- package/screenshots/chat-dialogue.png +0 -0
- package/screenshots/chat-mode.png +0 -0
- package/src/__tests__/config/settings.test.ts +0 -48
- package/src/__tests__/prompts/boss.test.ts +0 -35
- package/src/commands/chat.ts +0 -328
- package/src/commands/config.ts +0 -283
- package/src/commands/prompt.ts +0 -154
- package/src/config/providers.ts +0 -109
- package/src/config/session-storage.ts +0 -94
- package/src/config/settings.ts +0 -194
- package/src/config/storage.ts +0 -150
- package/src/history/session.ts +0 -141
- package/src/index.ts +0 -164
- package/src/llm/base.ts +0 -55
- package/src/llm/factory.ts +0 -24
- package/src/llm/openai.ts +0 -113
- package/src/llm/zhipu.ts +0 -101
- package/src/prompts/boss.ts +0 -43
- package/src/prompts/employee.ts +0 -43
- package/src/prompts/index.ts +0 -3
- package/src/utils/formatter.ts +0 -104
- package/src/utils/logger.ts +0 -31
- package/src/utils/stream.ts +0 -76
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -18
package/dist/commands/config.js
CHANGED
|
@@ -12,6 +12,7 @@ const confirm_1 = __importDefault(require("@inquirer/confirm"));
|
|
|
12
12
|
const storage_1 = require("../config/storage");
|
|
13
13
|
const providers_1 = require("../config/providers");
|
|
14
14
|
const logger_1 = require("../utils/logger");
|
|
15
|
+
const prompts_1 = require("../prompts");
|
|
15
16
|
/**
|
|
16
17
|
* Run the configuration wizard
|
|
17
18
|
*/
|
|
@@ -114,13 +115,17 @@ async function configWizard(options = {}) {
|
|
|
114
115
|
const role = await (0, select_1.default)({
|
|
115
116
|
message: '选择默认角色:',
|
|
116
117
|
choices: [
|
|
117
|
-
{ name:
|
|
118
|
-
{ name:
|
|
118
|
+
{ name: `${prompts_1.ROLE_EMOJIS.boss} 老板 (PUA 别人)`, value: 'boss' },
|
|
119
|
+
{ name: `${prompts_1.ROLE_EMOJIS.employee} 员工 (被 PUA)`, value: 'employee' },
|
|
120
|
+
{ name: `${prompts_1.ROLE_EMOJIS.pm} 产品经理 (画饼大师)`, value: 'pm' },
|
|
121
|
+
{ name: `${prompts_1.ROLE_EMOJIS.hr} HR (公司就是家)`, value: 'hr' },
|
|
122
|
+
{ name: `${prompts_1.ROLE_EMOJIS.techlead} 技术主管 (指点江山)`, value: 'techlead' },
|
|
123
|
+
{ name: `${prompts_1.ROLE_EMOJIS.intern} 实习生 (求带求教)`, value: 'intern' },
|
|
119
124
|
],
|
|
120
125
|
default: existingConfig?.defaults.role || 'boss',
|
|
121
126
|
});
|
|
122
127
|
console.log();
|
|
123
|
-
console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white(role
|
|
128
|
+
console.log(chalk_1.default.gray(`已选择: ${chalk_1.default.white(prompts_1.ROLE_NAMES[role])}`));
|
|
124
129
|
console.log();
|
|
125
130
|
// Step 6: Select Default Severity
|
|
126
131
|
const severity = await (0, select_1.default)({
|
|
@@ -177,8 +182,11 @@ async function configWizard(options = {}) {
|
|
|
177
182
|
console.log();
|
|
178
183
|
console.log(chalk_1.default.white.bold('配置完成!现在你可以开始使用 PUA CLI 了:'));
|
|
179
184
|
console.log();
|
|
180
|
-
console.log(' ' + chalk_1.default.white('pua chat --role boss') + chalk_1.default.gray('
|
|
181
|
-
console.log(' ' + chalk_1.default.white('pua
|
|
185
|
+
console.log(' ' + chalk_1.default.white('pua chat --role boss') + chalk_1.default.gray(' # 启动老板模式'));
|
|
186
|
+
console.log(' ' + chalk_1.default.white('pua chat --role pm') + chalk_1.default.gray(' # 启动产品经理模式'));
|
|
187
|
+
console.log(' ' + chalk_1.default.white('pua prompt --role hr "你好"') + chalk_1.default.gray(' # 单次提示'));
|
|
188
|
+
console.log(' ' + chalk_1.default.white('pua jargon --type meeting') + chalk_1.default.gray(' # 生成会议黑话'));
|
|
189
|
+
console.log(' ' + chalk_1.default.white('pua weekly --role pm') + chalk_1.default.gray(' # 生成产品经理周报'));
|
|
182
190
|
console.log();
|
|
183
191
|
console.log(chalk_1.default.gray('更多选项请运行: pua --help'));
|
|
184
192
|
console.log();
|
|
@@ -230,7 +238,7 @@ async function showConfig() {
|
|
|
230
238
|
}
|
|
231
239
|
console.log(chalk_1.default.bold('默认设置:'));
|
|
232
240
|
console.log(` 模型: ${chalk_1.default.white(config.defaults.model)}`);
|
|
233
|
-
console.log(` 角色: ${chalk_1.default.white(config.defaults.role)}`);
|
|
241
|
+
console.log(` 角色: ${chalk_1.default.white(prompts_1.ROLE_NAMES[config.defaults.role])}`);
|
|
234
242
|
console.log(` 强度: ${chalk_1.default.white(config.defaults.severity)}`);
|
|
235
243
|
console.log();
|
|
236
244
|
console.log(chalk_1.default.gray('配置文件:'), chalk_1.default.white(getConfigPath()));
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 邮件语气转换器
|
|
4
|
+
* 功能:根据不同角色转换邮件语气
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.transformEmailTone = transformEmailTone;
|
|
11
|
+
exports.createEmailCommand = createEmailCommand;
|
|
12
|
+
const commander_1 = require("commander");
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
/**
|
|
15
|
+
* 邮件语气转换规则
|
|
16
|
+
*/
|
|
17
|
+
const EMAIL_TEMPLATES = {
|
|
18
|
+
// PM -> 开发
|
|
19
|
+
'pm-employee': {
|
|
20
|
+
polite: [
|
|
21
|
+
'辛苦处理一下{content},谢谢',
|
|
22
|
+
'麻烦处理并跟进,祝好',
|
|
23
|
+
'团队好,请处理{content}'
|
|
24
|
+
],
|
|
25
|
+
urgent: [
|
|
26
|
+
'【紧急】请立即处理{content}',
|
|
27
|
+
'请尽快处理,这个很紧急',
|
|
28
|
+
'这个今天要处理完,辛苦一下'
|
|
29
|
+
],
|
|
30
|
+
casual: [
|
|
31
|
+
'{content},麻烦搞一下',
|
|
32
|
+
'帮我看下{content},谢啦',
|
|
33
|
+
'{content}搞完跟我说声'
|
|
34
|
+
],
|
|
35
|
+
passive: [
|
|
36
|
+
'如果方便的话,请处理{content}',
|
|
37
|
+
'不好意思打扰,想处理一下{content}',
|
|
38
|
+
'什么时候有时间处理一下{content}'
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
// 开发 -> PM
|
|
42
|
+
'employee-pm': {
|
|
43
|
+
polite: [
|
|
44
|
+
'{content}已处理,请review',
|
|
45
|
+
'附件已上传,请review',
|
|
46
|
+
'{content}已完成,请确认'
|
|
47
|
+
],
|
|
48
|
+
urgent: [
|
|
49
|
+
'{content}可能需要支持,请确认',
|
|
50
|
+
'这个{content}有点复杂,需要讨论',
|
|
51
|
+
'时间可能延期,请调整'
|
|
52
|
+
],
|
|
53
|
+
casual: [
|
|
54
|
+
'{content}OK了,你看看',
|
|
55
|
+
'{content}搞定,你review一下',
|
|
56
|
+
'{content}没问题了'
|
|
57
|
+
],
|
|
58
|
+
passive: [
|
|
59
|
+
'{content}应该处理完了,请确认',
|
|
60
|
+
'我觉得{content}这样行,团队你觉得呢',
|
|
61
|
+
'{content}暂时这样,有问题讨论'
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
// HR -> 员工
|
|
65
|
+
'hr-employee': {
|
|
66
|
+
polite: [
|
|
67
|
+
'{content}(收到请回复)',
|
|
68
|
+
'请查收{content},祝好',
|
|
69
|
+
'麻烦处理一下{content}'
|
|
70
|
+
],
|
|
71
|
+
urgent: [
|
|
72
|
+
'【重要】请及时处理{content}',
|
|
73
|
+
'请务必处理,后果自负',
|
|
74
|
+
'今天下班前请处理'
|
|
75
|
+
],
|
|
76
|
+
casual: [
|
|
77
|
+
'{content}啊,团队',
|
|
78
|
+
'{content}哈,有空处理一下',
|
|
79
|
+
'{content}~'
|
|
80
|
+
],
|
|
81
|
+
passive: [
|
|
82
|
+
'如果方便的话请处理{content}',
|
|
83
|
+
'不好意思,想处理一下{content}',
|
|
84
|
+
'请问什么时候方便处理{content}'
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
// 员工 -> HR
|
|
88
|
+
'employee-hr': {
|
|
89
|
+
polite: [
|
|
90
|
+
'好的,我马上处理',
|
|
91
|
+
'收到,我会尽快处理',
|
|
92
|
+
'{content},我明白了'
|
|
93
|
+
],
|
|
94
|
+
urgent: [
|
|
95
|
+
'立即处理',
|
|
96
|
+
'马上处理',
|
|
97
|
+
'处理中'
|
|
98
|
+
],
|
|
99
|
+
casual: [
|
|
100
|
+
'OK',
|
|
101
|
+
'行',
|
|
102
|
+
'好团队'
|
|
103
|
+
],
|
|
104
|
+
passive: [
|
|
105
|
+
'我看看时间安排处理',
|
|
106
|
+
'应该可以处理吧',
|
|
107
|
+
'我尽量处理'
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 语气修饰词
|
|
113
|
+
*/
|
|
114
|
+
const TONE_MODIFIERS = {
|
|
115
|
+
polite: {
|
|
116
|
+
prefix: ['麻烦', '辛苦', '劳烦', '望'],
|
|
117
|
+
suffix: ['谢谢', '为盼', '顺颂商祺', '祝好']
|
|
118
|
+
},
|
|
119
|
+
urgent: {
|
|
120
|
+
prefix: ['请立即', '请尽快', '请务必', '【紧急】', '【重要】'],
|
|
121
|
+
suffix: ['谢谢配合', '辛苦了', '请支持']
|
|
122
|
+
},
|
|
123
|
+
casual: {
|
|
124
|
+
prefix: ['嘿', '哈', '啦', '呗'],
|
|
125
|
+
suffix: ['谢啦', 'OK', '搞定']
|
|
126
|
+
},
|
|
127
|
+
passive: {
|
|
128
|
+
prefix: ['如果方便', '有空的话', '什么时候', '可能的话'],
|
|
129
|
+
suffix: ['你觉得呢', '吧', '看看', '考虑一下']
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* 邮件常用短语
|
|
134
|
+
*/
|
|
135
|
+
const EMAIL_PHRASES = {
|
|
136
|
+
opening: {
|
|
137
|
+
polite: ['{name}您好', '尊敬的{name}', 'Hi {name}'],
|
|
138
|
+
urgent: ['{name}你好', '{name}好'],
|
|
139
|
+
casual: ['{name}', '嘿{name}', '{name}哈'],
|
|
140
|
+
passive: ['{name}您好', 'Hi {name}']
|
|
141
|
+
},
|
|
142
|
+
closing: {
|
|
143
|
+
polite: ['此致 敬礼', '祝工作愉快', '顺颂时祺', '谢谢'],
|
|
144
|
+
urgent: ['请尽快回复', '辛苦支持', '请配合'],
|
|
145
|
+
casual: ['谢了', 'OK', '加油'],
|
|
146
|
+
passive: ['麻烦了', '打扰了', '辛苦了']
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* 转换邮件内容
|
|
151
|
+
*/
|
|
152
|
+
function transformEmailTone(content, options) {
|
|
153
|
+
const from = options.from || 'boss';
|
|
154
|
+
const to = options.to || 'employee';
|
|
155
|
+
const tone = options.tone || 'polite';
|
|
156
|
+
// 确定转换方向
|
|
157
|
+
const direction = `${from}-${to}`;
|
|
158
|
+
const templates = EMAIL_TEMPLATES[direction];
|
|
159
|
+
if (!templates) {
|
|
160
|
+
return {
|
|
161
|
+
transformed: content,
|
|
162
|
+
explanation: `暂不支持 ${from} -> ${to} 的邮件转换`
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// 获取对应语气的模板
|
|
166
|
+
const toneTemplates = templates[tone] || templates.polite;
|
|
167
|
+
// 随机选择一个模板
|
|
168
|
+
const template = toneTemplates[Math.floor(Math.random() * toneTemplates.length)];
|
|
169
|
+
// 替换占位符
|
|
170
|
+
const action = '处理';
|
|
171
|
+
const action2 = '跟进';
|
|
172
|
+
const review = 'review';
|
|
173
|
+
const check = '确认';
|
|
174
|
+
const support = '支持';
|
|
175
|
+
const discuss = '讨论';
|
|
176
|
+
const adjust = '调整';
|
|
177
|
+
const delay = '延期';
|
|
178
|
+
const urgency = '紧急';
|
|
179
|
+
const consequence = '后果自负';
|
|
180
|
+
const team = '团队';
|
|
181
|
+
const greeting = '祝好';
|
|
182
|
+
let transformed = template
|
|
183
|
+
.replace(/{action}/g, () => action || '处理')
|
|
184
|
+
.replace(/{action2}/g, () => action2 || '跟进')
|
|
185
|
+
.replace(/{review}/g, () => review || 'review')
|
|
186
|
+
.replace(/{check}/g, () => check || '确认')
|
|
187
|
+
.replace(/{support}/g, () => support || '支持')
|
|
188
|
+
.replace(/{discuss}/g, () => discuss || '讨论')
|
|
189
|
+
.replace(/{adjust}/g, () => adjust || '调整')
|
|
190
|
+
.replace(/{delay}/g, () => delay || '延期')
|
|
191
|
+
.replace(/{urgency}/g, () => urgency || '紧急')
|
|
192
|
+
.replace(/{consequence}/g, () => consequence || '后果自负')
|
|
193
|
+
.replace(/{team}/g, () => team || '团队')
|
|
194
|
+
.replace(/{greeting}/g, () => greeting || '祝好')
|
|
195
|
+
.replace(/{content}/g, () => content);
|
|
196
|
+
// 添加语气修饰词
|
|
197
|
+
const modifier = TONE_MODIFIERS[tone] || TONE_MODIFIERS.polite;
|
|
198
|
+
if (modifier.prefix && modifier.prefix.length > 0) {
|
|
199
|
+
const prefix = modifier.prefix[Math.floor(Math.random() * modifier.prefix.length)];
|
|
200
|
+
transformed = `${prefix},${transformed}`;
|
|
201
|
+
}
|
|
202
|
+
if (modifier.suffix && modifier.suffix.length > 0) {
|
|
203
|
+
const suffix = modifier.suffix[Math.floor(Math.random() * modifier.suffix.length)];
|
|
204
|
+
transformed = `${transformed}${suffix}`;
|
|
205
|
+
}
|
|
206
|
+
// 生成说明
|
|
207
|
+
const roleNames = {
|
|
208
|
+
boss: '老板',
|
|
209
|
+
employee: '员工',
|
|
210
|
+
pm: '产品经理',
|
|
211
|
+
hr: 'HR',
|
|
212
|
+
techlead: '技术主管',
|
|
213
|
+
intern: '实习生'
|
|
214
|
+
};
|
|
215
|
+
const toneNames = {
|
|
216
|
+
polite: '礼貌',
|
|
217
|
+
urgent: '紧急',
|
|
218
|
+
casual: '随意',
|
|
219
|
+
passive: '委婉'
|
|
220
|
+
};
|
|
221
|
+
const explanation = `
|
|
222
|
+
转换说明:
|
|
223
|
+
方向: ${roleNames[from]} -> ${roleNames[to]}
|
|
224
|
+
语气: ${toneNames[tone]}
|
|
225
|
+
原文: ${content}
|
|
226
|
+
转换: ${transformed}
|
|
227
|
+
`.trim();
|
|
228
|
+
return { transformed, explanation };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 邮件语气转换器命令
|
|
232
|
+
*/
|
|
233
|
+
function createEmailCommand() {
|
|
234
|
+
const command = new commander_1.Command('email')
|
|
235
|
+
.description('邮件语气转换器 - 转换邮件语气和风格')
|
|
236
|
+
.option('-f, --from <role>', '发送者角色: boss, employee, pm, hr, techlead, intern', 'pm')
|
|
237
|
+
.option('-t, --to <role>', '接收者角色: boss, employee, pm, hr, techlead, intern, dev, team', 'employee')
|
|
238
|
+
.option('-T, --tone <tone>', '语气: polite(礼貌), urgent(紧急), casual(随意), passive(委婉)', 'polite')
|
|
239
|
+
.argument('[content...]', '要转换的邮件内容');
|
|
240
|
+
// 角色别名映射
|
|
241
|
+
const roleAliases = {
|
|
242
|
+
'dev': 'employee',
|
|
243
|
+
'developer': 'employee',
|
|
244
|
+
'team': 'employee',
|
|
245
|
+
'boss': 'boss',
|
|
246
|
+
'manager': 'pm',
|
|
247
|
+
'hr': 'hr',
|
|
248
|
+
'lead': 'techlead',
|
|
249
|
+
'intern': 'intern'
|
|
250
|
+
};
|
|
251
|
+
command.action(async (contentArgs, options) => {
|
|
252
|
+
const fromRole = options.from || 'pm';
|
|
253
|
+
const toRole = options.to || 'employee';
|
|
254
|
+
const from = roleAliases[fromRole] || fromRole;
|
|
255
|
+
const to = roleAliases[toRole] || toRole;
|
|
256
|
+
const tone = options.tone || 'polite';
|
|
257
|
+
if (contentArgs.length === 0) {
|
|
258
|
+
console.log();
|
|
259
|
+
console.log(chalk_1.default.cyan('╔══════════════════════════════════════════════════════════════╗'));
|
|
260
|
+
console.log(chalk_1.default.cyan('║') + chalk_1.default.bold.white(' 邮件语气转换器 ') + chalk_1.default.cyan('║'));
|
|
261
|
+
console.log(chalk_1.default.cyan('╚═════════════════════════════════════════════════════════════╝'));
|
|
262
|
+
console.log();
|
|
263
|
+
console.log('用法: pua email --from <角色> --to <角色> [内容]');
|
|
264
|
+
console.log();
|
|
265
|
+
console.log('角色说明:');
|
|
266
|
+
console.log(' ' + chalk_1.default.red('boss') + ' - 老板');
|
|
267
|
+
console.log(' ' + chalk_1.default.yellow('employee') + ' - 员工');
|
|
268
|
+
console.log(' ' + chalk_1.default.cyan('pm') + ' - 产品经理');
|
|
269
|
+
console.log(' ' + chalk_1.default.magenta('hr') + ' - HR');
|
|
270
|
+
console.log(' ' + chalk_1.default.blue('techlead') + ' - 技术主管');
|
|
271
|
+
console.log(' ' + chalk_1.default.green('intern') + ' - 实习生');
|
|
272
|
+
console.log(' ' + chalk_1.default.gray('dev') + ' - 开发者(通用)');
|
|
273
|
+
console.log();
|
|
274
|
+
console.log('语气说明:');
|
|
275
|
+
console.log(' polite - 礼貌正式');
|
|
276
|
+
console.log(' urgent - 紧急催促');
|
|
277
|
+
console.log(' casual - 随意轻松');
|
|
278
|
+
console.log(' passive - 委婉含蓄');
|
|
279
|
+
console.log();
|
|
280
|
+
console.log('示例:');
|
|
281
|
+
console.log(chalk_1.default.gray(' pua email --from pm --to dev "请查收附件"'));
|
|
282
|
+
console.log(chalk_1.default.gray(' pua email --from hr --to employee --tone urgent "今天加班"'));
|
|
283
|
+
console.log();
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const content = contentArgs.join(' ');
|
|
287
|
+
const result = transformEmailTone(content, { from, to, tone });
|
|
288
|
+
console.log();
|
|
289
|
+
console.log(chalk_1.default.cyan('╔══════════════════════════════════════════════════════════╗'));
|
|
290
|
+
console.log(chalk_1.default.cyan('║') + ' ' + chalk_1.default.bold.green('原文:') + ' '.padEnd(53) + chalk_1.default.cyan('║'));
|
|
291
|
+
console.log(chalk_1.default.cyan('║') + ' ' + content.substring(0, 60) + ' '.padEnd(53) + chalk_1.default.cyan('║'));
|
|
292
|
+
console.log(chalk_1.default.cyan('╠══════════════════════════════════════════════════════════╣'));
|
|
293
|
+
console.log(chalk_1.default.cyan('║') + ' ' + chalk_1.default.bold.yellow('转换:') + ' '.padEnd(53) + chalk_1.default.cyan('║'));
|
|
294
|
+
console.log(chalk_1.default.cyan('║') + ' ' + result.transformed.substring(0, 60) + ' '.padEnd(53) + chalk_1.default.cyan('║'));
|
|
295
|
+
console.log(chalk_1.default.cyan('╚═══════════════════════════════════════════════════════════════╝'));
|
|
296
|
+
console.log();
|
|
297
|
+
console.log(chalk_1.default.gray(result.explanation));
|
|
298
|
+
console.log();
|
|
299
|
+
});
|
|
300
|
+
return command;
|
|
301
|
+
}
|