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,358 @@
1
+ /**
2
+ * Classes 工具处理器
3
+ * 提供自定义类的创建、发布、拉取、查询等功能
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const createClassModule = require('../../../classes/create');
9
+ const publishClassModule = require('../../../classes/publish');
10
+ const pullClassModule = require('../../../classes/pull');
11
+ const getClassModule = require('../../../classes/get');
12
+ const pullListModule = require('../../../classes/pullList');
13
+
14
+ /**
15
+ * 创建自定义类
16
+ */
17
+ async function createClass({ className, projectPath = process.cwd() }) {
18
+ try {
19
+ // 临时改变工作目录以兼容原有模块
20
+ const originalCwd = process.cwd();
21
+ process.chdir(projectPath);
22
+
23
+ try {
24
+ await createClassModule(className);
25
+ const classPath = path.join(projectPath, `classes/${className}`);
26
+ return {
27
+ content: [{
28
+ type: 'text',
29
+ text: `✓ 创建成功!\n\n类路径: ${classPath}\n生成的文件:\n - ${className}.java (主类文件)\n - ${className}Test.java (测试类文件)\n - config.json (配置文件)`
30
+ }]
31
+ };
32
+ } finally {
33
+ process.chdir(originalCwd);
34
+ }
35
+ } catch (error) {
36
+ return { content: [{ type: 'text', text: `✗ 创建失败: ${error.message}` }] };
37
+ }
38
+ }
39
+
40
+ /**
41
+ * 发布类到服务器
42
+ */
43
+ async function publishClass({ className, projectPath = process.cwd() }) {
44
+ try {
45
+ const originalCwd = process.cwd();
46
+ process.chdir(projectPath);
47
+
48
+ try {
49
+ await publishClassModule(className);
50
+ return { content: [{ type: 'text', text: `✓ 发布成功!类 ${className} 已发布到服务器` }] };
51
+ } finally {
52
+ process.chdir(originalCwd);
53
+ }
54
+ } catch (error) {
55
+ return { content: [{ type: 'text', text: `✗ 发布失败: ${error.message}` }] };
56
+ }
57
+ }
58
+
59
+ /**
60
+ * 从服务器拉取类
61
+ */
62
+ async function pullClass({ className, projectPath = process.cwd() }) {
63
+ try {
64
+ const classPath = path.join(projectPath, `classes/${className}`);
65
+ const configPath = path.join(classPath, 'config.json');
66
+
67
+ // 检查本地是否存在该类
68
+ if (!fs.existsSync(configPath)) {
69
+ // 本地不存在,查询服务器
70
+ try {
71
+ const queryString = encodeURI(JSON.stringify({
72
+ name: className
73
+ }));
74
+ const classList = await getClassModule(queryString, projectPath);
75
+
76
+ if (!classList || classList.length === 0) {
77
+ return {
78
+ content: [{
79
+ type: 'text',
80
+ text: `✗ 拉取失败: 服务器上不存在类 ${className}`
81
+ }]
82
+ };
83
+ }
84
+
85
+ // 找到匹配的类
86
+ const targetClass = classList.find(item => item.name === className || item.apiname === className);
87
+ if (!targetClass) {
88
+ return {
89
+ content: [{
90
+ type: 'text',
91
+ text: `✗ 拉取失败: 服务器上未找到类 ${className}`
92
+ }]
93
+ };
94
+ }
95
+
96
+ // 使用 ID 从服务器拉取并在本地创建
97
+ const originalCwd = process.cwd();
98
+ process.chdir(projectPath);
99
+
100
+ try {
101
+ await pullListModule(targetClass.id, projectPath);
102
+ return {
103
+ content: [{
104
+ type: 'text',
105
+ text: `✓ 拉取成功!已从服务器拉取类 ${className} 并在本地创建\n\n本地路径: classes/${className}/`
106
+ }]
107
+ };
108
+ } finally {
109
+ process.chdir(originalCwd);
110
+ }
111
+ } catch (error) {
112
+ return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
113
+ }
114
+ }
115
+
116
+ // 本地存在,直接更新
117
+ const originalCwd = process.cwd();
118
+ process.chdir(projectPath);
119
+
120
+ try {
121
+ await pullClassModule(className);
122
+ return { content: [{ type: 'text', text: `✓ 拉取成功!本地文件已更新: classes/${className}/${className}.java` }] };
123
+ } finally {
124
+ process.chdir(originalCwd);
125
+ }
126
+ } catch (error) {
127
+ return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
128
+ }
129
+ }
130
+
131
+ /**
132
+ * 获取类列表
133
+ */
134
+ async function listClasses({ queryParams = {}, limit = 20, projectPath = process.cwd() }) {
135
+ try {
136
+ const queryString = encodeURI(JSON.stringify(queryParams));
137
+ const originalCwd = process.cwd();
138
+ process.chdir(projectPath);
139
+
140
+ let classList;
141
+ try {
142
+ classList = await getClassModule(queryString, projectPath);
143
+ } finally {
144
+ process.chdir(originalCwd);
145
+ }
146
+
147
+ if (!classList || classList.length === 0) {
148
+ return { content: [{ type: 'text', text: '未找到任何类' }] };
149
+ }
150
+
151
+ const limitedList = classList.slice(0, limit);
152
+ let result = `## 类列表\n\n找到 ${classList.length} 个类,显示前 ${limitedList.length} 个\n\n`;
153
+
154
+ limitedList.forEach((item, index) => {
155
+ result += `### ${index + 1}. ${item.name || item.apiname}\n`;
156
+ result += `- **ID**: ${item.id}\n`;
157
+ result += `- **API名称**: ${item.apiname || 'N/A'}\n\n`;
158
+ });
159
+
160
+ if (classList.length > limit) {
161
+ result += `\n提示:还有 ${classList.length - limit} 个类未显示`;
162
+ }
163
+
164
+ return { content: [{ type: 'text', text: result }] };
165
+ } catch (error) {
166
+ return { content: [{ type: 'text', text: `✗ 查询失败: ${error.message}` }] };
167
+ }
168
+ }
169
+
170
+ /**
171
+ * 获取类详细信息
172
+ */
173
+ async function getClassDetail({ className, projectPath = process.cwd() }) {
174
+ try {
175
+ const configPath = path.join(projectPath, `classes/${className}/config.json`);
176
+ const javaFilePath = path.join(projectPath, `classes/${className}/${className}.java`);
177
+
178
+ if (!fs.existsSync(configPath)) {
179
+ return { content: [{ type: 'text', text: `✗ 类 ${className} 不存在` }] };
180
+ }
181
+
182
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
183
+ const javaContent = fs.readFileSync(javaFilePath, 'utf8');
184
+ const lines = javaContent.split('\n');
185
+
186
+ let result = `## 类信息: ${className}\n\n`;
187
+ result += `### 配置信息\n`;
188
+ result += `- **名称**: ${config.name}\n`;
189
+ result += `- **版本**: ${config.version}\n`;
190
+ result += `- **服务器ID**: ${config.id || '未发布'}\n\n`;
191
+ result += `### 文件信息\n`;
192
+ result += `- **路径**: classes/${className}/${className}.java\n`;
193
+ result += `- **总行数**: ${lines.length}\n\n`;
194
+ result += `### 源码预览(前50行)\n\`\`\`java\n`;
195
+ result += lines.slice(0, 50).join('\n');
196
+ if (lines.length > 50) {
197
+ result += `\n...\n(还有 ${lines.length - 50} 行未显示)`;
198
+ }
199
+ result += `\n\`\`\``;
200
+
201
+ return { content: [{ type: 'text', text: result }] };
202
+ } catch (error) {
203
+ return { content: [{ type: 'text', text: `✗ 获取失败: ${error.message}` }] };
204
+ }
205
+ }
206
+
207
+ /**
208
+ * 批量拉取多个类
209
+ */
210
+ async function pullMultipleClasses({ classIds, projectPath = process.cwd() }) {
211
+ const results = { success: [], failed: [] };
212
+
213
+ try {
214
+ const originalCwd = process.cwd();
215
+ process.chdir(projectPath);
216
+
217
+ try {
218
+ for (let i = 0; i < classIds.length; i++) {
219
+ const classId = classIds[i];
220
+ try {
221
+ await pullListModule(classId, projectPath);
222
+ results.success.push(classId);
223
+ } catch (error) {
224
+ results.failed.push({ id: classId, error: error.message });
225
+ }
226
+ }
227
+ } finally {
228
+ process.chdir(originalCwd);
229
+ }
230
+
231
+ let result = `## 批量拉取完成\n\n`;
232
+ result += `- **成功**: ${results.success.length} 个\n`;
233
+ result += `- **失败**: ${results.failed.length} 个\n\n`;
234
+
235
+ if (results.success.length > 0) {
236
+ result += `### 成功的类\n${results.success.map(id => `- ${id}`).join('\n')}\n\n`;
237
+ }
238
+
239
+ if (results.failed.length > 0) {
240
+ result += `### 失败的类\n${results.failed.map(({ id, error }) => `- **${id}**: ${error}`).join('\n')}`;
241
+ }
242
+
243
+ return { content: [{ type: 'text', text: result }] };
244
+ } catch (error) {
245
+ return { content: [{ type: 'text', text: `✗ 批量拉取失败: ${error.message}` }] };
246
+ }
247
+ }
248
+
249
+ /**
250
+ * 查看创建指南 - 使用 javaClassTemplate、configStructure、usageGuide
251
+ */
252
+ async function viewCreateGuide() {
253
+ try {
254
+ const prompt = require('./prompt');
255
+ let result = `## ${prompt.javaClassTemplate.name}\n\n`;
256
+ result += `${prompt.javaClassTemplate.description}\n\n`;
257
+ result += `### 代码模板\n\`\`\`java\n${prompt.javaClassTemplate.example}\n\`\`\`\n\n`;
258
+ result += `### 重要提示\n`;
259
+ prompt.javaClassTemplate.notes.forEach(note => {
260
+ result += `- ${note}\n`;
261
+ });
262
+
263
+ result += `\n## ${prompt.configStructure.name}\n\n`;
264
+ result += `${prompt.configStructure.description}\n\n`;
265
+ result += `### 配置字段\n`;
266
+ for (const [key, field] of Object.entries(prompt.configStructure.fields)) {
267
+ result += `- **${key}** (${field.type}${field.required ? ', 必需' : ''}): ${field.description}\n`;
268
+ if (field.default) result += ` 默认值: ${field.default}\n`;
269
+ }
270
+ result += `\n### 示例\n\`\`\`json\n${JSON.stringify(prompt.configStructure.example, null, 2)}\n\`\`\`\n`;
271
+
272
+ result += `\n## 工作流\n`;
273
+ prompt.usageGuide.workflow.forEach(step => {
274
+ result += `${step}\n`;
275
+ });
276
+
277
+ result += `\n## 最佳实践\n`;
278
+ prompt.usageGuide.bestPractices.forEach(practice => {
279
+ result += `- ${practice}\n`;
280
+ });
281
+ return { content: [{ type: 'text', text: result }] };
282
+ } catch (error) {
283
+ return { content: [{ type: 'text', text: `✗ 获取创建指南失败: ${error.message}` }] };
284
+ }
285
+ }
286
+
287
+ /**
288
+ * 查看 API 文档 - 使用 ccServiceApis
289
+ */
290
+ async function viewApiDocs() {
291
+ try {
292
+ const prompt = require('./prompt');
293
+ const api = prompt.ccServiceApis;
294
+ let result = `## ${api.name}\n\n${api.description}\n\n`;
295
+
296
+ for (const [key, method] of Object.entries(api.apis)) {
297
+ result += `### ${method.description}\n`;
298
+ result += `**签名**: \`${method.signature}\`\n\n`;
299
+ result += `**示例**:\n\`\`\`java\n${method.example}\n\`\`\`\n\n`;
300
+ }
301
+
302
+ return { content: [{ type: 'text', text: result }] };
303
+ } catch (error) {
304
+ return { content: [{ type: 'text', text: `✗ 获取 API 文档失败: ${error.message}` }] };
305
+ }
306
+ }
307
+
308
+ /**
309
+ * 查看常见问题 - 使用 faq、errorMessages
310
+ */
311
+ async function viewFAQ() {
312
+ try {
313
+ const prompt = require('./prompt');
314
+ let result = `## 常见问题\n\n`;
315
+
316
+ prompt.faq.forEach((item, index) => {
317
+ result += `### ${index + 1}. ${item.question}\n`;
318
+ result += `${item.answer}\n\n`;
319
+ });
320
+
321
+ result += `## 错误信息\n\n`;
322
+ for (const [code, error] of Object.entries(prompt.errorMessages)) {
323
+ result += `### ${code}\n`;
324
+ result += `**错误**: ${error.message}\n`;
325
+ result += `**解决方案**: ${error.solution}\n\n`;
326
+ }
327
+
328
+ return { content: [{ type: 'text', text: result }] };
329
+ } catch (error) {
330
+ return { content: [{ type: 'text', text: `✗ 获取常见问题失败: ${error.message}` }] };
331
+ }
332
+ }
333
+
334
+ /**
335
+ * 编辑类 - 提供编辑时需要的知识库和代码示例
336
+ */
337
+ async function editClass({ topic = 'ccservice' }) {
338
+ try {
339
+ const prompt = require('./prompt');
340
+ const result = prompt.getEditGuide(topic);
341
+ return { content: [{ type: 'text', text: result }] };
342
+ } catch (error) {
343
+ return { content: [{ type: 'text', text: `✗ 获取编辑指南失败: ${error.message}` }] };
344
+ }
345
+ }
346
+
347
+ module.exports = {
348
+ createClass,
349
+ publishClass,
350
+ pullClass,
351
+ listClasses,
352
+ getClassDetail,
353
+ pullMultipleClasses,
354
+ viewCreateGuide,
355
+ viewApiDocs,
356
+ viewFAQ,
357
+ editClass
358
+ };