基于对最新源码的遍历分析,目前在 chat.ts、chat-enhanced.ts 以及 cli.ts 中存在3 处分叉的硬编码系统提示词,这导致维护困难、差异难控。为了实现统一管理,我们可以在后端的 web.ts 中添加一个 GET /api/systemprompt 和 PUT /api/systemprompt 服务,将提示词存到 secrets.enc 的固定字段中。这样,前端设置面板就能直接读写真实的后端数据源,实现"增、删、改、查"。
GET /api/systemprompt 端点,从 secrets.enc 中提取用户的系统提示词,若无则返回默认值。PUT /api/systemprompt 端点,接收前端传过来的文本,加密保存到 secrets.enc 中。PUT /api/systemprompt 传递空值或特定标志,将映射重置为默认模板。PUT 把值设为 ""。chat.ts、chat-enhanced.ts、cli.ts)在构建提示词时,统一调用 getSystemPrompt(),该函数内部读取 secrets.enc,不再各自持有定义。GET /api/systemprompt 获得提示词并填入文本框。PUT /api/systemprompt 把新内容传到后端。PUT /api/systemprompt 写入空字符串,然后重新拉取默认值并填入。localStorage,确保用户对提示词的调整可以立即反映到下一次对话中。[
{
"id": 1,
"tool": "file_read",
"args": { "path": "src/web.ts", "offset": 1, "limit": 30 },
"description": "读取 web.ts 头部,确认现有 API 路由结构",
"expected_outcome": "获得当前路由定义区域的位置"
},
{
"id": 2,
"tool": "file_edit",
"args": {
"path": "src/web.ts",
"old_text": " // 模型列表\n if (path === '/api/models' && method === 'GET') {",
"new_text": " // 系统提示词 - 获取\n if (path === '/api/systemprompt' && method === 'GET') {\n const saved = loadSecrets().systemPrompt || '';\n return json({ content: saved });\n }\n\n // 系统提示词 - 保存\n if (path === '/api/systemprompt' && (method === 'PUT' || method === 'POST')) {\n const { content } = await req.json();\n const current = loadSecrets();\n current.systemPrompt = content || '';\n saveSecrets(current);\n return json({ ok: true });\n }\n\n // 模型列表\n if (path === '/api/models' && method === 'GET') {"
},
"description": "新增 GET/PUT /api/systemprompt 端点实现提示词的存储与读取",
"expected_outcome": "提示词可独立于代码被持久化保存"
},
{
"id": 3,
"tool": "bash_run",
"args": {
"command": "cd /home/administrator/CmdCode-V0.5 && bun run src/cli.ts --version",
"timeout": 10
},
"description": "验证后端新增端点后项目仍可编译启动",
"expected_outcome": "输出 CmdCode V0.5.0"
},
{
"id": 4,
"tool": "bash_run",
"args": {
"command": "sleep 2 && curl -s http://localhost:3010/api/systemprompt",
"timeout": 8
},
"description": "使用 curl 测试 GET 端点是否能返回默认空提示词",
"expected_outcome": "返回 {\"content\":\"\"} "
},
{
"id": 5,
"tool": "bash_run",
"args": {
"command": "curl -s -X PUT http://localhost:3010/api/systemprompt -H 'Content-Type: application/json' -d '{\"content\":\"test123\"}'",
"timeout": 8
},
"description": "测试 PUT 端点保存提示词",
"expected_outcome": "返回 {\"ok\":true}"
},
{
"id": 6,
"tool": "bash_run",
"args": {
"command": "curl -s http://localhost:3010/api/systemprompt",
"timeout": 8
},
"description": "再次 GET 验证提示词是否已被持久化",
"expected_outcome": "返回 {\"content\":\"test123\"} "
},
{
"id": 7,
"tool": "bash_run",
"args": {
"command": "curl -s -X PUT http://localhost:3010/api/systemprompt -H 'Content-Type: application/json' -d '{\"content\":\"\"}'",
"timeout": 8
},
"description": "重置提示词为空",
"expected_outcome": "返回 {\"ok\":true}"
}
]
执行提示词保存/读取的前端 UI 修改可以放在下一阶段。上述计划完成后,你的所有后端引擎(chat.ts, chat-enhanced.ts, cli.ts)就可以统一调用 loadSecrets().systemPrompt 作为自己的系统提示词了。