@becrafter/prompt-manager 0.0.16 → 0.0.19

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 (60) hide show
  1. package/IFLOW.md +175 -0
  2. package/README.md +66 -80
  3. package/app/desktop/assets/icons/icon.icns +0 -0
  4. package/app/desktop/assets/icons/icon.ico +0 -0
  5. package/app/desktop/assets/icons/icon_1024x1024.png +0 -0
  6. package/app/desktop/assets/icons/icon_128x128.png +0 -0
  7. package/app/desktop/assets/icons/icon_16x16.png +0 -0
  8. package/app/desktop/assets/icons/icon_24x24.png +0 -0
  9. package/app/desktop/assets/icons/icon_256x256.png +0 -0
  10. package/app/desktop/assets/icons/icon_32x32.png +0 -0
  11. package/app/desktop/assets/icons/icon_48x48.png +0 -0
  12. package/app/desktop/assets/icons/icon_512x512.png +0 -0
  13. package/app/desktop/assets/icons/icon_64x64.png +0 -0
  14. package/app/desktop/assets/icons/icon_96x96.png +0 -0
  15. package/app/desktop/assets/templates/about.html +147 -0
  16. package/app/desktop/main.js +178 -460
  17. package/app/desktop/package-lock.json +1150 -412
  18. package/app/desktop/package.json +54 -11
  19. package/app/desktop/preload.js +7 -0
  20. package/app/desktop/src/core/error-handler.js +108 -0
  21. package/app/desktop/src/core/event-emitter.js +84 -0
  22. package/app/desktop/src/core/logger.js +108 -0
  23. package/app/desktop/src/core/state-manager.js +125 -0
  24. package/app/desktop/src/services/module-loader.js +193 -0
  25. package/app/desktop/src/services/runtime-manager.js +152 -0
  26. package/app/desktop/src/services/service-manager.js +169 -0
  27. package/app/desktop/src/services/update-manager.js +268 -0
  28. package/app/desktop/src/ui/about-dialog-manager.js +208 -0
  29. package/app/desktop/src/ui/tray-manager.js +202 -0
  30. package/app/desktop/src/utils/icon-manager.js +141 -0
  31. package/app/desktop/src/utils/path-utils.js +58 -0
  32. package/app/desktop/src/utils/resource-paths.js +72 -0
  33. package/app/desktop/src/utils/template-renderer.js +284 -0
  34. package/app/desktop/src/utils/version-utils.js +59 -0
  35. package/examples/prompts/engineer/engineer-professional.yaml +92 -0
  36. package/examples/prompts/engineer/laowang-engineer.yaml +132 -0
  37. package/examples/prompts/engineer/nekomata-engineer.yaml +123 -0
  38. package/examples/prompts/engineer/ojousama-engineer.yaml +124 -0
  39. package/examples/prompts/workflow/sixstep-workflow.yaml +192 -0
  40. package/package.json +10 -3
  41. package/packages/admin-ui/admin.html +2 -2
  42. package/packages/resources/tools/filesystem/filesystem.tool.js +184 -0
  43. package/packages/resources/tools/index.js +16 -0
  44. package/packages/server/api/admin.routes.js +450 -0
  45. package/packages/server/api/open.routes.js +89 -0
  46. package/packages/server/app.js +163 -0
  47. package/packages/server/mcp/mcp.handler.js +265 -0
  48. package/packages/server/mcp/mcp.server.js +181 -0
  49. package/packages/server/mcp/toolx.handler.js +131 -0
  50. package/packages/server/middlewares/auth.middleware.js +34 -0
  51. package/packages/server/server.js +42 -908
  52. package/packages/server/{manager.js → services/manager.js} +13 -5
  53. package/packages/server/{config.js → utils/config.js} +27 -27
  54. package/packages/server/utils/util.js +356 -0
  55. package/scripts/build-icons.js +105 -0
  56. package/scripts/icns-builder/package.json +12 -0
  57. package/packages/server/mcp.js +0 -234
  58. package/packages/server/mcpManager.js +0 -205
  59. /package/app/desktop/assets/{icon.png → icons/icon.png} +0 -0
  60. /package/packages/server/{logger.js → utils/logger.js} +0 -0
package/IFLOW.md ADDED
@@ -0,0 +1,175 @@
1
+ # Prompt Manager 项目概述
2
+
3
+ ## 项目简介
4
+
5
+ Prompt Manager 是一个基于 MCP(Model Context Protocol)协议的 Prompt 管理服务。它支持 HTTP 流式传输、提供 Web 管理界面和桌面应用,能够将静态提示词模板转换为可通过 API 调用的动态服务。
6
+
7
+ 核心特性包括:
8
+ - 完全兼容模型上下文协议(MCP)
9
+ - 基于 StreamableHTTP 协议优化的 HTTP 流式传输
10
+ - 自动发现子目录中的 prompt 文件
11
+ - 支持命令行参数和环境变量配置
12
+ - 内置 Electron 菜单应用,可一键启动/停止服务
13
+ - 提供 Web 管理界面,方便创建、编辑和管理提示词
14
+
15
+ ## 技术栈
16
+
17
+ - **后端**: Node.js (>=18.0.0), Express.js
18
+ - **前端**: 内置管理界面使用原生 JavaScript 和 Codemirror
19
+ - **协议**: MCP (Model Context Protocol)
20
+ - **桌面应用**: Electron
21
+ - **包管理**: npm/pnpm
22
+
23
+ ## 项目结构
24
+
25
+ ```
26
+ prompt-manager/
27
+ ├── app/
28
+ │ ├── cli/ # 命令行命令分发与共享工具
29
+ │ └── desktop/ # Electron 菜单应用
30
+ ├── packages/
31
+ │ ├── admin-ui/ # 内置管理后台静态资源
32
+ │ └── server/ # 服务端核心逻辑
33
+ ├── examples/
34
+ │ └── prompts/ # 随包示例提示词(首次启动会同步到 ~/.prompt-manager/prompts)
35
+ ├── scripts/ # 安装/维护脚本(如 env 同步)
36
+ ├── bin/ # 可执行入口
37
+ └── package.json
38
+ ```
39
+
40
+ ## 构建和运行
41
+
42
+ ### 安装依赖
43
+
44
+ 在项目根目录运行:
45
+
46
+ ```bash
47
+ npm install
48
+ ```
49
+
50
+ ### 启动开发服务器
51
+
52
+ ```bash
53
+ # 启动服务端开发服务器
54
+ npm run dev
55
+
56
+ # 启动桌面应用开发环境
57
+ npm run desktop:dev
58
+ ```
59
+
60
+ ### 构建桌面应用
61
+
62
+ ```bash
63
+ # 构建桌面应用安装包
64
+ npm run desktop:build
65
+ ```
66
+
67
+ ### 命令行使用
68
+
69
+ ```bash
70
+ # 使用默认配置启动
71
+ prompt-manager
72
+
73
+ # 指定提示词目录
74
+ prompt-manager --prompts-dir ./my-prompts
75
+
76
+ # 指定端口
77
+ prompt-manager --port 5621
78
+
79
+ # 显式使用 start/run 命令
80
+ prompt-manager start --port 6000
81
+ prompt-manager run --prompts-dir ./examples/prompts
82
+
83
+ # 获取帮助/版本信息
84
+ prompt-manager --help
85
+ prompt-manager --version
86
+ ```
87
+
88
+ ## 开发约定
89
+
90
+ 1. **代码风格**: 项目使用 ES6 模块系统,遵循标准的 JavaScript 编码规范。
91
+ 2. **目录结构**:
92
+ - `app/` 目录包含客户端相关代码(CLI 和桌面应用)
93
+ - `packages/` 目录包含服务端核心逻辑和管理界面
94
+ - `examples/` 目录包含示例提示词文件
95
+ 3. **配置管理**: 支持通过命令行参数、环境变量和配置文件进行配置。
96
+ 4. **日志记录**: 使用自定义 logger 模块进行日志记录。
97
+ 5. **错误处理**: 统一的错误处理机制,关键操作都有适当的错误捕获和处理。
98
+
99
+ ## API 接口
100
+
101
+ ### MCP 协议接口
102
+
103
+ 服务器实现了 MCP 协议,支持以下工具:
104
+
105
+ - `search_prompts`: 搜索提示词
106
+ - `get_prompt`: 获取指定提示词的完整内容
107
+ - `reload_prompts`: 重新加载所有提示词(暂未启用)
108
+
109
+ ### Web 管理接口
110
+
111
+ 1. **获取提示词列表**
112
+ ```
113
+ GET /prompts[?search=关键词]
114
+ ```
115
+
116
+ 2. **获取单个提示词详情**
117
+ ```
118
+ GET /api/prompts/:name[?path=文件路径]
119
+ ```
120
+
121
+ 3. **创建/更新提示词**
122
+ ```
123
+ POST /api/prompts
124
+ ```
125
+
126
+ 4. **删除提示词**
127
+ ```
128
+ DELETE /api/prompts/:name[?path=文件路径]
129
+ ```
130
+
131
+ 5. **切换提示词启用状态**
132
+ ```
133
+ POST /api/prompts/:name/toggle[?path=文件路径]
134
+ ```
135
+
136
+ 6. **处理提示词**
137
+ ```
138
+ POST /process
139
+ ```
140
+
141
+ 7. **分组管理**
142
+ - 获取所有分组列表: `GET /api/groups`
143
+ - 创建新分组: `POST /api/groups`
144
+ - 重命名分组: `PATCH /api/groups/rename`
145
+ - 更新分组启用状态: `PATCH /api/groups/status`
146
+ - 删除分组: `DELETE /api/groups?path=分组路径`
147
+
148
+ ## 桌面应用
149
+
150
+ 位于 `app/desktop` 目录,使用 Electron 构建的菜单栏应用,提供以下功能:
151
+
152
+ - 启/停服务
153
+ - 复制服务地址
154
+ - 打开管理后台
155
+ - 检查更新
156
+ - 关于服务信息
157
+
158
+ ## 提示词格式
159
+
160
+ 提示词文件使用 YAML 格式,需要包含以下基本结构:
161
+
162
+ ```yaml
163
+ name: prompt-name
164
+ description: 提示词描述
165
+ messages:
166
+ - role: user
167
+ content:
168
+ text: 提示词内容,支持 {{参数名}} 格式的参数替换
169
+ arguments:
170
+ - name: 参数名
171
+ description: 参数描述
172
+ type: string|number|boolean
173
+ required: true|false
174
+ enabled: true|false # 是否启用该提示词
175
+ ```
package/README.md CHANGED
@@ -1,17 +1,19 @@
1
- # MCP Prompt Server
1
+ # Prompt Manager
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/%40becrafter%2Fprompt-manager.svg)](https://www.npmjs.com/package/@becrafter/prompt-manager)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
6
6
 
7
- 一个基于 模型上下文协议(MCP) 的 Prompt 管理服务器 。可以将分散的、静态的提示词模板,转变为一个可通过 API 调用的、可动态配置的、可复用的服务,从而更高效地管理和使用 AI 提示词。
7
+ 一个基于MCP协议的Prompt管理服务,支持HTTP流式传输、Web管理界面和桌面应用,可将静态提示词模板转换为可通过API调用的动态服务。
8
8
 
9
9
  ## 核心特性
10
10
 
11
- - 🛠️ **完整接口**:提供提示词列表、处理、帮助和版本信息等接口
11
+ - 🛠️ **MCP协议支持**:完全兼容模型上下文协议(MCP),可与各种AI客户端集成
12
+ - 🌐 **HTTP流式传输**:基于StreamableHTTP协议优化,提供稳定的长连接支持
12
13
  - 📁 **递归扫描**:自动发现子目录中的 prompt 文件
13
14
  - ⚙️ **灵活配置**:支持命令行参数和环境变量配置
14
- - 🖥️ **原生桌面壳**:内置 Electron 菜单应用,可一键启动/关闭服务,并内嵌管理后台
15
+ - 🖥️ **原生桌面壳**:内置 Electron 菜单应用,可一键启动/停止服务,并内嵌管理后台
16
+ - 📋 **管理界面**:提供Web管理界面,方便创建、编辑和管理提示词
15
17
 
16
18
  ## 快速开始
17
19
 
@@ -102,7 +104,7 @@ npm run desktop:build
102
104
 
103
105
  ### 升级机制
104
106
 
105
- 菜单中的 “检查更新” 会:
107
+ 菜单中的 "检查更新" 会:
106
108
 
107
109
  1. 读取当前运行的服务版本(`app.getPath('userData')/prompt-manager/package.json`)
108
110
  2. 对比 npm Registry 上的最新版本
@@ -110,7 +112,7 @@ npm run desktop:build
110
112
  4. 通过 `npm install --omit=dev` 在沙盒目录中重新安装依赖
111
113
  5. 保留示例 `examples/prompts` 目录(若存在),用户自定义数据保存在 `~/.prompt-manager/prompts`,无需额外迁移
112
114
 
113
- 整个过程无需系统层面的 Node/npm,真正实现“装上即用”。
115
+ 整个过程无需系统层面的 Node/npm,真正实现"装上即用"。
114
116
 
115
117
  ## 配置选项
116
118
 
@@ -130,117 +132,79 @@ npm run desktop:build
130
132
  | `MCP_SERVER_NAME` | 服务器名称 | `prompt-manager` |
131
133
  | `SERVER_PORT` | 服务器端口 | `5621` |
132
134
  | `PROMPTS_DIR` | Prompts目录路径 | `~/.prompt-manager/prompts` |
133
- | `MCP_SERVER_VERSION` | 服务器版本 | `0.0.16` |
135
+ | `MCP_SERVER_VERSION` | 服务器版本 | `0.0.19` |
134
136
  | `LOG_LEVEL` | 日志级别 (error, warn, info, debug) | `info` |
135
137
  | `MAX_PROMPTS` | 最大prompt数量限制 | `100` |
136
138
  | `RECURSIVE_SCAN` | 是否启用递归扫描子目录 | `true` |
139
+ | `ADMIN_ENABLE` | 是否启用管理界面 | `true` |
140
+ | `ADMIN_PATH` | 管理界面路径 | `/admin` |
141
+ | `ADMIN_USERNAME` | 管理员用户名 | `admin` |
142
+ | `ADMIN_PASSWORD` | 管理员密码 | `admin` |
137
143
 
138
144
  > 安装或首次运行时,会自动将 `env.example` 内容写入 `~/.prompt-manager/.env`(如果该文件尚未存在),方便在系统范围内共享配置。
139
145
 
140
146
  ## API 接口
141
147
 
142
- ### 获取服务器信息
148
+ ### MCP协议接口
143
149
 
144
- ```
145
- GET /
146
- ```
150
+ 服务器实现了MCP协议,支持以下工具:
147
151
 
148
- 返回服务器基本信息和可用接口列表。
152
+ - `search_prompts`: 搜索提示词
153
+ - `get_prompt`: 获取指定提示词的完整内容
154
+ - `reload_prompts`: 重新加载所有提示词
149
155
 
150
- ### 获取提示词列表
156
+ ### Web管理接口
157
+
158
+ #### 获取提示词列表
151
159
 
152
160
  ```
153
- GET /prompts
161
+ GET /prompts[?search=关键词]
154
162
  ```
155
163
 
156
- 返回所有可用的提示词列表。
164
+ 返回所有可用的提示词列表,支持搜索功能。
157
165
 
158
- ### 获取单个提示词详情
166
+ #### 获取单个提示词详情
159
167
 
160
168
  ```
161
- GET /prompts/:name
169
+ GET /api/prompts/:name[?path=文件路径]
162
170
  ```
163
171
 
164
172
  返回指定名称的提示词详细信息。
165
173
 
166
- ### 创建新提示词
174
+ #### 创建/更新提示词
167
175
 
168
176
  ```
169
- POST /prompts
177
+ POST /api/prompts
170
178
  ```
171
179
 
172
- 创建新的提示词文件。
180
+ 创建或更新提示词文件。
173
181
 
174
182
  请求体示例:
175
183
  ```json
176
184
  {
177
185
  "name": "my-prompt",
178
- "description": "我的自定义提示词",
179
- "messages": [
180
- {
181
- "role": "user",
182
- "content": {
183
- "text": "这是一个{{参数}}示例"
184
- }
185
- }
186
- ],
187
- "arguments": [
188
- {
189
- "name": "参数",
190
- "description": "示例参数",
191
- "type": "string",
192
- "required": true
193
- }
194
- ]
186
+ "group": "default",
187
+ "yaml": "name: my-prompt\ndescription: 我的自定义提示词\nmessages:\n - role: user\n content:\n text: 这是一个{{参数}}示例\n"
195
188
  }
196
189
  ```
197
190
 
198
- ### 更新提示词
191
+ #### 删除提示词
199
192
 
200
193
  ```
201
- PUT /prompts/:name
194
+ DELETE /api/prompts/:name[?path=文件路径]
202
195
  ```
203
196
 
204
- 更新现有的提示词文件。修改前会自动创建备份。
205
-
206
- 请求体格式与创建相同。
197
+ 删除指定的提示词文件。
207
198
 
208
- ### 删除提示词
199
+ #### 切换提示词启用状态
209
200
 
210
201
  ```
211
- DELETE /prompts/:name
202
+ POST /api/prompts/:name/toggle[?path=文件路径]
212
203
  ```
213
204
 
214
- 删除指定的提示词文件。删除前会自动创建备份。
205
+ 切换提示词的启用/禁用状态。
215
206
 
216
- ### 验证YAML格式
217
-
218
- ```
219
- POST /prompts/validate
220
- ```
221
-
222
- 验证提示词YAML格式是否正确。
223
-
224
- 请求体示例:
225
- ```yaml
226
- yaml: |
227
- name: test-prompt
228
- description: 测试提示词
229
- messages:
230
- - role: user
231
- content:
232
- text: 测试内容
233
- ```
234
-
235
- ### 获取备份列表
236
-
237
- ```
238
- GET /backups
239
- ```
240
-
241
- 获取所有提示词备份文件列表。
242
-
243
- ### 处理提示词
207
+ #### 处理提示词
244
208
 
245
209
  ```
246
210
  POST /process
@@ -259,21 +223,37 @@ POST /process
259
223
  }
260
224
  ```
261
225
 
262
- ### 获取帮助信息
226
+ #### 分组管理
227
+
228
+ ```
229
+ GET /api/groups
230
+ ```
231
+
232
+ 获取所有分组列表。
263
233
 
264
234
  ```
265
- GET /help
235
+ POST /api/groups
266
236
  ```
267
237
 
268
- 返回服务器使用帮助信息。
238
+ 创建新分组。
239
+
240
+ ```
241
+ PATCH /api/groups/rename
242
+ ```
243
+
244
+ 重命名分组。
245
+
246
+ ```
247
+ PATCH /api/groups/status
248
+ ```
269
249
 
270
- ### 获取版本信息
250
+ 更新分组启用状态。
271
251
 
272
252
  ```
273
- GET /version
253
+ DELETE /api/groups?path=分组路径
274
254
  ```
275
255
 
276
- 返回服务器版本信息。
256
+ 删除分组(仅当分组为空时)。
277
257
 
278
258
  ## 提示词格式
279
259
 
@@ -286,6 +266,12 @@ messages:
286
266
  - role: user
287
267
  content:
288
268
  text: 提示词内容,支持 {{参数名}} 格式的参数替换
269
+ arguments:
270
+ - name: 参数名
271
+ description: 参数描述
272
+ type: string|number|boolean
273
+ required: true|false
274
+ enabled: true|false # 是否启用该提示词
289
275
  ```
290
276
 
291
277
  ## 开发
@@ -323,4 +309,4 @@ npm run dev
323
309
 
324
310
  ## 许可证
325
311
 
326
- MIT License
312
+ MIT License
@@ -0,0 +1,147 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>关于 Prompt Manager</title>
6
+ <style>
7
+ /* 支持纵向滚动但隐藏滚动条 */
8
+ body {
9
+ margin: 0;
10
+ padding: 0;
11
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
12
+ background: linear-gradient(135deg, #ffffff 0%, #ffffff 100%);
13
+ color: #333;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ justify-content: center;
19
+ /* 支持纵向滚动 */
20
+ overflow-x: hidden;
21
+ overflow-y: auto;
22
+ }
23
+
24
+ /* 针对WebKit浏览器隐藏滚动条 */
25
+ body::-webkit-scrollbar {
26
+ display: none;
27
+ }
28
+
29
+ /* 针对Firefox浏览器隐藏滚动条 */
30
+ body {
31
+ scrollbar-width: none;
32
+ -ms-overflow-style: none;
33
+ }
34
+
35
+ .container {
36
+ background: white;
37
+ border-radius: 12px;
38
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
39
+ padding: 30px;
40
+ width: 320px;
41
+ text-align: center;
42
+ transition: transform 0.3s ease;
43
+ /* 防止容器内容溢出 */
44
+ max-width: 100%;
45
+ }
46
+
47
+ .container:hover {
48
+ transform: translateY(-2px);
49
+ }
50
+
51
+ .logo {
52
+ width: 64px;
53
+ height: 64px;
54
+ /* background: linear-gradient(135deg, #dcdbdb 0%, #dcdbdb 100%); */
55
+ border-radius: 6px;
56
+ border: 1px solid #ccc;
57
+ margin: 0 auto 15px;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ font-size: 28px;
62
+ color: white;
63
+ font-weight: bold;
64
+ }
65
+
66
+ .version-info {
67
+ background: #f8f9fa;
68
+ border-radius: 8px;
69
+ padding: 15px;
70
+ margin-bottom: 20px;
71
+ text-align: left;
72
+ }
73
+
74
+ .version-item {
75
+ display: flex;
76
+ justify-content: space-between;
77
+ margin-bottom: 8px;
78
+ font-size: 14px;
79
+ }
80
+
81
+ .version-item:last-child {
82
+ margin-bottom: 0;
83
+ }
84
+
85
+ .label {
86
+ color: #7f8c8d;
87
+ font-weight: 500;
88
+ }
89
+
90
+ .value {
91
+ color: #2c3e50;
92
+ font-weight: 500;
93
+ }
94
+
95
+ .notification {
96
+ background: #e3f2fd;
97
+ border-left: 4px solid #2196f3;
98
+ padding: 12px;
99
+ border-radius: 0 8px 8px 0;
100
+ margin: 15px 0;
101
+ text-align: left;
102
+ }
103
+
104
+ .notification-title {
105
+ font-weight: 600;
106
+ color: #1976d2;
107
+ margin: 0 0 5px 0;
108
+ font-size: 13px;
109
+ }
110
+
111
+ .notification-content {
112
+ font-size: 12px;
113
+ color: #555;
114
+ margin: 0;
115
+ }
116
+ </style>
117
+ </head>
118
+ <body>
119
+ <div class="container">
120
+ <div class="logo">
121
+ <img src="data:image/png;base64,{{logoData}}" alt="Prompt Server Logo" width="64" height="64">
122
+ </div>
123
+
124
+ <div class="version-info">
125
+ <div class="version-item">
126
+ <span class="label">服务版本:</span>
127
+ <span class="value">{{version}}</span>
128
+ </div>
129
+ <div class="version-item">
130
+ <span class="label">Electron:</span>
131
+ <span class="value">{{electronVersion}}</span>
132
+ </div>
133
+ <div class="version-item">
134
+ <span class="label">Node.js:</span>
135
+ <span class="value">{{nodeVersion}}</span>
136
+ </div>
137
+ </div>
138
+
139
+ {{#if debugLogEnabled}}
140
+ <div class="notification">
141
+ <div class="notification-title">调试日志已开启</div>
142
+ <div class="notification-content">日志文件路径: {{logFilePath}}</div>
143
+ </div>
144
+ {{/if}}
145
+ </div>
146
+ </body>
147
+ </html>