cloudcc-cli 2.2.1 → 2.2.3

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 (43) hide show
  1. package/README.md +21 -0
  2. package/bin/cc.js +1 -0
  3. package/bin/mcp.js +18 -0
  4. package/package.json +14 -6
  5. package/src/classes/create.js +1 -0
  6. package/src/classes/get.js +1 -0
  7. package/src/classes/publish.js +4 -0
  8. package/src/classes/pull.js +5 -1
  9. package/src/mcp/index.js +227 -0
  10. package/src/mcp/readme.md +132 -0
  11. package/src/mcp/tools/ccdk/fetcher.js +18 -0
  12. package/src/mcp/tools/ccdk/handler.js +98 -0
  13. package/src/mcp/tools/ccdk/prompt.js +453 -0
  14. package/src/mcp/tools/classes/handler.js +358 -0
  15. package/src/mcp/tools/classes/prompt.js +1261 -0
  16. package/src/mcp/tools/dev-env/fetcher.js +500 -0
  17. package/src/mcp/tools/dev-env/handler.js +92 -0
  18. package/src/mcp/tools/dev-env/prompt.js +256 -0
  19. package/src/mcp/tools/key-guide/fetcher.js +278 -0
  20. package/src/mcp/tools/key-guide/handler.js +43 -0
  21. package/src/mcp/tools/key-guide/prompt.js +71 -0
  22. package/src/mcp/tools/plugin/handler.js +92 -0
  23. package/src/mcp/tools/plugin/prompt.js +659 -0
  24. package/src/plugin/create.js +1 -2
  25. package/src/plugin/create1.js +1 -2
  26. package/src/plugin/publish.js +3 -0
  27. package/src/plugin/publish1.js +6 -2
  28. package/src/script/publish.js +3 -0
  29. package/src/script/pull.js +3 -0
  30. package/src/timer/publish.js +3 -0
  31. package/src/timer/pull.js +3 -0
  32. package/src/triggers/publish.js +3 -0
  33. package/src/triggers/pull.js +3 -0
  34. package/template/Appvue +452 -12
  35. package/template/cloudcc-cli.configjs +7 -1
  36. package/template/index.js +0 -4
  37. package/template/vueconfigjs +10 -10
  38. package/utils/checkVersion.js +2 -0
  39. package/utils/utils.js +32 -9
  40. package/template/demojava +0 -15
  41. package/template/indexvue +0 -29
  42. package/template/javaconfigjson +0 -3
  43. package/template/package-lockjson +0 -13952
@@ -0,0 +1,500 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * CloudCC 开发环境搭建爬取脚本
5
+ * 功能:从官方文档网页爬取开发环境搭建指南,生成结构化 JavaScript 知识库
6
+ *
7
+ * 特性:
8
+ * - 自动网页爬取和 HTML 解析
9
+ * - 平台特定化处理(Windows/macOS/Linux)
10
+ * - 错误重试和容错机制
11
+ * - 元数据管理(版本、更新时间、来源)
12
+ */
13
+
14
+ const https = require('https');
15
+ const http = require('http');
16
+ const cheerio = require('cheerio');
17
+ const fs = require('fs').promises;
18
+ const path = require('path');
19
+
20
+ // ======================== 配置 ========================
21
+ const CONFIG = {
22
+ SOURCE_URL: 'https://dev-help.cloudcc.cn/devlearn01/huan-jing-da-jian/',
23
+ OUTPUT_FILE: path.join(__dirname, './prompt.js'),
24
+ TIMEOUT: 10000,
25
+ MAX_RETRIES: 3,
26
+ CACHE_DURATION: 7 * 24 * 60 * 60 * 1000, // 7 天
27
+ };
28
+
29
+ // HTML 转义工具
30
+ function escapeHtml(text) {
31
+ return String(text)
32
+ .replace(/&/g, '&')
33
+ .replace(/</g, '&lt;')
34
+ .replace(/>/g, '&gt;')
35
+ .replace(/"/g, '&quot;')
36
+ .replace(/'/g, '&#039;');
37
+ }
38
+
39
+ // ======================== 日志工具 ========================
40
+ const logger = {
41
+ log: (msg) => console.log(`ℹ️ ${msg}`),
42
+ success: (msg) => console.log(`✅ ${msg}`),
43
+ error: (msg) => console.error(`❌ ${msg}`),
44
+ warn: (msg) => console.warn(`⚠️ ${msg}`),
45
+ info: (msg) => console.log(`📝 ${msg}`),
46
+ };
47
+
48
+ // ======================== HTTP 请求 ========================
49
+ async function fetchPage(url, retries = 0) {
50
+ return new Promise((resolve, reject) => {
51
+ try {
52
+ logger.log(`正在获取 ${url}...`);
53
+
54
+ const urlObj = new URL(url);
55
+ const protocol = urlObj.protocol === 'https:' ? https : http;
56
+
57
+ const options = {
58
+ hostname: urlObj.hostname,
59
+ port: urlObj.port,
60
+ path: urlObj.pathname + urlObj.search,
61
+ method: 'GET',
62
+ headers: {
63
+ 'User-Agent': 'Mozilla/5.0 (Node.js MCP Bot) CloudCC-Dev-Helper/1.0',
64
+ },
65
+ timeout: CONFIG.TIMEOUT,
66
+ };
67
+
68
+ const req = protocol.request(options, (res) => {
69
+ // 处理重定向
70
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
71
+ const redirectUrl = new URL(res.headers.location, url).href;
72
+ logger.info(`重定向到: ${redirectUrl}`);
73
+ return fetchPage(redirectUrl, retries).then(resolve).catch(reject);
74
+ }
75
+
76
+ if (res.statusCode !== 200) {
77
+ return reject(new Error(`HTTP ${res.statusCode}: ${res.statusMessage}`));
78
+ }
79
+
80
+ let html = '';
81
+ res.setEncoding('utf8');
82
+ res.on('data', (chunk) => {
83
+ html += chunk;
84
+ });
85
+ res.on('end', () => {
86
+ logger.success(`网页获取成功 (${html.length} 字节)`);
87
+ resolve(html);
88
+ });
89
+ });
90
+
91
+ req.on('error', (error) => {
92
+ reject(error);
93
+ });
94
+
95
+ req.on('timeout', () => {
96
+ req.destroy();
97
+ reject(new Error('请求超时'));
98
+ });
99
+
100
+ req.end();
101
+ } catch (error) {
102
+ reject(error);
103
+ }
104
+ }).catch(async (error) => {
105
+ if (retries < CONFIG.MAX_RETRIES) {
106
+ logger.warn(`请求失败: ${error.message},${retries + 1}/${CONFIG.MAX_RETRIES} 重试...`);
107
+ await new Promise(r => setTimeout(r, 1000 * (retries + 1)));
108
+ return fetchPage(url, retries + 1);
109
+ }
110
+ throw new Error(`获取网页失败(已重试 ${CONFIG.MAX_RETRIES} 次): ${error.message}`);
111
+ });
112
+ }
113
+
114
+ // ======================== HTML 解析 ========================
115
+ function parseDevEnvContent(html) {
116
+ const $ = cheerio.load(html);
117
+ const steps = [];
118
+
119
+ logger.log('开始解析 HTML...');
120
+
121
+ // 提取所有 h2 标题(步骤)
122
+ const h2Elements = $('h2').toArray();
123
+
124
+ h2Elements.forEach((elem, idx) => {
125
+ const title = $(elem).text().trim();
126
+ const match = title.match(/^(\d+)\.\s*(.+)$/);
127
+
128
+ if (!match) return;
129
+
130
+ const stepNum = parseInt(match[1]);
131
+ const stepTitle = match[2];
132
+
133
+ // 收集该步骤的内容(直到下一个 h2)
134
+ let content = '';
135
+ let description = '';
136
+ const subSteps = {};
137
+ const commands = [];
138
+ const references = [];
139
+ let currentSubStep = null;
140
+
141
+ let currentElem = $(elem).next();
142
+ const nextH2Idx = h2Elements.findIndex((e, i) => i > idx);
143
+ const nextH2 = nextH2Idx >= 0 ? h2Elements[nextH2Idx] : null;
144
+
145
+ while (currentElem.length && (!nextH2 || !currentElem.is(nextH2))) {
146
+ const tag = currentElem[0]?.name;
147
+
148
+ // 处理 h3(子步骤,如 "Windows 用户")
149
+ if (tag === 'h3') {
150
+ const h3Text = currentElem.text().trim();
151
+ currentSubStep = h3Text;
152
+ subSteps[h3Text] = {
153
+ title: h3Text,
154
+ description: '',
155
+ commands: [],
156
+ notes: [],
157
+ };
158
+ }
159
+
160
+ // 处理段落(描述文本)
161
+ if (tag === 'p') {
162
+ const text = currentElem.text().trim();
163
+ if (description.length < 200) {
164
+ description += (description ? ' ' : '') + text;
165
+ }
166
+ content += `<p>${$(currentElem).html()}</p>\n`;
167
+
168
+ // 提取链接
169
+ const links = currentElem.find('a');
170
+ links.each((_, link) => {
171
+ const href = $(link).attr('href');
172
+ const linkText = $(link).text();
173
+ if (href) {
174
+ references.push({
175
+ text: linkText,
176
+ url: href,
177
+ category: detectLinkCategory(linkText, href),
178
+ });
179
+ }
180
+ });
181
+ }
182
+
183
+ // 处理代码块
184
+ if (tag === 'pre' || tag === 'code') {
185
+ const codeText = currentElem.text().trim();
186
+ if (codeText) {
187
+ const platform = detectPlatform(codeText, currentSubStep);
188
+ commands.push({
189
+ command: codeText,
190
+ platform,
191
+ description: extractCommandDescription(codeText),
192
+ });
193
+ content += `<pre><code>${escapeHtml(codeText)}</code></pre>\n`;
194
+ }
195
+ }
196
+
197
+ // 收集其他内容
198
+ if (tag === 'ul' || tag === 'ol') {
199
+ content += `<${tag}>${$(currentElem).html()}</${tag}>\n`;
200
+ }
201
+
202
+ if (tag === 'strong' || tag === 'em') {
203
+ content += currentElem.html();
204
+ }
205
+
206
+ currentElem = currentElem.next();
207
+ }
208
+
209
+ // 清理描述文本
210
+ description = description
211
+ .replace(/[💡⚠️✅❌📝ℹ️📥📊🎯]/g, '')
212
+ .trim()
213
+ .substring(0, 200);
214
+
215
+ // 构建步骤对象
216
+ const step = {
217
+ number: stepNum,
218
+ title: stepTitle,
219
+ description: description || stepTitle,
220
+ content: content.trim(),
221
+ keywords: extractKeywords(title, content),
222
+ commands,
223
+ references,
224
+ difficulty: estimateDifficulty(stepTitle, commands),
225
+ estimatedTime: estimateTime(stepTitle),
226
+ };
227
+
228
+ // 添加子步骤
229
+ if (Object.keys(subSteps).length > 0) {
230
+ step.subSteps = Object.values(subSteps);
231
+ }
232
+
233
+ steps.push(step);
234
+ logger.info(`✓ 步骤 ${stepNum}: ${stepTitle}`);
235
+ });
236
+
237
+ return steps;
238
+ }
239
+
240
+ // ======================== 辅助函数 ========================
241
+
242
+ /**
243
+ * 检测命令所属的平台
244
+ */
245
+ function detectPlatform(command, context) {
246
+ const cmd = command.toLowerCase();
247
+ const ctx = (context || '').toLowerCase();
248
+
249
+ if (ctx.includes('windows')) return 'windows';
250
+ if (ctx.includes('macos') || ctx.includes('mac')) return 'macos';
251
+ if (ctx.includes('linux')) return 'linux';
252
+
253
+ if (cmd.includes('sudo')) return 'macos';
254
+ if (cmd.includes('choco') || cmd.includes('scoop')) return 'windows';
255
+ if (cmd.includes('brew')) return 'macos';
256
+ if (cmd.includes('apt') || cmd.includes('yum')) return 'linux';
257
+
258
+ return 'all';
259
+ }
260
+
261
+ /**
262
+ * 检测链接类别
263
+ */
264
+ function detectLinkCategory(text, url) {
265
+ const lower = text.toLowerCase() + ' ' + url.toLowerCase();
266
+
267
+ if (lower.includes('download') || lower.includes('下载')) return 'download';
268
+ if (lower.includes('marketplace') || lower.includes('插件')) return 'plugin';
269
+ if (lower.includes('doc') || lower.includes('文档')) return 'docs';
270
+ if (lower.includes('tool') || lower.includes('工具')) return 'tool';
271
+
272
+ return 'reference';
273
+ }
274
+
275
+ /**
276
+ * 提取命令描述
277
+ */
278
+ function extractCommandDescription(command) {
279
+ if (command.includes('node -v') || command.includes('node --version')) {
280
+ return '检查 Node.js 版本';
281
+ }
282
+ if (command.includes('npm config set registry')) {
283
+ return '设置 npm 源地址';
284
+ }
285
+ if (command.includes('npm config get registry')) {
286
+ return '验证 npm 源设置';
287
+ }
288
+ if (command.includes('npm install -g')) {
289
+ return '安装全局依赖包';
290
+ }
291
+ if (command.includes('npm ls -g')) {
292
+ return '检查全局安装的包';
293
+ }
294
+ if (command.includes('sudo')) {
295
+ return '以管理员权限执行';
296
+ }
297
+ return '执行命令';
298
+ }
299
+
300
+ /**
301
+ * 提取关键词
302
+ */
303
+ function extractKeywords(title, content) {
304
+ const words = new Set();
305
+ const titleLower = title.toLowerCase();
306
+
307
+ // 从标题提取
308
+ if (titleLower.includes('node')) words.add('node');
309
+ if (titleLower.includes('npm')) words.add('npm');
310
+ if (titleLower.includes('依赖') || titleLower.includes('package')) words.add('dependencies');
311
+ if (titleLower.includes('vs code') || titleLower.includes('code')) words.add('vscode');
312
+ if (titleLower.includes('插件') || titleLower.includes('plugin')) words.add('plugin');
313
+ if (titleLower.includes('源') || titleLower.includes('registry')) words.add('registry');
314
+ if (titleLower.includes('vue')) words.add('vue');
315
+ if (titleLower.includes('cli')) words.add('cli');
316
+
317
+ return Array.from(words);
318
+ }
319
+
320
+ /**
321
+ * 估算难度级别
322
+ */
323
+ function estimateDifficulty(title, commands) {
324
+ if (commands.length === 0) return 'easy';
325
+ if (commands.length > 3) return 'medium';
326
+ if (title.includes('源') || title.includes('registry')) return 'easy';
327
+ return 'medium';
328
+ }
329
+
330
+ /**
331
+ * 估算耗时(分钟)
332
+ */
333
+ function estimateTime(title) {
334
+ if (title.includes('node')) return 10;
335
+ if (title.includes('npm')) return 5;
336
+ if (title.includes('依赖')) return 15;
337
+ if (title.includes('code')) return 5;
338
+ if (title.includes('插件')) return 3;
339
+ return 5;
340
+ }
341
+
342
+ // ======================== JavaScript 代码生成 ========================
343
+
344
+ function generateJavaScriptCode(steps) {
345
+ const now = new Date().toISOString();
346
+ const metadata = {
347
+ title: 'CloudCC 开发环境搭建指南',
348
+ description: '详细的开发环境配置教程,涵盖 Node.js、npm、VS Code 等必要工具的安装与配置',
349
+ sourceUrl: CONFIG.SOURCE_URL,
350
+ generatedAt: now,
351
+ version: '1.0.0',
352
+ };
353
+
354
+ const stepsJson = JSON.stringify(steps, null, 2);
355
+ const metadataJson = JSON.stringify(metadata, null, 2);
356
+
357
+ const code = `/**
358
+ * CloudCC 开发环境搭建知识库
359
+ *
360
+ * 自动生成的文件,请勿手动修改
361
+ * 生成时间: ${now}
362
+ * 来源: ${CONFIG.SOURCE_URL}
363
+ */
364
+
365
+ const metadata = ${metadataJson};
366
+
367
+ const steps = ${stepsJson};
368
+
369
+ const guide = {
370
+ ...metadata,
371
+ steps,
372
+ };
373
+
374
+ /**
375
+ * 按关键词搜索步骤
376
+ */
377
+ function searchSteps(keyword) {
378
+ const lower = keyword.toLowerCase();
379
+ return guide.steps.filter(step =>
380
+ step.title.toLowerCase().includes(lower) ||
381
+ step.description.toLowerCase().includes(lower) ||
382
+ step.keywords.some(k => k.toLowerCase().includes(lower))
383
+ );
384
+ }
385
+
386
+ /**
387
+ * 按平台获取命令
388
+ */
389
+ function getCommandsByPlatform(platform) {
390
+ const commands = [];
391
+ guide.steps.forEach(step => {
392
+ step.commands.forEach(cmd => {
393
+ if (cmd.platform === 'all' || cmd.platform === platform) {
394
+ commands.push(cmd);
395
+ }
396
+ });
397
+ });
398
+ return commands;
399
+ }
400
+
401
+ /**
402
+ * 按步骤号获取步骤详情
403
+ */
404
+ function getStep(stepNumber) {
405
+ return guide.steps.find(s => s.number === stepNumber);
406
+ }
407
+
408
+ /**
409
+ * 获取所有步骤
410
+ */
411
+ function getAllSteps() {
412
+ return guide.steps;
413
+ }
414
+
415
+ /**
416
+ * 获取指定难度的步骤
417
+ */
418
+ function getStepsByDifficulty(difficulty) {
419
+ return guide.steps.filter(s => s.difficulty === difficulty);
420
+ }
421
+
422
+ /**
423
+ * 获取所有参考链接
424
+ */
425
+ function getAllReferences() {
426
+ const refs = [];
427
+ guide.steps.forEach(step => {
428
+ refs.push(...step.references);
429
+ });
430
+ return refs;
431
+ }
432
+
433
+ /**
434
+ * 按分类获取参考链接
435
+ */
436
+ function getReferencesByCategory(category) {
437
+ return getAllReferences().filter(r => r.category === category);
438
+ }
439
+
440
+ // 导出所有函数和对象
441
+ module.exports = guide;
442
+ module.exports.searchSteps = searchSteps;
443
+ module.exports.getCommandsByPlatform = getCommandsByPlatform;
444
+ module.exports.getStep = getStep;
445
+ module.exports.getAllSteps = getAllSteps;
446
+ module.exports.getStepsByDifficulty = getStepsByDifficulty;
447
+ module.exports.getAllReferences = getAllReferences;
448
+ module.exports.getReferencesByCategory = getReferencesByCategory;
449
+ `;
450
+
451
+ return code;
452
+ }
453
+
454
+ // ======================== 主函数 ========================
455
+
456
+ async function main() {
457
+ try {
458
+ logger.log('🚀 CloudCC 开发环境搭建爬取脚本启动');
459
+ logger.info(`源 URL: ${CONFIG.SOURCE_URL}`);
460
+ logger.info(`输出文件: ${CONFIG.OUTPUT_FILE}`);
461
+
462
+ // 1. 获取网页
463
+ const html = await fetchPage(CONFIG.SOURCE_URL);
464
+
465
+ // 2. 解析网页
466
+ const steps = parseDevEnvContent(html);
467
+
468
+ if (steps.length === 0) {
469
+ throw new Error('未能解析到任何步骤,请检查网页结构');
470
+ }
471
+
472
+ logger.success(`成功解析 ${steps.length} 个步骤`);
473
+
474
+ // 3. 生成 JavaScript 代码
475
+ const jsCode = generateJavaScriptCode(steps);
476
+
477
+ // 4. 写入文件
478
+ await fs.writeFile(CONFIG.OUTPUT_FILE, jsCode, 'utf-8');
479
+ logger.success(`成功生成 ${CONFIG.OUTPUT_FILE}`);
480
+
481
+ // 5. 统计信息
482
+ const totalCommands = steps.reduce((sum, s) => sum + s.commands.length, 0);
483
+ const totalReferences = steps.reduce((sum, s) => sum + s.references.length, 0);
484
+
485
+ logger.log('📊 爬取统计:');
486
+ console.log(` - 步骤数: ${steps.length}`);
487
+ console.log(` - 命令数: ${totalCommands}`);
488
+ console.log(` - 参考链接: ${totalReferences}`);
489
+ console.log(` - 文件大小: ${(jsCode.length / 1024).toFixed(2)} KB`);
490
+
491
+ logger.success('✨ 爬取完成!');
492
+
493
+ } catch (error) {
494
+ logger.error(error.message);
495
+ process.exit(1);
496
+ }
497
+ }
498
+
499
+ // 执行
500
+ main();
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Dev-Env 工具处理器
3
+ * 提供开发环境搭建指南的查询功能
4
+ */
5
+
6
+ const devEnvDoc = require('./prompt.js');
7
+ const {
8
+ searchSteps,
9
+ getCommandsByPlatform,
10
+ getStep,
11
+ getAllSteps,
12
+ getStepsByDifficulty,
13
+ } = require('./prompt.js');
14
+
15
+ /**
16
+ * 获取开发环境搭建指南
17
+ */
18
+ async function getDevEnvSetup(params = {}) {
19
+ const { step, search, difficulty, platform, command } = params;
20
+
21
+ try {
22
+ if (search) {
23
+ const results = searchSteps(search);
24
+ if (results.length === 0) {
25
+ return { content: [{ type: 'text', text: `未找到包含 "${search}" 的步骤。` }] };
26
+ }
27
+ let content = `# 搜索结果: "${search}"\n\n找到 ${results.length} 个相关步骤\n\n`;
28
+ results.forEach(s => {
29
+ content += `## ${s.number}. ${s.title}\n**难度**: ${s.difficulty}\n\n`;
30
+ });
31
+ return { content: [{ type: 'text', text: content }] };
32
+ }
33
+
34
+ if (difficulty) {
35
+ const results = getStepsByDifficulty(difficulty);
36
+ let content = `# ${difficulty} 难度步骤 (共 ${results.length} 个)\n\n`;
37
+ results.forEach(s => {
38
+ content += `${s.number}. ${s.title}\n`;
39
+ });
40
+ return { content: [{ type: 'text', text: content }] };
41
+ }
42
+
43
+ if (platform) {
44
+ const commands = getCommandsByPlatform(platform);
45
+ let content = `# ${platform} 平台命令 (共 ${commands.length} 个)\n\n`;
46
+ commands.forEach((cmd, idx) => {
47
+ content += `${idx + 1}. ${cmd.description}\n\`\`\`bash\n${cmd.command}\n\`\`\`\n\n`;
48
+ });
49
+ return { content: [{ type: 'text', text: content }] };
50
+ }
51
+
52
+ if (step) {
53
+ const targetStep = getStep(step);
54
+ if (!targetStep) {
55
+ return { content: [{ type: 'text', text: `无效的步骤编号 ${step}` }] };
56
+ }
57
+ let content = `# 步骤 ${targetStep.number}: ${targetStep.title}\n\n**难度**: ${targetStep.difficulty}\n**耗时**: ${targetStep.estimatedTime} 分钟\n\n${targetStep.description}`;
58
+ if (targetStep.commands && targetStep.commands.length > 0) {
59
+ content += `\n\n## 命令 (共 ${targetStep.commands.length} 个)\n\n`;
60
+ targetStep.commands.forEach((cmd, idx) => {
61
+ content += `${idx + 1}. ${cmd.description}\n\`\`\`bash\n${cmd.command}\n\`\`\`\n\n`;
62
+ });
63
+ }
64
+ return { content: [{ type: 'text', text: content }] };
65
+ }
66
+
67
+ if (command) {
68
+ const steps = getAllSteps();
69
+ let content = `# 所有命令 (共 ${steps.reduce((sum, s) => sum + s.commands.length, 0)} 个)\n\n`;
70
+ steps.forEach(s => {
71
+ if (s.commands.length > 0) {
72
+ content += `## ${s.title}\n`;
73
+ s.commands.forEach(cmd => {
74
+ content += `\`\`\`bash\n${cmd.command}\n\`\`\`\n`;
75
+ });
76
+ }
77
+ });
78
+ return { content: [{ type: 'text', text: content }] };
79
+ }
80
+
81
+ // Default overview
82
+ const allSteps = getAllSteps();
83
+ let content = `# ${devEnvDoc.title}\n\n${devEnvDoc.description}\n\n**版本**: ${devEnvDoc.version}\n**步骤**: ${allSteps.length}`;
84
+ return { content: [{ type: 'text', text: content }] };
85
+ } catch (error) {
86
+ return { content: [{ type: 'text', text: `错误: ${error.message}` }] };
87
+ }
88
+ }
89
+
90
+ module.exports = {
91
+ getDevEnvSetup
92
+ };