@becrafter/prompt-manager 0.0.19 → 0.1.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.
Files changed (103) hide show
  1. package/README.md +145 -234
  2. package/app/desktop/assets/app.1.png +0 -0
  3. package/app/desktop/assets/app.png +0 -0
  4. package/app/desktop/assets/icons/icon.icns +0 -0
  5. package/app/desktop/assets/icons/icon.ico +0 -0
  6. package/app/desktop/assets/icons/icon.png +0 -0
  7. package/app/desktop/assets/icons/tray.png +0 -0
  8. package/app/desktop/assets/tray.1.png +0 -0
  9. package/app/desktop/assets/tray.png +0 -0
  10. package/app/desktop/main.js +27 -0
  11. package/app/desktop/package-lock.json +216 -48
  12. package/app/desktop/package.json +23 -29
  13. package/app/desktop/src/services/module-loader.js +43 -22
  14. package/app/desktop/src/services/runtime-manager.js +172 -23
  15. package/app/desktop/src/ui/admin-window-manager.js +757 -0
  16. package/app/desktop/src/ui/splash-manager.js +253 -0
  17. package/app/desktop/src/ui/tray-manager.js +8 -24
  18. package/app/desktop/src/utils/icon-manager.js +39 -47
  19. package/app/desktop/src/utils/resource-paths.js +0 -23
  20. package/app/desktop/src/utils/resource-sync.js +260 -0
  21. package/app/desktop/src/utils/runtime-sync.js +241 -0
  22. package/examples/prompts/recommend/human_3-0_growth_diagnostic_coach_prompt.yaml +105 -0
  23. package/package.json +16 -13
  24. package/packages/admin-ui/.babelrc +3 -0
  25. package/packages/admin-ui/admin.html +237 -4784
  26. package/packages/admin-ui/css/main.css +2592 -0
  27. package/packages/admin-ui/css/recommended-prompts.css +610 -0
  28. package/packages/admin-ui/package-lock.json +6981 -0
  29. package/packages/admin-ui/package.json +36 -0
  30. package/packages/admin-ui/src/codemirror.js +53 -0
  31. package/packages/admin-ui/src/index.js +3188 -0
  32. package/packages/admin-ui/webpack.config.js +76 -0
  33. package/packages/resources/tools/chrome-devtools/README.md +310 -0
  34. package/packages/resources/tools/chrome-devtools/chrome-devtools.tool.js +1703 -0
  35. package/packages/resources/tools/file-reader/README.md +289 -0
  36. package/packages/resources/tools/file-reader/file-reader.tool.js +1545 -0
  37. package/packages/resources/tools/filesystem/README.md +359 -0
  38. package/packages/resources/tools/filesystem/filesystem.tool.js +514 -160
  39. package/packages/resources/tools/ollama-remote/README.md +192 -0
  40. package/packages/resources/tools/ollama-remote/ollama-remote.tool.js +421 -0
  41. package/packages/resources/tools/pdf-reader/README.md +236 -0
  42. package/packages/resources/tools/pdf-reader/pdf-reader.tool.js +565 -0
  43. package/packages/resources/tools/playwright/README.md +306 -0
  44. package/packages/resources/tools/playwright/playwright.tool.js +1186 -0
  45. package/packages/resources/tools/todolist/README.md +394 -0
  46. package/packages/resources/tools/todolist/todolist.tool.js +1312 -0
  47. package/packages/server/README.md +142 -0
  48. package/packages/server/api/admin.routes.js +42 -11
  49. package/packages/server/api/surge.routes.js +43 -0
  50. package/packages/server/app.js +119 -14
  51. package/packages/server/index.js +39 -0
  52. package/packages/server/mcp/mcp.server.js +324 -105
  53. package/packages/server/mcp/sequential-thinking.handler.js +318 -0
  54. package/packages/server/mcp/think-plan.handler.js +274 -0
  55. package/packages/server/middlewares/auth.middleware.js +6 -0
  56. package/packages/server/package.json +51 -0
  57. package/packages/server/server.js +37 -1
  58. package/packages/server/toolm/index.js +9 -0
  59. package/packages/server/toolm/package-installer.service.js +267 -0
  60. package/packages/server/toolm/test-tools.js +264 -0
  61. package/packages/server/toolm/tool-context.service.js +334 -0
  62. package/packages/server/toolm/tool-dependency.service.js +168 -0
  63. package/packages/server/toolm/tool-description-generator-optimized.service.js +375 -0
  64. package/packages/server/toolm/tool-description-generator.service.js +312 -0
  65. package/packages/server/toolm/tool-environment.service.js +200 -0
  66. package/packages/server/toolm/tool-execution.service.js +277 -0
  67. package/packages/server/toolm/tool-loader.service.js +219 -0
  68. package/packages/server/toolm/tool-logger.service.js +223 -0
  69. package/packages/server/toolm/tool-manager.handler.js +65 -0
  70. package/packages/server/toolm/tool-manual-generator.service.js +389 -0
  71. package/packages/server/toolm/tool-mode-handlers.service.js +224 -0
  72. package/packages/server/toolm/tool-storage.service.js +111 -0
  73. package/packages/server/toolm/tool-sync.service.js +138 -0
  74. package/packages/server/toolm/tool-utils.js +20 -0
  75. package/packages/server/toolm/tool-yaml-parser.service.js +81 -0
  76. package/packages/server/toolm/validate-system.js +421 -0
  77. package/packages/server/utils/config.js +49 -5
  78. package/packages/server/utils/util.js +65 -10
  79. package/scripts/build-icons.js +99 -69
  80. package/scripts/build.sh +57 -0
  81. package/scripts/surge/CNAME +1 -0
  82. package/scripts/surge/README.md +47 -0
  83. package/scripts/surge/package-lock.json +34 -0
  84. package/scripts/surge/package.json +20 -0
  85. package/scripts/surge/sync-to-surge.js +151 -0
  86. package/app/desktop/assets/icons/icon_1024x1024.png +0 -0
  87. package/app/desktop/assets/icons/icon_128x128.png +0 -0
  88. package/app/desktop/assets/icons/icon_16x16.png +0 -0
  89. package/app/desktop/assets/icons/icon_24x24.png +0 -0
  90. package/app/desktop/assets/icons/icon_256x256.png +0 -0
  91. package/app/desktop/assets/icons/icon_32x32.png +0 -0
  92. package/app/desktop/assets/icons/icon_48x48.png +0 -0
  93. package/app/desktop/assets/icons/icon_512x512.png +0 -0
  94. package/app/desktop/assets/icons/icon_64x64.png +0 -0
  95. package/app/desktop/assets/icons/icon_96x96.png +0 -0
  96. package/packages/admin-ui/js/closebrackets.min.js +0 -8
  97. package/packages/admin-ui/js/codemirror.min.js +0 -8
  98. package/packages/admin-ui/js/js-yaml.min.js +0 -2
  99. package/packages/admin-ui/js/markdown.min.js +0 -8
  100. package/packages/resources/tools/index.js +0 -16
  101. package/packages/server/mcp/toolx.handler.js +0 -131
  102. package/scripts/icns-builder/package.json +0 -12
  103. /package/packages/server/mcp/{mcp.handler.js → prompt.handler.js} +0 -0
@@ -0,0 +1,375 @@
1
+ /**
2
+ * 工具描述生成服务(优化版)
3
+ *
4
+ * 从AI模型理解和使用工具的角度优化:
5
+ * 1. 提高信息密度,减少冗余
6
+ * 2. 增强语义匹配能力(利用tags、category)
7
+ * 3. 提供工具对比和区分信息
8
+ * 4. 优化IF-THEN规则,使其更语义化
9
+ * 5. 按分类组织工具,提高检索效率
10
+ */
11
+
12
+ import { toolLoaderService } from './tool-loader.service.js';
13
+ import { logger } from '../utils/logger.js';
14
+
15
+ /**
16
+ * 按分类组织工具
17
+ * @param {Array} tools - 工具列表
18
+ * @returns {Object} 按category分组的工具
19
+ */
20
+ function groupToolsByCategory(tools) {
21
+ const grouped = {};
22
+
23
+ for (const tool of tools) {
24
+ const category = tool.metadata.category || 'other';
25
+ if (!grouped[category]) {
26
+ grouped[category] = [];
27
+ }
28
+ grouped[category].push(tool);
29
+ }
30
+
31
+ // 按category名称排序
32
+ const sortedCategories = Object.keys(grouped).sort();
33
+ const result = {};
34
+ for (const cat of sortedCategories) {
35
+ result[cat] = grouped[cat].sort((a, b) => a.name.localeCompare(b.name));
36
+ }
37
+
38
+ return result;
39
+ }
40
+
41
+ /**
42
+ * 生成语义化的使用场景规则(优化版)
43
+ * @param {Array} tools - 工具列表
44
+ * @returns {string} 使用场景规则文本
45
+ */
46
+ function generateUsageScenarios(tools) {
47
+ const scenarios = [];
48
+
49
+ for (const tool of tools) {
50
+ const { name, metadata } = tool;
51
+ const toolId = `tool://${name}`;
52
+
53
+ // 策略1:优先使用scenarios,合并前2个场景(如果存在)
54
+ let scenarioText = '';
55
+
56
+ if (metadata.scenarios && metadata.scenarios.length > 0) {
57
+ // 合并前2个场景,用"或"连接,提供更丰富的语义信息
58
+ if (metadata.scenarios.length >= 2) {
59
+ scenarioText = `${metadata.scenarios[0]} 或 ${metadata.scenarios[1]}`;
60
+ } else {
61
+ scenarioText = metadata.scenarios[0];
62
+ }
63
+ } else if (metadata.description) {
64
+ // 策略2:从description中提取核心语义(前80字符,更完整)
65
+ scenarioText = metadata.description.length > 80
66
+ ? metadata.description.substring(0, 80) + '...'
67
+ : metadata.description;
68
+ } else {
69
+ // 策略3:使用工具名称和category
70
+ const category = metadata.category ? `(${metadata.category}类)` : '';
71
+ scenarioText = `需要使用 ${name} 功能${category}`;
72
+ }
73
+
74
+ // 添加tags作为语义增强(如果存在)
75
+ let tagsHint = '';
76
+ if (metadata.tags && metadata.tags.length > 0) {
77
+ // 只显示前3个最相关的tags
78
+ const keyTags = metadata.tags.slice(0, 3).map(t => `#${t}`).join(' ');
79
+ tagsHint = ` ${keyTags}`;
80
+ }
81
+
82
+ scenarios.push(`- IF ${scenarioText}${tagsHint} → 使用 ${toolId}`);
83
+ }
84
+
85
+ return scenarios.join('\n');
86
+ }
87
+
88
+ /**
89
+ * 生成分类工具列表(优化版)
90
+ * @param {Object} groupedTools - 按category分组的工具
91
+ * @returns {string} 工具列表文本
92
+ */
93
+ function generateCategorizedToolList(groupedTools) {
94
+ const sections = [];
95
+
96
+ const categoryNames = {
97
+ 'system': '系统工具',
98
+ 'utility': '实用工具',
99
+ 'ai': 'AI工具',
100
+ 'browser': '浏览器工具',
101
+ 'other': '其他工具'
102
+ };
103
+
104
+ for (const [category, tools] of Object.entries(groupedTools)) {
105
+ const categoryName = categoryNames[category] || category;
106
+ const toolItems = [];
107
+
108
+ for (const tool of tools) {
109
+ const { name, metadata } = tool;
110
+ const toolId = `tool://${name}`;
111
+
112
+ // 生成工具描述(优化截断逻辑)
113
+ let description = metadata.description || `${name} 工具`;
114
+
115
+ // 智能截断:尝试在句号、逗号处截断,保持语义完整
116
+ if (description.length > 120) {
117
+ const truncated = description.substring(0, 120);
118
+ const lastPunctuation = Math.max(
119
+ truncated.lastIndexOf('。'),
120
+ truncated.lastIndexOf(','),
121
+ truncated.lastIndexOf('.'),
122
+ truncated.lastIndexOf(',')
123
+ );
124
+ if (lastPunctuation > 80) {
125
+ description = truncated.substring(0, lastPunctuation + 1);
126
+ } else {
127
+ description = truncated + '...';
128
+ }
129
+ }
130
+
131
+ // 添加tags(如果存在)
132
+ let tagsDisplay = '';
133
+ if (metadata.tags && metadata.tags.length > 0) {
134
+ tagsDisplay = ` [${metadata.tags.slice(0, 3).join(', ')}]`;
135
+ }
136
+
137
+ toolItems.push(` - **${toolId}** - ${description}${tagsDisplay}`);
138
+ }
139
+
140
+ sections.push(`### ${categoryName}\n${toolItems.join('\n')}`);
141
+ }
142
+
143
+ return sections.join('\n\n');
144
+ }
145
+
146
+ /**
147
+ * 生成工具对比信息(帮助区分相似工具)
148
+ * @param {Array} tools - 工具列表
149
+ * @returns {string} 工具对比文本
150
+ */
151
+ function generateToolComparison(tools) {
152
+ // 识别相似工具(基于category和tags)
153
+ const similarGroups = [];
154
+ const processed = new Set();
155
+
156
+ for (let i = 0; i < tools.length; i++) {
157
+ if (processed.has(i)) continue;
158
+
159
+ const tool1 = tools[i];
160
+ const group = [tool1];
161
+ processed.add(i);
162
+
163
+ // 查找相似工具(相同category或tags重叠)
164
+ for (let j = i + 1; j < tools.length; j++) {
165
+ if (processed.has(j)) continue;
166
+
167
+ const tool2 = tools[j];
168
+
169
+ // 判断相似度:相同category或tags有重叠
170
+ const sameCategory = tool1.metadata.category === tool2.metadata.category;
171
+ const tagsOverlap = tool1.metadata.tags && tool2.metadata.tags &&
172
+ tool1.metadata.tags.some(tag => tool2.metadata.tags.includes(tag));
173
+
174
+ if (sameCategory && tagsOverlap) {
175
+ group.push(tool2);
176
+ processed.add(j);
177
+ }
178
+ }
179
+
180
+ if (group.length > 1) {
181
+ similarGroups.push(group);
182
+ }
183
+ }
184
+
185
+ if (similarGroups.length === 0) {
186
+ return '';
187
+ }
188
+
189
+ const comparisons = [];
190
+ for (const group of similarGroups) {
191
+ const toolNames = group.map(t => `tool://${t.name}`).join('、');
192
+ const differences = [];
193
+
194
+ for (const tool of group) {
195
+ const keyFeature = tool.metadata.description?.split(',')[0] ||
196
+ tool.metadata.scenarios?.[0] ||
197
+ tool.name;
198
+ differences.push(`- **${tool.name}**:${keyFeature}`);
199
+ }
200
+
201
+ comparisons.push(`**相似工具对比**(${toolNames}):\n${differences.join('\n')}`);
202
+ }
203
+
204
+ return comparisons.join('\n\n');
205
+ }
206
+
207
+ /**
208
+ * 生成 toolm 工具的完整描述(优化版)
209
+ * @returns {string} toolm 工具的 description
210
+ */
211
+ export function generateToolmDescription() {
212
+ try {
213
+ // 确保工具加载器已初始化
214
+ if (!toolLoaderService.initialized) {
215
+ logger.warn('工具加载器尚未初始化,使用默认描述');
216
+ return getDefaultDescription();
217
+ }
218
+
219
+ // 获取所有工具
220
+ const tools = toolLoaderService.getAllTools();
221
+
222
+ if (tools.length === 0) {
223
+ logger.warn('未发现任何工具,使用默认描述');
224
+ return getDefaultDescription();
225
+ }
226
+
227
+ // 按名称排序(用于IF-THEN规则)
228
+ tools.sort((a, b) => a.name.localeCompare(b.name));
229
+
230
+ // 按分类组织工具
231
+ const groupedTools = groupToolsByCategory(tools);
232
+
233
+ // 生成使用场景规则
234
+ const usageScenarios = generateUsageScenarios(tools);
235
+
236
+ // 生成分类工具列表
237
+ const categorizedToolList = generateCategorizedToolList(groupedTools);
238
+
239
+ // 生成工具对比信息
240
+ const toolComparison = generateToolComparison(tools);
241
+
242
+ // 组装完整的描述(优化结构,减少冗余)
243
+ const description = `ToolM 是 Prompt Manager 新一代工具系统运行时,提供统一的工具管理和执行能力。
244
+
245
+ ## 核心特性
246
+
247
+ - **智能工具加载** - 自动扫描并加载所有可用工具
248
+ - **四种运行模式** - manual(手册)、execute(执行)、configure(配置)、log(日志)
249
+ - **依赖管理** - 自动处理工具依赖和安装
250
+ - **错误智能处理** - 业务错误识别和解决方案提示
251
+ - **统一接口** - 所有工具遵循标准接口规范
252
+
253
+ ## 何时使用 ToolM
254
+
255
+ ### 快速决策(IF-THEN 规则):
256
+ ${usageScenarios}
257
+ - IF 看到 tool:// 格式 → 使用 toolm 调用
258
+ - IF 不确定工具用法 → 先用 manual 模式查看手册
259
+
260
+ ${toolComparison ? `\n### 工具选择指南\n\n${toolComparison}\n` : ''}
261
+
262
+ ### 首次使用任何工具
263
+ ⚠️ **必须先运行 mode: manual** 阅读工具文档
264
+ ⚠️ 示例:toolm with mode: manual for tool://filesystem
265
+
266
+ ## 如何使用 ToolM
267
+
268
+ ### 模式 1:查看工具手册(首次使用)
269
+
270
+ \`\`\`javascript
271
+ mcp__promptmanager__toolm({
272
+ yaml: \`tool: tool://filesystem
273
+ mode: manual\`
274
+ })
275
+ \`\`\`
276
+
277
+ ### 模式 2:执行工具操作
278
+
279
+ \`\`\`javascript
280
+ mcp__promptmanager__toolm({
281
+ yaml: \`tool: tool://filesystem
282
+ mode: execute
283
+ parameters:
284
+ method: read_text_file
285
+ path: ~/.prompt-manager/test.txt\`
286
+ })
287
+ \`\`\`
288
+
289
+ ## 关键规则
290
+
291
+ ### ✅ 正确格式
292
+ - 以 \`tool: tool://tool-name\` 开头
293
+ - 添加 \`mode: execute\`(或 manual/configure/log)
294
+ - 如需参数,添加 \`parameters:\` 部分并正确缩进
295
+
296
+ ### ❌ 常见错误
297
+ - 不要只传 "tool://filesystem"(缺少 YAML 结构)
298
+ - 不要忘记 "tool://" 前缀
299
+ - 不要跳过手册,首次使用必须先看 manual
300
+
301
+ ## 可用工具列表
302
+
303
+ ${categorizedToolList}
304
+
305
+ 更多工具正在开发中...`;
306
+
307
+ logger.debug('工具描述生成成功(优化版)', { toolCount: tools.length });
308
+ return description;
309
+
310
+ } catch (error) {
311
+ logger.error('生成工具描述失败,使用默认描述', { error: error.message });
312
+ return getDefaultDescription();
313
+ }
314
+ }
315
+
316
+ /**
317
+ * 获取默认描述(当工具加载失败时使用)
318
+ * @returns {string} 默认描述
319
+ */
320
+ function getDefaultDescription() {
321
+ return `ToolM 是 Prompt Manager 新一代工具系统运行时,提供统一的工具管理和执行能力。
322
+
323
+ ## 核心特性
324
+
325
+ - **智能工具加载** - 自动扫描并加载所有可用工具
326
+ - **四种运行模式** - manual(手册)、execute(执行)、configure(配置)、log(日志)
327
+ - **依赖管理** - 自动处理工具依赖和安装
328
+ - **错误智能处理** - 业务错误识别和解决方案提示
329
+ - **统一接口** - 所有工具遵循标准接口规范
330
+
331
+ ## 何时使用 ToolM
332
+
333
+ ### 常见场景(IF-THEN 规则):
334
+ - IF 看到 tool:// 格式 → 使用 toolm 调用
335
+ - IF 不确定工具用法 → 先用 manual 模式查看手册
336
+
337
+ ### 首次使用任何工具
338
+ ⚠️ **必须先运行 mode: manual** 阅读工具文档
339
+
340
+ ## 如何使用 ToolM
341
+
342
+ ### 模式 1:查看工具手册(首次使用)
343
+
344
+ \`\`\`javascript
345
+ mcp__promptmanager__toolm({
346
+ yaml: \`tool: tool://filesystem
347
+ mode: manual\`
348
+ })
349
+ \`\`\`
350
+
351
+ ### 模式 2:执行工具操作
352
+
353
+ \`\`\`javascript
354
+ mcp__promptmanager__toolm({
355
+ yaml: \`tool: tool://filesystem
356
+ mode: execute
357
+ parameters:
358
+ method: read_text_file
359
+ path: ~/.prompt-manager/test.txt\`
360
+ })
361
+ \`\`\`
362
+
363
+ ## 关键规则
364
+
365
+ ### ✅ 正确格式
366
+ - 以 \`tool: tool://tool-name\` 开头
367
+ - 添加 \`mode: execute\`(或 manual/configure/log)
368
+ - 如需参数,添加 \`parameters:\` 部分并正确缩进
369
+
370
+ ### ❌ 常见错误
371
+ - 不要只传 "tool://filesystem"(缺少 YAML 结构)
372
+ - 不要忘记 "tool://" 前缀
373
+ - 不要跳过手册,首次使用必须先看 manual`;
374
+ }
375
+
@@ -0,0 +1,312 @@
1
+ /**
2
+ * 工具描述生成服务
3
+ *
4
+ * 职责:
5
+ * 1. 从工具加载服务获取所有工具的元数据
6
+ * 2. 动态生成 toolm 工具的 description
7
+ * 3. 自动生成工具列表和使用场景说明
8
+ */
9
+
10
+ import { toolLoaderService } from './tool-loader.service.js';
11
+ import { logger } from '../utils/logger.js';
12
+
13
+ /**
14
+ * 生成工具的使用场景规则(IF-THEN 格式)
15
+ * @param {Array} tools - 工具列表
16
+ * @returns {string} 使用场景规则文本
17
+ */
18
+ function generateUsageScenarios(tools) {
19
+ const scenarios = [];
20
+
21
+ for (const tool of tools) {
22
+ const { name, metadata } = tool;
23
+ const toolId = `tool://${name}`;
24
+
25
+ // 从 metadata 中提取使用场景描述
26
+ // 优先使用 scenarios 字段的第一个场景,如果没有则从 description 提取关键词
27
+ let scenarioText = '';
28
+
29
+ if (metadata.scenarios && metadata.scenarios.length > 0) {
30
+ // 使用第一个场景作为主要描述
31
+ scenarioText = metadata.scenarios[0];
32
+ } else if (metadata.description) {
33
+ // 从描述中提取核心功能关键词(前60个字符)
34
+ scenarioText = metadata.description.length > 60
35
+ ? metadata.description.substring(0, 60) + '...'
36
+ : metadata.description;
37
+ } else {
38
+ // 使用工具名称
39
+ scenarioText = `需要使用 ${name} 功能`;
40
+ }
41
+
42
+ scenarios.push(`- IF ${scenarioText} → 使用 ${toolId}`);
43
+ }
44
+
45
+ return scenarios.join('\n');
46
+ }
47
+
48
+ /**
49
+ * 生成工具列表说明
50
+ * @param {Array} tools - 工具列表
51
+ * @returns {string} 工具列表文本
52
+ */
53
+ function generateToolList(tools) {
54
+ const toolItems = [];
55
+
56
+ for (const tool of tools) {
57
+ const { name, metadata } = tool;
58
+ const toolId = `tool://${name}`;
59
+
60
+ // 生成工具描述
61
+ let description = metadata.description || `${name} 工具`;
62
+
63
+ // 如果描述太长,截取前100个字符
64
+ if (description.length > 100) {
65
+ description = description.substring(0, 100) + '...';
66
+ }
67
+
68
+ toolItems.push(`- **${toolId}** - ${description}`);
69
+ }
70
+
71
+ return toolItems.join('\n');
72
+ }
73
+
74
+ /**
75
+ * 生成 toolm 工具的完整描述
76
+ * @returns {string} toolm 工具的 description
77
+ */
78
+ export function generateToolmDescription() {
79
+ try {
80
+ // 确保工具加载器已初始化
81
+ if (!toolLoaderService.initialized) {
82
+ logger.warn('工具加载器尚未初始化,使用默认描述');
83
+ return getDefaultDescription();
84
+ }
85
+
86
+ // 获取所有工具
87
+ const tools = toolLoaderService.getAllTools();
88
+
89
+ if (tools.length === 0) {
90
+ logger.warn('未发现任何工具,使用默认描述');
91
+ return getDefaultDescription();
92
+ }
93
+
94
+ // 按名称排序
95
+ tools.sort((a, b) => a.name.localeCompare(b.name));
96
+
97
+ // 生成使用场景规则
98
+ const usageScenarios = generateUsageScenarios(tools);
99
+
100
+ // 生成工具列表
101
+ const toolList = generateToolList(tools);
102
+
103
+ // 组装完整的描述
104
+ const description = `ToolM 是 Prompt Manager 新一代工具系统运行时,提供统一的工具管理和执行能力。
105
+
106
+ ## 核心特性
107
+
108
+ ToolM 作为统一工具管理器,提供:
109
+ - **智能工具加载** - 自动扫描并加载所有可用工具
110
+ - **四种运行模式** - manual(手册)、execute(执行)、configure(配置)、log(日志)
111
+ - **依赖管理** - 自动处理工具依赖和安装
112
+ - **错误智能处理** - 业务错误识别和解决方案提示
113
+ - **统一接口** - 所有工具遵循标准接口规范
114
+
115
+ ## 何时使用 ToolM
116
+
117
+ ### 常见场景(IF-THEN 规则):
118
+ ${usageScenarios}
119
+ - IF 看到 tool:// 格式 → 使用 toolm 调用
120
+ - IF 不确定工具用法 → 先用 manual 模式查看手册
121
+
122
+ ### 首次使用任何工具
123
+ ⚠️ **必须先运行 mode: manual** 阅读工具文档
124
+ ⚠️ 示例:toolm with mode: manual for tool://filesystem
125
+
126
+ ## 如何使用 ToolM(复制这些模式)
127
+
128
+ ### 模式 1:查看工具手册(首次使用)
129
+
130
+ **使用代码:**
131
+ \`\`\`javascript
132
+ mcp__promptmanager__toolm({
133
+ yaml: \`tool: tool://filesystem
134
+ mode: manual\`
135
+ })
136
+ \`\`\`
137
+
138
+ **作用:** 显示 filesystem 工具的完整使用手册
139
+
140
+ ### 模式 2:执行工具操作
141
+
142
+ **使用代码:**
143
+ \`\`\`javascript
144
+ // 写入文件
145
+ mcp__promptmanager__toolm({
146
+ yaml: \`tool: tool://filesystem
147
+ mode: execute
148
+ parameters:
149
+ method: write_file
150
+ path: ~/.prompt-manager/test.txt
151
+ content: |
152
+ Hello World
153
+ 这是测试内容\`
154
+ })
155
+
156
+ // 读取文件
157
+ mcp__promptmanager__toolm({
158
+ yaml: \`tool: tool://filesystem
159
+ mode: execute
160
+ parameters:
161
+ method: read_text_file
162
+ path: ~/.prompt-manager/test.txt\`
163
+ })
164
+ \`\`\`
165
+
166
+ **作用:** 根据指定的工具和参数执行操作
167
+
168
+ ### 模式 3:配置工具环境
169
+
170
+ **使用代码:**
171
+ \`\`\`javascript
172
+ mcp__promptmanager__toolm({
173
+ yaml: \`tool: tool://filesystem
174
+ mode: configure
175
+ parameters:
176
+ ALLOWED_DIRECTORIES: '["~/.prompt-manager", "/tmp"]'\`
177
+ })
178
+ \`\`\`
179
+
180
+ **作用:** 设置工具的环境变量
181
+
182
+ ### 模式 4:查看工具日志
183
+
184
+ **使用代码:**
185
+ \`\`\`javascript
186
+ mcp__promptmanager__toolm({
187
+ yaml: \`tool: tool://filesystem
188
+ mode: log
189
+ parameters:
190
+ action: tail
191
+ lines: 50\`
192
+ })
193
+ \`\`\`
194
+
195
+ **作用:** 查看工具最近的 50 条日志
196
+
197
+ ## 关键规则(必须遵守)
198
+
199
+ ### ✅ 正确格式
200
+ yaml 参数必须是完整的 YAML 文档:
201
+ - 以 \`tool: tool://tool-name\` 开头
202
+ - 添加 \`mode: execute\`(或 manual/configure/log)
203
+ - 如需参数,添加 \`parameters:\` 部分并正确缩进
204
+
205
+ ### ❌ 常见错误避免
206
+ - 不要只传 "tool://filesystem"(缺少 YAML 结构)
207
+ - 不要添加 @ 前缀如 "@tool://filesystem"(系统会处理)
208
+ - 不要忘记 "tool://" 前缀(不是 "tool: filesystem")
209
+ - 不要跳过手册,首次使用必须先看 manual
210
+
211
+ ## 系统内置工具
212
+
213
+ 完整内置工具列表:
214
+ ${toolList}
215
+
216
+ 更多工具正在开发中...
217
+
218
+ ## 逐步工作流程
219
+
220
+ ### 步骤 1:查看可用工具
221
+ 使用 manual 模式了解工具能力
222
+
223
+ ### 步骤 2:阅读工具手册
224
+ \`\`\`javascript
225
+ mcp__promptmanager__toolm({
226
+ yaml: \`tool: tool://TOOLNAME
227
+ mode: manual\`
228
+ })
229
+ \`\`\`
230
+
231
+ ### 步骤 3:执行工具操作
232
+ 根据手册中的示例,修改参数以满足需求
233
+
234
+ ### 步骤 4:处理错误
235
+ 如果执行失败,检查:
236
+ - 工具名称是否正确?
237
+ - 参数是否正确缩进?
238
+ - 是否先阅读了手册?
239
+ - 错误提示中是否有解决方案?`;
240
+
241
+ logger.debug('工具描述生成成功', { toolCount: tools.length });
242
+ return description;
243
+
244
+ } catch (error) {
245
+ logger.error('生成工具描述失败,使用默认描述', { error: error.message });
246
+ return getDefaultDescription();
247
+ }
248
+ }
249
+
250
+ /**
251
+ * 获取默认描述(当工具加载失败时使用)
252
+ * @returns {string} 默认描述
253
+ */
254
+ function getDefaultDescription() {
255
+ return `ToolM 是 Prompt Manager 新一代工具系统运行时,提供统一的工具管理和执行能力。
256
+
257
+ ## 核心特性
258
+
259
+ ToolM 作为统一工具管理器,提供:
260
+ - **智能工具加载** - 自动扫描并加载所有可用工具
261
+ - **四种运行模式** - manual(手册)、execute(执行)、configure(配置)、log(日志)
262
+ - **依赖管理** - 自动处理工具依赖和安装
263
+ - **错误智能处理** - 业务错误识别和解决方案提示
264
+ - **统一接口** - 所有工具遵循标准接口规范
265
+
266
+ ## 何时使用 ToolM
267
+
268
+ ### 常见场景(IF-THEN 规则):
269
+ - IF 看到 tool:// 格式 → 使用 toolm 调用
270
+ - IF 不确定工具用法 → 先用 manual 模式查看手册
271
+
272
+ ### 首次使用任何工具
273
+ ⚠️ **必须先运行 mode: manual** 阅读工具文档
274
+
275
+ ## 如何使用 ToolM
276
+
277
+ ### 模式 1:查看工具手册(首次使用)
278
+
279
+ \`\`\`javascript
280
+ mcp__promptmanager__toolm({
281
+ yaml: \`tool: tool://filesystem
282
+ mode: manual\`
283
+ })
284
+ \`\`\`
285
+
286
+ ### 模式 2:执行工具操作
287
+
288
+ \`\`\`javascript
289
+ mcp__promptmanager__toolm({
290
+ yaml: \`tool: tool://filesystem
291
+ mode: execute
292
+ parameters:
293
+ method: read_text_file
294
+ path: ~/.prompt-manager/test.txt\`
295
+ })
296
+ \`\`\`
297
+
298
+ ## 关键规则(必须遵守)
299
+
300
+ ### ✅ 正确格式
301
+ yaml 参数必须是完整的 YAML 文档:
302
+ - 以 \`tool: tool://tool-name\` 开头
303
+ - 添加 \`mode: execute\`(或 manual/configure/log)
304
+ - 如需参数,添加 \`parameters:\` 部分并正确缩进
305
+
306
+ ### ❌ 常见错误避免
307
+ - 不要只传 "tool://filesystem"(缺少 YAML 结构)
308
+ - 不要添加 @ 前缀如 "@tool://filesystem"(系统会处理)
309
+ - 不要忘记 "tool://" 前缀(不是 "tool: filesystem")
310
+ - 不要跳过手册,首次使用必须先看 manual`;
311
+ }
312
+