chaimi-keep-mcp 3.3.0-beta.8 → 3.3.2-beta.0

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.
package/README.md CHANGED
@@ -89,6 +89,12 @@ export MCP_PROMPT_URL="你的Prompt服务地址"
89
89
 
90
90
  ## Changelog
91
91
 
92
+ ### v3.3.2-beta.0 (2026-04-26)
93
+ - **修复** agent-name.json 和 device-code.json 文件写入 0 字节问题
94
+ - 将异步 `fs.writeFile()` 改为同步 `fs.writeFileSync()`
95
+ - 根本原因:授权成功后从 `process.exit(0)` 改为 `return`,导致异步写入未完成
96
+ - 使用同步写入确保文件立即写入完成
97
+
92
98
  ### v3.1.47-beta.5 (2026-04-22)
93
99
  - **修复** 输入长度限制 - 添加硬性长度检查,防止超大字符串攻击
94
100
  - **修复** 错误信息泄露 - 生产环境只显示友好提示,不暴露内部错误
@@ -148,6 +154,12 @@ AI 会自动调用 `save_income` 工具记录收入。
148
154
 
149
155
  ## 更新日志
150
156
 
157
+ ### v3.3.2-beta.0 (2026-04-26)
158
+ - **修复** agent-name.json 和 device-code.json 文件写入 0 字节问题
159
+ - 将异步 `fs.writeFile()` 改为同步 `fs.writeFileSync()`
160
+ - 根本原因:授权成功后从 `process.exit(0)` 改为 `return`,导致异步写入未完成
161
+ - 使用同步写入确保文件立即写入完成
162
+
151
163
  ### v3.1.49-beta.2 (2026-04-24)
152
164
  - **新增** period 参数支持
153
165
  - getStatistics: 支持 this_week/last_week/this_month/last_month 周期筛选
package/SKILL.md CHANGED
@@ -83,61 +83,83 @@ chaimi-keep-mcp ⭐ 本Skill
83
83
 
84
84
  根据用户意图,快速匹配工具和参考文档:
85
85
 
86
- | 用户意图 | 关键词示例 | 推荐工具 | 参考文档 | 回复模板 |
87
- |---------|-----------|---------|---------|---------|
88
- | **文字记账** | "午餐35元" | save_expense | - | 标准成功模板 |
89
- | **收入记账** | "工资5000" | save_income | - | 标准成功模板 |
90
- | **小票记账** | "小票识别" | save_receipt | - | 高金额模板 |
91
- | **查询记录** | "这周花了多少" | get_expenses | api-reference.md | 查询结果模板 |
92
- | **消费统计** | "月度统计" | get_statistics | api-reference.md | 统计分析模板 |
93
- | **智能洞察** | "分析消费习惯" | get_insights | advanced-features.md | 洞察分析模板 |
94
- | **深度分析** | "详细分析" | export_data | advanced-features.md | 分析模板 |
95
- | **授权问题** | "无法记账" | - | troubleshooting.md | 错误提示模板 |
96
- | **回复格式** | "回复格式" | - | response-templates.md | - |
86
+ | 用户意图 | 关键词示例 | 前置步骤 | 推荐工具 | 参考文档 | 回复模板 |
87
+ |---------|-----------|---------|---------|---------|---------|
88
+ | **文字记账** | "午餐35元" | get_text_parse_prompt → AI解析 | save_expense | - | 标准成功模板 |
89
+ | **收入记账** | "工资5000" | get_text_parse_prompt → AI解析 | save_income | - | 标准成功模板 |
90
+ | **小票记账** | "小票识别" | **get_parse_prompt → AI解析** ⭐ | save_receipt | - | 高金额模板 |
91
+ | **查询记录** | "这周花了多少" | - | get_expenses | api-reference.md | 查询结果模板 |
92
+ | **消费统计** | "月度统计" | - | get_statistics | api-reference.md | 统计分析模板 |
93
+ | **智能洞察** | "分析消费习惯" | - | get_insights | advanced-features.md | 洞察分析模板 |
94
+ | **深度分析** | "详细分析" | - | export_data | advanced-features.md | 分析模板 |
95
+ | **授权问题** | "无法记账" | - | - | troubleshooting.md | 错误提示模板 |
96
+ | **回复格式** | "回复格式" | - | - | response-templates.md | - |
97
97
 
98
98
  ---
99
99
 
100
100
  ## 五、工具速查表
101
101
 
102
102
  **设计原则:** Agent一眼看到所有工具,按功能分类
103
- - **记账工具**:直接调用,无需查看详细文档
103
+ - **记账工具**:⚠️ 小票记账必须先调用 `get_parse_prompt`,不可跳过!
104
104
  - **查询分析工具**:详细参数见 api-reference.md
105
105
 
106
- | 分类 | 工具名 | 功能一句话 | 典型场景 |
107
- |:-----|:-------|:-----------|:---------|
108
- | **记账** | save_expense | 支出记账 | "午餐35元" |
109
- | | save_income | 收入记账 | "工资5000" |
110
- | | save_receipt | 小票图片记账 | 上传小票照片 |
111
- | **查询** | get_expenses | 查询消费记录 | "这周花了多少" |
112
- | | get_statistics | 消费统计分析 | "月度统计" |
113
- | | get_receipt_list | 查询小票列表 | "查看小票记录" |
114
- | **分析** | get_insights | AI消费洞察 | "分析消费习惯" |
115
- | | export_data | 导出完整数据 | 深度分析 |
116
- | **辅助** | get_skill | 【必须】获取Skill文档 | 记账前调用 |
117
- | | get_text_parse_prompt | 获取文字解析模板 | 文字记账前 |
118
- | | get_parse_prompt | 获取小票解析模板 | 小票记账前 |
119
- | | submit_feedback | 提交反馈 | 问题反馈 |
106
+ | 分类 | 工具名 | 前置要求 | 功能一句话 | 典型场景 |
107
+ |:-----|:-------|:---------|:-----------|:---------|
108
+ | **记账** | save_expense | 先 get_text_parse_prompt | 支出记账 | "午餐35元" |
109
+ | | save_income | 先 get_text_parse_prompt | 收入记账 | "工资5000" |
110
+ | | save_receipt | **先 get_parse_prompt** ⭐ | 小票图片记账 | 上传小票照片 |
111
+ | **查询** | get_expenses | - | 查询消费记录 | "这周花了多少" |
112
+ | | get_statistics | - | 消费统计分析 | "月度统计" |
113
+ | | get_receipt_list | - | 查询小票列表 | "查看小票记录" |
114
+ | **分析** | get_insights | - | AI消费洞察 | "分析消费习惯" |
115
+ | | export_data | - | 导出完整数据 | 深度分析 |
116
+ | **辅助** | get_skill | - | 【必须】获取Skill文档 | 记账前调用 |
117
+ | | get_text_parse_prompt | - | 获取文字解析模板 | 文字记账前置 |
118
+ | | get_parse_prompt | - | **获取小票解析模板** | 小票记账前置 ⭐ |
119
+ | | submit_feedback | - | 提交反馈 | 问题反馈 |
120
+
121
+ **⚠️ 重要**:save_receipt 必须前置调用 get_parse_prompt,否则会导致 weight 和 marketPrice 计算错误!
120
122
 
121
123
  ---
122
124
 
123
125
  ## 六、快速开始
124
126
 
125
- ### 3步极简记账流程
127
+ ### 记账流程(按类型区分)
128
+
129
+ #### A. 文字记账
130
+
131
+ ```
132
+ 第1步:获取文字解析模板
133
+ ↓ 调用 get_text_parse_prompt 获取Prompt
134
+ 第2步:AI解析文字
135
+ ↓ 使用Prompt + 用户输入调用AI
136
+ 第3步:保存数据
137
+ ↓ 调用 save_expense 或 save_income
138
+ ↓ 返回美学回复
139
+ ```
140
+
141
+ #### B. 小票图片记账(复杂)
126
142
 
127
143
  ```
128
- 第1步:状态自检
129
- 检查依赖历史习惯
130
- 第2步:获取Skill
131
- ↓ 调用 get_skill 获取最新规范
132
- 3步:执行记账
133
- 调用对应工具(save_expense/income/receipt)
144
+ 第1步:获取小票解析模板 ⭐关键
145
+ 调用 get_parse_prompt(type: 'parseReceipt')
146
+ ↓ 获取Prompt模板和字段规范
147
+
148
+ 2步:AI解析图片 ⭐关键
149
+ 使用Prompt模板 + 小票图片调用AI
150
+ ↓ 获取解析后的商品列表(items)
151
+
152
+ 第3步:保存数据
153
+ ↓ 调用 save_receipt(items: 步骤2的结果)
134
154
  ↓ 返回美学回复
135
155
  ```
136
156
 
157
+ **重要提示**:小票记账必须执行第1、2步!跳过会导致数据格式错误!
158
+
137
159
  ### 首次使用必做
138
160
 
139
- 1. **完成授权**运行 `./scripts/auth-flow.sh`
140
- 2. **验证安装**运行 `./scripts/verify-setup.sh`
161
+ 1. **安装 MCP Server** 参考 README.md 安装指引
162
+ 2. **完成授权**首次使用时会自动显示授权码,在"柴米AI记账"小程序中输入即可完成授权
141
163
  3. **开始记账** → "午餐35元"
142
164
 
143
165
  ---
@@ -186,14 +208,7 @@ chaimi-keep-mcp ⭐ 本Skill
186
208
  ───────────────
187
209
  ```
188
210
 
189
- ### 7.3 极简模板(连续记账)
190
-
191
- ```markdown
192
- ✅ 已记录:{商品名} ¥{金额} · {分类}
193
- {正能量祝福语}
194
- ```
195
-
196
- ### 7.4 高金额模板(>1000元)
211
+ ### 7.3 高金额模板(>1000元)
197
212
 
198
213
  ```markdown
199
214
  ⚠️ 大额消费确认
@@ -213,7 +228,7 @@ chaimi-keep-mcp ⭐ 本Skill
213
228
  ───────────────
214
229
  ```
215
230
 
216
- ### 7.5 变量说明
231
+ ### 7.4 变量说明
217
232
 
218
233
  | 变量 | 说明 | 示例 |
219
234
  |:-----|:-----|:-----|
package/oauth.js CHANGED
@@ -497,7 +497,8 @@ class FileTokenStorage extends TokenStorage {
497
497
  agentName: agentName || '柴米AI助手',
498
498
  updatedAt: new Date().toISOString()
499
499
  };
500
- await this.fs.writeFile(agentNamePath, JSON.stringify(data, null, 2), 'utf8');
500
+ // 使用同步写入,确保立即完成(避免进程继续运行时文件未写入完成)
501
+ require('fs').writeFileSync(agentNamePath, JSON.stringify(data, null, 2), { mode: 0o600 });
501
502
  console.error('✅ Agent 名称已保存:', agentNamePath);
502
503
  } catch (err) {
503
504
  console.error('❌ 保存 Agent 名称失败:', err.message);
@@ -524,7 +525,8 @@ class FileTokenStorage extends TokenStorage {
524
525
  deviceCode,
525
526
  updatedAt: new Date().toISOString()
526
527
  };
527
- await this.fs.writeFile(deviceCodePath, JSON.stringify(data, null, 2), 'utf8');
528
+ // 使用同步写入,确保立即完成(避免进程继续运行时文件未写入完成)
529
+ require('fs').writeFileSync(deviceCodePath, JSON.stringify(data, null, 2), { mode: 0o600 });
528
530
  } catch (err) {
529
531
  // 忽略错误
530
532
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaimi-keep-mcp",
3
- "version": "3.3.0-beta.8",
3
+ "version": "3.3.2-beta.0",
4
4
  "description": "柴米记账 MCP Server - 支持 Claude、Cursor、OpenClaw、WorkBuddy 等 AI 工具直接记账",
5
5
  "main": "server.js",
6
6
  "bin": {
package/server.js CHANGED
@@ -998,10 +998,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
998
998
  // 【新增】获取 Agent 名称
999
999
  const agentName = await getAgentName();
1000
1000
 
1001
- // 按 SKILL 规范格式:新的回复模板
1001
+ // 按 SKILL 规范格式:华丽版回复模板
1002
1002
  const displayStoreText = displayStore ? `【${displayStore}】` : '';
1003
1003
  const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
1004
- userMessage = `✅ 「${agentName}」已帮您录入「柴米AI记账」\n · 商品/店名:${displayName}${displayStoreText} 💰¥${displayAmount}\n · 收支类型: 支出\n · 分类:${result.data?.categoryName || displayCategory}\n · 时间:${dateStr}\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n-------------\nchaimi-keep-mcp: v${MCP_VERSION}`;
1004
+ userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n📦 商品/店名:${displayName}${displayStoreText}\n💰 金额:¥${displayAmount}\n📊 收支类型:支出\n🏷️ 分类:${result.data?.categoryName || displayCategory}\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
1005
1005
 
1006
1006
  if (!processedArgs.agentType || !processedArgs.apiProvider) {
1007
1007
  userMessage += '\n\n💡 提示:传递agentType和apiProvider参数可解锁小程序记录来源统计功能,示例:agentType="openclaw", apiProvider="doubao"';
@@ -1243,9 +1243,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1243
1243
  // 【新增】获取 Agent 名称
1244
1244
  const agentName = await getAgentName();
1245
1245
 
1246
- // 按 SKILL 规范格式:新的回复模板
1246
+ // 按 SKILL 规范格式:华丽版回复模板
1247
1247
  const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
1248
- userMessage = `✅ 「${agentName}」已帮您录入「柴米AI记账」\n · 商品/店名:${storeName} 💰¥${totalAmount}\n · 收支类型: 支出\n · 分类:${result.data?.storeCategory || category}\n · 商品数量:${itemCount}件\n · 时间:${dateStr}\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n-------------\nchaimi-keep-mcp: v${MCP_VERSION}`;
1248
+ userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n🏪 商家:${storeName}\n💰 金额:¥${totalAmount}\n📊 收支类型:支出\n🏷️ 分类:${result.data?.storeCategory || category}\n📦 商品数量:${itemCount}件\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ ${friendlyEnding}${insightsText}${achievementsText}\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
1249
1249
 
1250
1250
  if (!processedArgs.agentType || !processedArgs.apiProvider) {
1251
1251
  userMessage += '\n\n💡 提示:传递agentType和apiProvider参数可解锁小程序记录来源统计功能,示例:agentType="openclaw", apiProvider="doubao"';
@@ -1473,9 +1473,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
1473
1473
  // 【新增】获取 Agent 名称
1474
1474
  const agentName = await getAgentName();
1475
1475
 
1476
- // 按 SKILL 规范格式:新的回复模板
1476
+ // 按 SKILL 规范格式:华丽版回复模板
1477
1477
  const dateStr = result.data?.date ? new Date(result.data.date).toLocaleDateString('zh-CN') : new Date().toLocaleDateString('zh-CN');
1478
- userMessage = `✅ 「${agentName}」已帮您录入「柴米AI记账」\n · 商品/店名:${displayName}${displayStoreText} 💰¥${displayAmount}\n · 收支类型: 收入\n · 分类:${result.data?.categoryName || displayCategory}\n · 时间:${dateStr}\n✅ 入账顺利!💰\n-------------\nchaimi-keep-mcp: v${MCP_VERSION}`;
1478
+ userMessage = `═══════════════════════════════════════\n✅ 「${agentName}」已帮您录入「柴米AI记账」\n═══════════════════════════════════════\n💰 金额:¥${displayAmount}\n📊 收支类型:收入\n📦 来源:${displayName}${displayStoreText}\n🏷️ 分类:${result.data?.categoryName || displayCategory}\n📅 时间:${dateStr}\n═══════════════════════════════════════\n✅ 入账顺利!💰\n═══════════════════════════════════════\nchaimi-keep-mcp: v${MCP_VERSION}`;
1479
1479
  }
1480
1480
  break;
1481
1481
  }