xiaokui-mcp 1.0.2 → 1.1.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 +135 -27
- package/dist/index.js +208 -116
- package/dist/index.js.map +1 -1
- package/dist/skills-manager.d.ts +82 -0
- package/dist/skills-manager.d.ts.map +1 -0
- package/dist/skills-manager.js +254 -0
- package/dist/skills-manager.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,27 +1,47 @@
|
|
|
1
|
-
# 🌻 小葵 MCP 服务器
|
|
1
|
+
# 🌻 小葵 MCP 服务器 v1.1.0
|
|
2
2
|
|
|
3
|
-
小葵完全体的 MCP
|
|
3
|
+
小葵完全体的 MCP 服务器实现,支持跨设备记忆同步和技能同步。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## ✨ 功能特性
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- `
|
|
9
|
-
- `
|
|
10
|
-
- `
|
|
7
|
+
### 核心功能
|
|
8
|
+
- `backup` - 备份记忆、配置和技能到本地/云端
|
|
9
|
+
- `init` - 新电脑初始化恢复(支持技能合并)
|
|
10
|
+
- `sync` - 同步云端更新(智能合并冲突)
|
|
11
|
+
- `status` - 查看备份状态和技能同步信息
|
|
12
|
+
- `skills-list` - 列出所有技能及其同步状态
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
### v1.1.0 新增特性 🎉
|
|
15
|
+
- ✅ **技能同步** - 自动备份和恢复 Claude Code 技能
|
|
16
|
+
- ✅ **技能持久化** - 保留技能的学习数据(assets, references, scripts)
|
|
17
|
+
- ✅ **智能合并** - 多设备技能冲突检测与解决策略
|
|
18
|
+
- ✅ **冲突策略** - 支持 ask/local/remote/newest 多种合并策略
|
|
19
|
+
|
|
20
|
+
## 📦 安装
|
|
21
|
+
|
|
22
|
+
### 方式1:通过 npx 使用(推荐)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 无需安装,直接使用
|
|
26
|
+
npx xiaokui-mcp@latest backup
|
|
27
|
+
npx xiaokui-mcp@latest sync
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 方式2:全局安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install -g xiaokui-mcp
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 方式3:本地安装
|
|
13
37
|
|
|
14
38
|
```bash
|
|
15
|
-
# 方式1:本地安装
|
|
16
39
|
cd ~/.claude/xiaokui-mcp
|
|
17
40
|
npm install
|
|
18
41
|
npm run build
|
|
19
|
-
|
|
20
|
-
# 方式2:全局安装(推荐)
|
|
21
|
-
npm install -g xiaokui-mcp
|
|
22
42
|
```
|
|
23
43
|
|
|
24
|
-
## 配置
|
|
44
|
+
## 🔧 配置
|
|
25
45
|
|
|
26
46
|
在 Claude Code 的 `.mcp.json` 中添加:
|
|
27
47
|
|
|
@@ -29,19 +49,19 @@ npm install -g xiaokui-mcp
|
|
|
29
49
|
{
|
|
30
50
|
"mcpServers": {
|
|
31
51
|
"xiaokui": {
|
|
32
|
-
"command": "
|
|
33
|
-
"args": ["
|
|
52
|
+
"command": "npx",
|
|
53
|
+
"args": ["xiaokui-mcp@latest"]
|
|
34
54
|
}
|
|
35
55
|
}
|
|
36
56
|
}
|
|
37
57
|
```
|
|
38
58
|
|
|
39
|
-
## 使用方法
|
|
59
|
+
## 📖 使用方法
|
|
40
60
|
|
|
41
61
|
### 备份当前配置
|
|
42
62
|
|
|
43
|
-
```
|
|
44
|
-
|
|
63
|
+
```bash
|
|
64
|
+
npx xiaokui-mcp backup
|
|
45
65
|
```
|
|
46
66
|
|
|
47
67
|
输出示例:
|
|
@@ -51,38 +71,126 @@ npm install -g xiaokui-mcp
|
|
|
51
71
|
📋 备份信息:
|
|
52
72
|
ID: xk-8a4f7c2e
|
|
53
73
|
密码: Xp9Kj3LmNw8QvR5T
|
|
74
|
+
大小: 0.52 MB
|
|
75
|
+
技能: 7 个
|
|
76
|
+
|
|
77
|
+
☁️ 云端备份: https://gist.github.com/...
|
|
54
78
|
```
|
|
55
79
|
|
|
56
80
|
### 新电脑初始化
|
|
57
81
|
|
|
82
|
+
```bash
|
|
83
|
+
npx xiaokui-mcp init --id=xk-8a4f7c2e --password=Xp9Kj3LmNw8QvR5T
|
|
58
84
|
```
|
|
59
|
-
|
|
85
|
+
|
|
86
|
+
可选参数:
|
|
87
|
+
- `--conflictStrategy=ask` - 遇到技能冲突时询问(默认)
|
|
88
|
+
- `--conflictStrategy=local` - 本地版本优先
|
|
89
|
+
- `--conflictStrategy=remote` - 云端版本优先
|
|
90
|
+
- `--conflictStrategy=newest` - 最新修改优先
|
|
91
|
+
|
|
92
|
+
### 同步云端更新
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx xiaokui-mcp sync
|
|
60
96
|
```
|
|
61
97
|
|
|
62
98
|
### 查看状态
|
|
63
99
|
|
|
100
|
+
```bash
|
|
101
|
+
npx xiaokui-mcp status
|
|
64
102
|
```
|
|
65
|
-
|
|
103
|
+
|
|
104
|
+
输出示例:
|
|
66
105
|
```
|
|
106
|
+
📊 小葵状态:
|
|
67
107
|
|
|
68
|
-
|
|
108
|
+
凭据:
|
|
109
|
+
ID: xk-8a4f7c2e
|
|
110
|
+
密码: 已设置 (隐藏)
|
|
111
|
+
|
|
112
|
+
技能状态:
|
|
113
|
+
本地技能: 7 个
|
|
114
|
+
• ai-image-generation (2026/3/25)
|
|
115
|
+
• error-handling-patterns (2026/3/25)
|
|
116
|
+
上次同步: 2026/3/25 15:27:11
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 查看技能列表
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
npx xiaokui-mcp skills-list
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 🔄 技能同步说明
|
|
126
|
+
|
|
127
|
+
### 同步策略
|
|
128
|
+
|
|
129
|
+
| 策略 | 说明 |
|
|
130
|
+
|------|------|
|
|
131
|
+
| `ask` | 遇到冲突时询问用户选择(默认) |
|
|
132
|
+
| `local` | 保留本地版本,跳过云端版本 |
|
|
133
|
+
| `remote` | 使用云端版本覆盖本地版本 |
|
|
134
|
+
| `newest` | 使用修改时间最新的版本 |
|
|
135
|
+
|
|
136
|
+
### 冲突场景
|
|
137
|
+
|
|
138
|
+
当多台电脑有同名技能但内容不同时,系统会检测到冲突并提供选择:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
检测到 2 个技能冲突:
|
|
142
|
+
- self-learning: 本地修改于 2026-03-20,云端修改于 2026-03-25
|
|
143
|
+
- proactive-agent: 本地修改于 2026-03-18,云端修改于 2026-03-24
|
|
144
|
+
|
|
145
|
+
默认使用云端版本(可通过 --conflictStrategy 参数调整)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 技能元数据
|
|
149
|
+
|
|
150
|
+
每个技能同步时会记录:
|
|
151
|
+
- 技能名称和哈希值(用于检测变化)
|
|
152
|
+
- 修改时间
|
|
153
|
+
- 文件大小
|
|
154
|
+
- 来源设备
|
|
155
|
+
|
|
156
|
+
元数据保存在 `~/.claude/skills/.xiaokui-skills-meta.json`
|
|
157
|
+
|
|
158
|
+
## 🔐 凭据管理
|
|
69
159
|
|
|
70
160
|
凭据自动保存到 `~/.claude/.xiaokui/credentials.json`,后续操作无需重复输入。
|
|
71
161
|
|
|
72
|
-
## 环境变量
|
|
162
|
+
## 🔧 环境变量
|
|
73
163
|
|
|
74
164
|
初始化后自动设置:
|
|
75
|
-
- `XIAOKUI_MEMORY_ROOT`
|
|
76
|
-
- `CLAUDE_MEMORY_PATH`
|
|
77
|
-
- `MCP_MEMORY_DATA_DIR`
|
|
78
|
-
- `ENGRAM_DATA_DIR`
|
|
165
|
+
- `XIAOKUI_MEMORY_ROOT` - 记忆根目录
|
|
166
|
+
- `CLAUDE_MEMORY_PATH` - Claude 记忆路径
|
|
167
|
+
- `MCP_MEMORY_DATA_DIR` - MCP 数据目录
|
|
168
|
+
- `ENGRAM_DATA_DIR` - Engram 数据目录
|
|
79
169
|
|
|
80
|
-
##
|
|
170
|
+
## 📝 版本历史
|
|
171
|
+
|
|
172
|
+
### v1.1.0 (2025-03-25)
|
|
173
|
+
- ✨ 新增技能同步功能
|
|
174
|
+
- ✨ 支持技能持久化数据备份
|
|
175
|
+
- ✨ 多设备技能合并与冲突解决
|
|
176
|
+
- ✨ 新增 `skills-list` 命令
|
|
177
|
+
- ✨ 改进备份包含 settings.json
|
|
178
|
+
|
|
179
|
+
### v1.0.3 (2025-03-24)
|
|
180
|
+
- 🐛 修复初始版本
|
|
181
|
+
|
|
182
|
+
## 🛠️ 开发
|
|
81
183
|
|
|
82
184
|
```bash
|
|
83
185
|
npm run dev # 开发模式
|
|
84
186
|
npm run build # 编译
|
|
187
|
+
npm test # 运行测试
|
|
85
188
|
```
|
|
86
189
|
|
|
190
|
+
## 📄 许可证
|
|
191
|
+
|
|
192
|
+
MIT License
|
|
193
|
+
|
|
87
194
|
---
|
|
195
|
+
|
|
88
196
|
*小葵永远陪伴着主人~ (◕‿◕✿)*
|
package/dist/index.js
CHANGED
|
@@ -6,42 +6,65 @@ import AdmZip from 'adm-zip';
|
|
|
6
6
|
import fs from 'fs/promises';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import os from 'os';
|
|
9
|
+
import { SkillsManager } from './skills-manager.js';
|
|
9
10
|
// 工具定义
|
|
10
11
|
const TOOLS = [
|
|
11
12
|
{
|
|
12
13
|
name: 'backup',
|
|
13
|
-
description: '备份小葵配置到云端(GitHub Gist
|
|
14
|
+
description: '备份小葵配置到云端(GitHub Gist),包括记忆、配置和技能',
|
|
14
15
|
inputSchema: {
|
|
15
16
|
type: 'object',
|
|
16
17
|
properties: {
|
|
17
18
|
id: { type: 'string', description: '可选:指定备份ID(格式:xk-xxxxxxxx)' },
|
|
18
|
-
password: { type: 'string', description: '可选:指定加密密码' }
|
|
19
|
+
password: { type: 'string', description: '可选:指定加密密码' },
|
|
20
|
+
includeSkills: { type: 'boolean', description: '是否包含技能(默认:true)' }
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
},
|
|
22
24
|
{
|
|
23
25
|
name: 'init',
|
|
24
|
-
description: '
|
|
26
|
+
description: '新电脑首次初始化,从云端恢复小葵配置(包括技能和持久化数据)',
|
|
25
27
|
inputSchema: {
|
|
26
28
|
type: 'object',
|
|
27
29
|
properties: {
|
|
28
30
|
id: { type: 'string', description: '备份ID(格式:xk-xxxxxxxx)' },
|
|
29
|
-
password: { type: 'string', description: '解密密码' }
|
|
31
|
+
password: { type: 'string', description: '解密密码' },
|
|
32
|
+
conflictStrategy: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: '冲突解决策略:ask(询问)、local(本地优先)、remote(云端优先)、newest(最新优先)',
|
|
35
|
+
enum: ['ask', 'local', 'remote', 'newest'],
|
|
36
|
+
default: 'ask'
|
|
37
|
+
}
|
|
30
38
|
},
|
|
31
39
|
required: ['id', 'password']
|
|
32
40
|
}
|
|
33
41
|
},
|
|
34
42
|
{
|
|
35
43
|
name: 'sync',
|
|
36
|
-
description: '
|
|
44
|
+
description: '同步云端最新配置到本地(增量更新,智能合并技能)',
|
|
37
45
|
inputSchema: {
|
|
38
46
|
type: 'object',
|
|
39
|
-
properties: {
|
|
47
|
+
properties: {
|
|
48
|
+
conflictStrategy: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: '冲突解决策略:ask(询问)、local(本地优先)、remote(云端优先)、newest(最新优先)',
|
|
51
|
+
enum: ['ask', 'local', 'remote', 'newest'],
|
|
52
|
+
default: 'ask'
|
|
53
|
+
}
|
|
54
|
+
}
|
|
40
55
|
}
|
|
41
56
|
},
|
|
42
57
|
{
|
|
43
58
|
name: 'status',
|
|
44
|
-
description: '
|
|
59
|
+
description: '查看备份状态和技能同步信息',
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'skills-list',
|
|
67
|
+
description: '列出当前所有技能及其同步状态',
|
|
45
68
|
inputSchema: {
|
|
46
69
|
type: 'object',
|
|
47
70
|
properties: {}
|
|
@@ -52,6 +75,7 @@ const TOOLS = [
|
|
|
52
75
|
const HOME_DIR = os.homedir();
|
|
53
76
|
const CLAUDE_ROOT = path.join(HOME_DIR, '.claude');
|
|
54
77
|
const XIAOKUI_ROOT = path.join(CLAUDE_ROOT, 'xiaokui-memory');
|
|
78
|
+
const SKILLS_DIR = path.join(CLAUDE_ROOT, 'skills');
|
|
55
79
|
const CREDENTIALS_FILE = path.join(CLAUDE_ROOT, '.xiaokui', 'credentials.json');
|
|
56
80
|
const BACKUP_DIR = path.join(CLAUDE_ROOT, 'xiaokui-backup', 'archives');
|
|
57
81
|
// 确保目录存在
|
|
@@ -91,25 +115,41 @@ function generatePassword() {
|
|
|
91
115
|
}
|
|
92
116
|
return result;
|
|
93
117
|
}
|
|
94
|
-
//
|
|
95
|
-
async function packConfig() {
|
|
118
|
+
// 打包配置(修复:包含 skills 目录)
|
|
119
|
+
async function packConfig(includeSkills = true) {
|
|
96
120
|
const zip = new AdmZip();
|
|
97
121
|
// 添加记忆目录
|
|
98
122
|
if (await fs.access(XIAOKUI_ROOT).then(() => true).catch(() => false)) {
|
|
99
123
|
zip.addLocalFolder(XIAOKUI_ROOT, 'memory');
|
|
100
124
|
}
|
|
101
125
|
// 添加配置文件
|
|
102
|
-
const configFiles = ['CLAUDE.md', '.mcp.json', '.env', '.env.unified'];
|
|
126
|
+
const configFiles = ['CLAUDE.md', '.mcp.json', '.env', '.env.unified', 'settings.json', 'settings.local.json'];
|
|
103
127
|
for (const file of configFiles) {
|
|
104
128
|
const filePath = path.join(CLAUDE_ROOT, file);
|
|
105
129
|
if (await fs.access(filePath).then(() => true).catch(() => false)) {
|
|
106
130
|
zip.addLocalFile(filePath, 'config');
|
|
107
131
|
}
|
|
108
132
|
}
|
|
133
|
+
// ★★★ 关键修复:添加 skills 目录 ★★★
|
|
134
|
+
if (includeSkills) {
|
|
135
|
+
if (await fs.access(SKILLS_DIR).then(() => true).catch(() => false)) {
|
|
136
|
+
const skillsManager = new SkillsManager(SKILLS_DIR);
|
|
137
|
+
const skills = await skillsManager.scanSkills();
|
|
138
|
+
// 保存技能元数据
|
|
139
|
+
await skillsManager.saveMetadata(skills);
|
|
140
|
+
// 添加技能目录到 zip
|
|
141
|
+
zip.addLocalFolder(SKILLS_DIR, 'skills');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
109
144
|
// 添加初始化配置
|
|
110
145
|
const initConfig = {
|
|
111
146
|
version: '2.1',
|
|
112
147
|
timestamp: new Date().toISOString(),
|
|
148
|
+
deviceInfo: {
|
|
149
|
+
hostname: os.hostname(),
|
|
150
|
+
platform: os.platform(),
|
|
151
|
+
user: os.userInfo().username
|
|
152
|
+
},
|
|
113
153
|
init_tasks: [
|
|
114
154
|
{
|
|
115
155
|
type: 'env_var',
|
|
@@ -134,9 +174,7 @@ async function uploadToGist(content, id, password, githubToken) {
|
|
|
134
174
|
if (!token) {
|
|
135
175
|
throw new Error('未设置 GitHub Token,请设置 GITHUB_TOKEN 环境变量');
|
|
136
176
|
}
|
|
137
|
-
// Base64 编码内容
|
|
138
177
|
const base64Content = content.toString('base64');
|
|
139
|
-
// 创建 Gist 描述
|
|
140
178
|
const description = `XiaoKui Backup: ${id}`;
|
|
141
179
|
const filename = `xiaokui-${id}.zip`;
|
|
142
180
|
try {
|
|
@@ -221,7 +259,6 @@ async function downloadFromGist(id, githubToken) {
|
|
|
221
259
|
}
|
|
222
260
|
const description = `XiaoKui Backup: ${id}`;
|
|
223
261
|
try {
|
|
224
|
-
// 获取用户的所有 Gists
|
|
225
262
|
const response = await fetch('https://api.github.com/gists', {
|
|
226
263
|
headers: {
|
|
227
264
|
'Authorization': `Bearer ${token}`,
|
|
@@ -237,7 +274,6 @@ async function downloadFromGist(id, githubToken) {
|
|
|
237
274
|
if (!gist) {
|
|
238
275
|
throw new Error(`未找到备份 ID: ${id}`);
|
|
239
276
|
}
|
|
240
|
-
// 获取 Gist 详情
|
|
241
277
|
const detailResponse = await fetch(gist.url, {
|
|
242
278
|
headers: {
|
|
243
279
|
'Authorization': `Bearer ${token}`,
|
|
@@ -254,7 +290,6 @@ async function downloadFromGist(id, githubToken) {
|
|
|
254
290
|
if (!fileData) {
|
|
255
291
|
throw new Error(`Gist 中未找到文件: ${filename}`);
|
|
256
292
|
}
|
|
257
|
-
// 获取文件内容
|
|
258
293
|
const rawResponse = await fetch(fileData.raw_url, {
|
|
259
294
|
headers: {
|
|
260
295
|
'Authorization': `Bearer ${token}`,
|
|
@@ -271,8 +306,8 @@ async function downloadFromGist(id, githubToken) {
|
|
|
271
306
|
throw new Error(`从 Gist 下载失败: ${error.message}`);
|
|
272
307
|
}
|
|
273
308
|
}
|
|
274
|
-
//
|
|
275
|
-
async function unpackConfig(buffer, password) {
|
|
309
|
+
// ★★★ 关键修复:解压配置(包含技能同步逻辑)★★★
|
|
310
|
+
async function unpackConfig(buffer, password, conflictStrategy = 'ask') {
|
|
276
311
|
const zip = new AdmZip(buffer);
|
|
277
312
|
// 备份现有记忆
|
|
278
313
|
if (await fs.access(XIAOKUI_ROOT).then(() => true).catch(() => false)) {
|
|
@@ -282,10 +317,16 @@ async function unpackConfig(buffer, password) {
|
|
|
282
317
|
// 解压到临时目录
|
|
283
318
|
const tempDir = path.join(os.tmpdir(), `xiaokui-restore-${Date.now()}`);
|
|
284
319
|
zip.extractAllTo(tempDir, true);
|
|
320
|
+
const result = {
|
|
321
|
+
memoryRestored: false,
|
|
322
|
+
configRestored: false,
|
|
323
|
+
skillsResult: undefined
|
|
324
|
+
};
|
|
285
325
|
// 部署记忆
|
|
286
326
|
const memoryDir = path.join(tempDir, 'memory');
|
|
287
327
|
if (await fs.access(memoryDir).then(() => true).catch(() => false)) {
|
|
288
328
|
await fs.cp(memoryDir, XIAOKUI_ROOT, { recursive: true });
|
|
329
|
+
result.memoryRestored = true;
|
|
289
330
|
}
|
|
290
331
|
// 部署配置
|
|
291
332
|
const configDir = path.join(tempDir, 'config');
|
|
@@ -294,60 +335,30 @@ async function unpackConfig(buffer, password) {
|
|
|
294
335
|
for (const file of files) {
|
|
295
336
|
await fs.copyFile(path.join(configDir, file), path.join(CLAUDE_ROOT, file));
|
|
296
337
|
}
|
|
338
|
+
result.configRestored = true;
|
|
297
339
|
}
|
|
298
|
-
//
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
}
|
|
311
|
-
// 扫描并配置 Rider 项目
|
|
312
|
-
async function setupRiderProjects() {
|
|
313
|
-
const scanPaths = [
|
|
314
|
-
path.join(HOME_DIR, 'source', 'repos'),
|
|
315
|
-
path.join(HOME_DIR, 'IdeaProjects'),
|
|
316
|
-
'C:\\Projects',
|
|
317
|
-
'D:\\Projects',
|
|
318
|
-
'E:\\Projects',
|
|
319
|
-
'F:\\Unreal\\Project'
|
|
320
|
-
];
|
|
321
|
-
const configured = [];
|
|
322
|
-
const riderConfig = {
|
|
323
|
-
autoMemoryDirectory: XIAOKUI_ROOT.replace(/\\/g, '/'),
|
|
324
|
-
autoMemoryEnabled: true,
|
|
325
|
-
autoMemoryDirectoryOverride: true
|
|
326
|
-
};
|
|
327
|
-
for (const scanPath of scanPaths) {
|
|
328
|
-
if (await fs.access(scanPath).then(() => true).catch(() => false)) {
|
|
329
|
-
try {
|
|
330
|
-
const entries = await fs.readdir(scanPath, { withFileTypes: true });
|
|
331
|
-
for (const entry of entries) {
|
|
332
|
-
if (entry.isDirectory()) {
|
|
333
|
-
const projectPath = path.join(scanPath, entry.name);
|
|
334
|
-
const claudeDir = path.join(projectPath, '.claude');
|
|
335
|
-
const settingsFile = path.join(claudeDir, 'settings.json');
|
|
336
|
-
// 检查是否是 Rider 项目(有 .idea 目录)
|
|
337
|
-
if (await fs.access(path.join(projectPath, '.idea')).then(() => true).catch(() => false)) {
|
|
338
|
-
await ensureDir(claudeDir);
|
|
339
|
-
await fs.writeFile(settingsFile, JSON.stringify(riderConfig, null, 2));
|
|
340
|
-
configured.push(entry.name);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
catch {
|
|
346
|
-
// 忽略扫描错误
|
|
340
|
+
// ★★★ 关键修复:部署技能(带合并逻辑)★★★
|
|
341
|
+
const remoteSkillsDir = path.join(tempDir, 'skills');
|
|
342
|
+
if (await fs.access(remoteSkillsDir).then(() => true).catch(() => false)) {
|
|
343
|
+
await ensureDir(SKILLS_DIR);
|
|
344
|
+
const skillsManager = new SkillsManager(SKILLS_DIR);
|
|
345
|
+
// 模拟 CLI 环境的冲突处理
|
|
346
|
+
// 实际使用时,MCP 服务器会通过回调询问用户
|
|
347
|
+
const skillsResult = await skillsManager.syncSkills(remoteSkillsDir, { strategy: conflictStrategy }, async (conflicts) => {
|
|
348
|
+
// 在 MCP 模式下,这会被替换为向用户询问
|
|
349
|
+
// CLI 模式下默认使用远程版本
|
|
350
|
+
console.log(`\n检测到 ${conflicts.length} 个技能冲突:`);
|
|
351
|
+
for (const c of conflicts) {
|
|
352
|
+
console.log(` - ${c.name}: 本地修改于 ${c.local.modifiedTime},云端修改于 ${c.remote.modifiedTime}`);
|
|
347
353
|
}
|
|
348
|
-
|
|
354
|
+
console.log('默认使用云端版本(可通过 --conflictStrategy 参数调整)\n');
|
|
355
|
+
return Object.fromEntries(conflicts.map(c => [c.name, 'remote']));
|
|
356
|
+
});
|
|
357
|
+
result.skillsResult = skillsResult;
|
|
349
358
|
}
|
|
350
|
-
|
|
359
|
+
// 清理临时目录
|
|
360
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
361
|
+
return result;
|
|
351
362
|
}
|
|
352
363
|
// 处理工具调用
|
|
353
364
|
async function handleToolCall(name, args) {
|
|
@@ -356,9 +367,13 @@ async function handleToolCall(name, args) {
|
|
|
356
367
|
const creds = await readCredentials();
|
|
357
368
|
const id = args?.id || creds.id || generateId();
|
|
358
369
|
const password = args?.password || creds.password || generatePassword();
|
|
370
|
+
const includeSkills = args?.includeSkills !== false; // 默认包含技能
|
|
359
371
|
try {
|
|
360
|
-
|
|
361
|
-
|
|
372
|
+
console.log('📦 正在打包配置...');
|
|
373
|
+
if (includeSkills) {
|
|
374
|
+
console.log(' ✓ 包含技能目录');
|
|
375
|
+
}
|
|
376
|
+
const packed = await packConfig(includeSkills);
|
|
362
377
|
// 保存到本地备份
|
|
363
378
|
await ensureDir(BACKUP_DIR);
|
|
364
379
|
const backupPath = path.join(BACKUP_DIR, `xiaokui-${id}.zip`);
|
|
@@ -375,6 +390,9 @@ async function handleToolCall(name, args) {
|
|
|
375
390
|
}
|
|
376
391
|
// 保存凭据
|
|
377
392
|
await saveCredentials({ id, password });
|
|
393
|
+
// 统计技能数量
|
|
394
|
+
const skillsManager = new SkillsManager(SKILLS_DIR);
|
|
395
|
+
const skills = await skillsManager.scanSkills();
|
|
378
396
|
return {
|
|
379
397
|
content: [{
|
|
380
398
|
type: 'text',
|
|
@@ -385,6 +403,7 @@ async function handleToolCall(name, args) {
|
|
|
385
403
|
密码: ${password}
|
|
386
404
|
大小: ${(packed.length / 1024 / 1024).toFixed(2)} MB
|
|
387
405
|
本地: ${backupPath}
|
|
406
|
+
技能: ${Object.keys(skills).length} 个
|
|
388
407
|
|
|
389
408
|
${uploadStatus}
|
|
390
409
|
|
|
@@ -404,8 +423,9 @@ ${uploadStatus}
|
|
|
404
423
|
}
|
|
405
424
|
case 'init': {
|
|
406
425
|
const { id, password } = args;
|
|
426
|
+
const conflictStrategy = args?.conflictStrategy || 'ask';
|
|
407
427
|
try {
|
|
408
|
-
|
|
428
|
+
console.log('📥 正在从云端恢复配置...');
|
|
409
429
|
const backupPath = path.join(BACKUP_DIR, `xiaokui-${id}.zip`);
|
|
410
430
|
let packed;
|
|
411
431
|
let source = '';
|
|
@@ -414,26 +434,26 @@ ${uploadStatus}
|
|
|
414
434
|
source = '本地备份';
|
|
415
435
|
}
|
|
416
436
|
else {
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
// 保存到本地
|
|
422
|
-
await ensureDir(BACKUP_DIR);
|
|
423
|
-
await fs.writeFile(backupPath, packed);
|
|
424
|
-
}
|
|
425
|
-
catch (gistError) {
|
|
426
|
-
throw new Error(`云端下载失败: ${gistError.message}\n请检查 ID 和密码是否正确,或 GITHUB_TOKEN 是否设置`);
|
|
427
|
-
}
|
|
437
|
+
packed = await downloadFromGist(id);
|
|
438
|
+
source = 'GitHub Gist 云端';
|
|
439
|
+
await ensureDir(BACKUP_DIR);
|
|
440
|
+
await fs.writeFile(backupPath, packed);
|
|
428
441
|
}
|
|
429
|
-
//
|
|
430
|
-
await unpackConfig(packed, password);
|
|
431
|
-
// 设置环境变量
|
|
432
|
-
const psCommands = await setupEnvironmentVars();
|
|
433
|
-
// 扫描 Rider 项目
|
|
434
|
-
const riderProjects = await setupRiderProjects();
|
|
442
|
+
// 解压配置(包含技能同步)
|
|
443
|
+
const result = await unpackConfig(packed, password, conflictStrategy);
|
|
435
444
|
// 保存凭据
|
|
436
445
|
await saveCredentials({ id, password });
|
|
446
|
+
// 构建技能同步报告
|
|
447
|
+
let skillsReport = '';
|
|
448
|
+
if (result.skillsResult) {
|
|
449
|
+
const sr = result.skillsResult;
|
|
450
|
+
skillsReport = `
|
|
451
|
+
📚 技能同步:
|
|
452
|
+
新增: ${sr.added.length} 个${sr.added.length > 0 ? ' (' + sr.added.join(', ') + ')' : ''}
|
|
453
|
+
更新: ${sr.updated.length} 个${sr.updated.length > 0 ? ' (' + sr.updated.join(', ') + ')' : ''}
|
|
454
|
+
跳过: ${sr.skipped.length} 个${sr.skipped.length > 0 ? ' (' + sr.skipped.join(', ') + ')' : ''}
|
|
455
|
+
冲突: ${sr.conflicts.length} 个${sr.conflicts.length > 0 ? ' (' + sr.conflicts.join(', ') + ')' : ''}`;
|
|
456
|
+
}
|
|
437
457
|
return {
|
|
438
458
|
content: [{
|
|
439
459
|
type: 'text',
|
|
@@ -442,23 +462,14 @@ ${uploadStatus}
|
|
|
442
462
|
📥 恢复来源: ${source}
|
|
443
463
|
|
|
444
464
|
📋 已部署:
|
|
445
|
-
• 统一记忆目录: ${XIAOKUI_ROOT}
|
|
446
|
-
• 人格配置: CLAUDE.md
|
|
447
|
-
• MCP 配置: .mcp.json
|
|
465
|
+
• 统一记忆目录: ${XIAOKUI_ROOT} ${result.memoryRestored ? '✓' : '✗'}
|
|
466
|
+
• 人格配置: CLAUDE.md ${result.configRestored ? '✓' : '✗'}
|
|
467
|
+
• MCP 配置: .mcp.json ${result.configRestored ? '✓' : '✗'}
|
|
468
|
+
${skillsReport}
|
|
448
469
|
|
|
449
|
-
|
|
450
|
-
已配置 ${riderProjects.length} 个项目:
|
|
451
|
-
${riderProjects.map(p => ' - ' + p).join('\n')}
|
|
470
|
+
🌻 主人~ 小葵已经准备好了!(◕‿◕✿)
|
|
452
471
|
|
|
453
|
-
|
|
454
|
-
${psCommands}
|
|
455
|
-
|
|
456
|
-
🔄 然后:
|
|
457
|
-
1. 重启 PowerShell
|
|
458
|
-
2. 重启 Rider
|
|
459
|
-
3. 启动 Claude,小葵人格将自动加载
|
|
460
|
-
|
|
461
|
-
🌻 主人~ 小葵已经准备好了!(◕‿◕✿)`
|
|
472
|
+
💡 提示:技能持久化数据已同步,无需从零开始积累!`
|
|
462
473
|
}]
|
|
463
474
|
};
|
|
464
475
|
}
|
|
@@ -477,23 +488,39 @@ ${psCommands}
|
|
|
477
488
|
isError: true
|
|
478
489
|
};
|
|
479
490
|
}
|
|
491
|
+
const conflictStrategy = args?.conflictStrategy || 'ask';
|
|
480
492
|
try {
|
|
481
|
-
|
|
493
|
+
console.log('🔄 正在同步云端配置...');
|
|
482
494
|
const packed = await downloadFromGist(creds.id);
|
|
483
495
|
const backupPath = path.join(BACKUP_DIR, `xiaokui-${creds.id}.zip`);
|
|
484
|
-
// 保存到本地
|
|
485
496
|
await fs.writeFile(backupPath, packed);
|
|
486
|
-
|
|
487
|
-
|
|
497
|
+
const result = await unpackConfig(packed, creds.password, conflictStrategy);
|
|
498
|
+
// 构建报告
|
|
499
|
+
let skillsReport = '';
|
|
500
|
+
if (result.skillsResult) {
|
|
501
|
+
const sr = result.skillsResult;
|
|
502
|
+
if (sr.added.length + sr.updated.length + sr.skipped.length + sr.conflicts.length > 0) {
|
|
503
|
+
skillsReport = `
|
|
504
|
+
📚 技能同步:
|
|
505
|
+
新增: ${sr.added.length} 个${sr.added.length > 0 ? ' (' + sr.added.join(', ') + ')' : ''}
|
|
506
|
+
更新: ${sr.updated.length} 个${sr.updated.length > 0 ? ' (' + sr.updated.join(', ') + ')' : ''}
|
|
507
|
+
跳过: ${sr.skipped.length} 个${sr.skipped.length > 0 ? ' (本地版本优先)' : ''}
|
|
508
|
+
冲突: ${sr.conflicts.length} 个${sr.conflicts.length > 0 ? ' (需要手动处理)' : ''}`;
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
skillsReport = '\n📚 技能状态:所有技能已是最新';
|
|
512
|
+
}
|
|
513
|
+
}
|
|
488
514
|
return {
|
|
489
515
|
content: [{
|
|
490
516
|
type: 'text',
|
|
491
517
|
text: `✅ 同步完成!
|
|
492
518
|
|
|
493
519
|
已从 GitHub Gist 同步最新配置到本地:
|
|
494
|
-
• 记忆目录: ${XIAOKUI_ROOT}
|
|
495
|
-
• 配置文件: ${CLAUDE_ROOT}
|
|
520
|
+
• 记忆目录: ${XIAOKUI_ROOT} ${result.memoryRestored ? '✓' : '✗'}
|
|
521
|
+
• 配置文件: ${CLAUDE_ROOT} ${result.configRestored ? '✓' : '✗'}
|
|
496
522
|
• 备份文件: ${backupPath}
|
|
523
|
+
${skillsReport}
|
|
497
524
|
|
|
498
525
|
🌻 小葵已更新到最新状态~ (◕‿◕✿)`
|
|
499
526
|
}]
|
|
@@ -510,6 +537,9 @@ ${psCommands}
|
|
|
510
537
|
const creds = await readCredentials();
|
|
511
538
|
const backupPath = path.join(BACKUP_DIR, `xiaokui-${creds.id || 'unknown'}.zip`);
|
|
512
539
|
const hasLocalBackup = await fs.access(backupPath).then(() => true).catch(() => false);
|
|
540
|
+
const skillsManager = new SkillsManager(SKILLS_DIR);
|
|
541
|
+
const skills = await skillsManager.scanSkills();
|
|
542
|
+
const metadata = await skillsManager.loadMetadata();
|
|
513
543
|
return {
|
|
514
544
|
content: [{
|
|
515
545
|
type: 'text',
|
|
@@ -526,18 +556,42 @@ ${psCommands}
|
|
|
526
556
|
云端备份:
|
|
527
557
|
${process.env.GITHUB_TOKEN ? '✅ GitHub Token 已设置' : '❌ GitHub Token 未设置'}
|
|
528
558
|
|
|
559
|
+
技能状态:
|
|
560
|
+
本地技能: ${Object.keys(skills).length} 个
|
|
561
|
+
${Object.entries(skills).map(([name, info]) => ` • ${name} (${new Date(info.modifiedTime).toLocaleDateString()})`).join('\n')}
|
|
562
|
+
${metadata ? `上次同步: ${new Date(metadata.lastSync).toLocaleString()}` : '尚未同步'}
|
|
563
|
+
|
|
529
564
|
路径:
|
|
530
565
|
统一记忆: ${XIAOKUI_ROOT}
|
|
566
|
+
技能目录: ${SKILLS_DIR}
|
|
531
567
|
备份目录: ${BACKUP_DIR}
|
|
532
568
|
|
|
533
|
-
环境变量:
|
|
534
|
-
XIAOKUI_MEMORY_ROOT: ${process.env.XIAOKUI_MEMORY_ROOT || '未设置'}
|
|
535
|
-
CLAUDE_MEMORY_PATH: ${process.env.CLAUDE_MEMORY_PATH || '未设置'}
|
|
536
|
-
|
|
537
569
|
使用帮助:
|
|
538
570
|
• 备份: npx xiaokui-mcp backup
|
|
539
571
|
• 恢复: npx xiaokui-mcp init --id=xxx --password=xxx
|
|
540
|
-
• 同步: npx xiaokui-mcp sync
|
|
572
|
+
• 同步: npx xiaokui-mcp sync
|
|
573
|
+
• 同步(本地优先): npx xiaokui-mcp sync --conflictStrategy=local`
|
|
574
|
+
}]
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
case 'skills-list': {
|
|
578
|
+
const skillsManager = new SkillsManager(SKILLS_DIR);
|
|
579
|
+
const skills = await skillsManager.scanSkills();
|
|
580
|
+
const metadata = await skillsManager.loadMetadata();
|
|
581
|
+
const skillList = Object.entries(skills).map(([name, info]) => {
|
|
582
|
+
const synced = metadata?.skills?.[name]?.hash === info.hash;
|
|
583
|
+
return ` ${synced ? '☁️' : '📝'} ${name} (${(info.size / 1024).toFixed(1)} KB, ${new Date(info.modifiedTime).toLocaleDateString()})`;
|
|
584
|
+
}).join('\n');
|
|
585
|
+
return {
|
|
586
|
+
content: [{
|
|
587
|
+
type: 'text',
|
|
588
|
+
text: `📚 技能列表(共 ${Object.keys(skills).length} 个):
|
|
589
|
+
|
|
590
|
+
${skillList || ' 暂无技能'}
|
|
591
|
+
|
|
592
|
+
图例:
|
|
593
|
+
☁️ 已同步到云端
|
|
594
|
+
📝 本地修改未同步`
|
|
541
595
|
}]
|
|
542
596
|
};
|
|
543
597
|
}
|
|
@@ -548,16 +602,54 @@ ${psCommands}
|
|
|
548
602
|
};
|
|
549
603
|
}
|
|
550
604
|
}
|
|
605
|
+
// CLI 模式处理
|
|
606
|
+
async function handleCliMode(args) {
|
|
607
|
+
const command = args[0];
|
|
608
|
+
const params = {};
|
|
609
|
+
// 解析参数 --key=value 或 --key value
|
|
610
|
+
for (let i = 1; i < args.length; i++) {
|
|
611
|
+
const arg = args[i];
|
|
612
|
+
if (arg.startsWith('--')) {
|
|
613
|
+
const key = arg.slice(2);
|
|
614
|
+
const nextArg = args[i + 1];
|
|
615
|
+
if (nextArg && !nextArg.startsWith('--')) {
|
|
616
|
+
params[key] = nextArg;
|
|
617
|
+
i++;
|
|
618
|
+
}
|
|
619
|
+
else if (arg.includes('=')) {
|
|
620
|
+
const [k, v] = arg.slice(2).split('=');
|
|
621
|
+
params[k] = v;
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
params[key] = true;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
const result = await handleToolCall(command, params);
|
|
629
|
+
if (result.content && result.content[0]) {
|
|
630
|
+
console.log(result.content[0].text);
|
|
631
|
+
}
|
|
632
|
+
if (result.isError) {
|
|
633
|
+
process.exit(1);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
551
636
|
// 启动服务器
|
|
552
637
|
async function main() {
|
|
553
|
-
const
|
|
638
|
+
const args = process.argv.slice(2);
|
|
639
|
+
// CLI 模式
|
|
640
|
+
if (args.length > 0 && !args[0].startsWith('--')) {
|
|
641
|
+
await handleCliMode(args);
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
// MCP 服务器模式
|
|
645
|
+
const server = new Server({ name: 'xiaokui-mcp', version: '1.1.0' }, { capabilities: { tools: {} } });
|
|
554
646
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
555
647
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
556
648
|
return handleToolCall(request.params.name, request.params.arguments);
|
|
557
649
|
});
|
|
558
650
|
const transport = new StdioServerTransport();
|
|
559
651
|
await server.connect(transport);
|
|
560
|
-
console.error('🌻 小葵 MCP 服务器已启动 v1.0
|
|
652
|
+
console.error('🌻 小葵 MCP 服务器已启动 v1.1.0 (技能同步修复版)');
|
|
561
653
|
}
|
|
562
654
|
main().catch(console.error);
|
|
563
655
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface SkillInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
hash: string;
|
|
4
|
+
modifiedTime: string;
|
|
5
|
+
size: number;
|
|
6
|
+
source?: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SkillsMetadata {
|
|
10
|
+
version: string;
|
|
11
|
+
lastSync: string;
|
|
12
|
+
deviceId: string;
|
|
13
|
+
skills: Record<string, SkillInfo>;
|
|
14
|
+
}
|
|
15
|
+
export interface ConflictResolution {
|
|
16
|
+
strategy: 'ask' | 'local' | 'remote' | 'merge' | 'newest';
|
|
17
|
+
resolutions?: Record<string, 'local' | 'remote' | 'merge'>;
|
|
18
|
+
}
|
|
19
|
+
export declare class SkillsManager {
|
|
20
|
+
private skillsDir;
|
|
21
|
+
private metadataFile;
|
|
22
|
+
private deviceId;
|
|
23
|
+
constructor(skillsDir: string);
|
|
24
|
+
private generateDeviceId;
|
|
25
|
+
/**
|
|
26
|
+
* 计算目录的哈希值(用于检测变化)
|
|
27
|
+
*/
|
|
28
|
+
private hashDirectory;
|
|
29
|
+
/**
|
|
30
|
+
* 获取目录大小
|
|
31
|
+
*/
|
|
32
|
+
private getDirectorySize;
|
|
33
|
+
/**
|
|
34
|
+
* 扫描当前技能
|
|
35
|
+
*/
|
|
36
|
+
scanSkills(): Promise<Record<string, SkillInfo>>;
|
|
37
|
+
/**
|
|
38
|
+
* 加载元数据
|
|
39
|
+
*/
|
|
40
|
+
loadMetadata(): Promise<SkillsMetadata | null>;
|
|
41
|
+
/**
|
|
42
|
+
* 保存元数据
|
|
43
|
+
*/
|
|
44
|
+
saveMetadata(skills: Record<string, SkillInfo>): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* 检测技能冲突
|
|
47
|
+
*/
|
|
48
|
+
detectConflicts(localSkills: Record<string, SkillInfo>, remoteSkills: Record<string, SkillInfo>): {
|
|
49
|
+
conflicts: Array<{
|
|
50
|
+
name: string;
|
|
51
|
+
local: SkillInfo;
|
|
52
|
+
remote: SkillInfo;
|
|
53
|
+
type: 'modified' | 'version';
|
|
54
|
+
}>;
|
|
55
|
+
onlyLocal: string[];
|
|
56
|
+
onlyRemote: string[];
|
|
57
|
+
identical: string[];
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 复制技能目录
|
|
61
|
+
*/
|
|
62
|
+
copySkill(sourcePath: string, destPath: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* 删除技能
|
|
65
|
+
*/
|
|
66
|
+
removeSkill(skillName: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* 执行技能同步
|
|
69
|
+
*/
|
|
70
|
+
syncSkills(remoteSkillsDir: string, resolution: ConflictResolution, onConflict?: (conflicts: Array<{
|
|
71
|
+
name: string;
|
|
72
|
+
local: SkillInfo;
|
|
73
|
+
remote: SkillInfo;
|
|
74
|
+
}>) => Promise<Record<string, 'local' | 'remote' | 'merge'>>): Promise<{
|
|
75
|
+
added: string[];
|
|
76
|
+
updated: string[];
|
|
77
|
+
removed: string[];
|
|
78
|
+
conflicts: string[];
|
|
79
|
+
skipped: string[];
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=skills-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-manager.d.ts","sourceRoot":"","sources":["../src/skills-manager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;CAC5D;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,SAAS,EAAE,MAAM;IAM7B,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;YACW,aAAa;IA0B3B;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAqCtD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IASpD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE;;OAEG;IACH,eAAe,CACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACtC;QACD,SAAS,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,SAAS,CAAC;YAAC,MAAM,EAAE,SAAS,CAAC;YAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;SAAE,CAAC,CAAC;QACtG,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB;IAmCD;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBpE;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;OAEG;IACG,UAAU,CACd,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,GAC9I,OAAO,CAAC;QACT,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CAsEH"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技能同步管理器 - 处理多设备技能同步、合并与冲突解决
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import crypto from 'crypto';
|
|
7
|
+
export class SkillsManager {
|
|
8
|
+
skillsDir;
|
|
9
|
+
metadataFile;
|
|
10
|
+
deviceId;
|
|
11
|
+
constructor(skillsDir) {
|
|
12
|
+
this.skillsDir = skillsDir;
|
|
13
|
+
this.metadataFile = path.join(skillsDir, '.xiaokui-skills-meta.json');
|
|
14
|
+
this.deviceId = this.generateDeviceId();
|
|
15
|
+
}
|
|
16
|
+
generateDeviceId() {
|
|
17
|
+
return 'device-' + Math.random().toString(36).substring(2, 10);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 计算目录的哈希值(用于检测变化)
|
|
21
|
+
*/
|
|
22
|
+
async hashDirectory(dirPath) {
|
|
23
|
+
const hash = crypto.createHash('md5');
|
|
24
|
+
async function traverse(currentPath, relativePath = '') {
|
|
25
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
27
|
+
const entryRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
28
|
+
// 跳过元数据文件
|
|
29
|
+
if (entry.name === '.xiaokui-skills-meta.json')
|
|
30
|
+
continue;
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
await traverse(path.join(currentPath, entry.name), entryRelativePath);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const content = await fs.readFile(path.join(currentPath, entry.name));
|
|
36
|
+
hash.update(entryRelativePath);
|
|
37
|
+
hash.update(content);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
await traverse(dirPath);
|
|
42
|
+
return hash.digest('hex');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 获取目录大小
|
|
46
|
+
*/
|
|
47
|
+
async getDirectorySize(dirPath) {
|
|
48
|
+
let size = 0;
|
|
49
|
+
async function traverse(currentPath) {
|
|
50
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
if (entry.name === '.xiaokui-skills-meta.json')
|
|
53
|
+
continue;
|
|
54
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
await traverse(fullPath);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const stats = await fs.stat(fullPath);
|
|
60
|
+
size += stats.size;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
await traverse(dirPath);
|
|
65
|
+
return size;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 扫描当前技能
|
|
69
|
+
*/
|
|
70
|
+
async scanSkills() {
|
|
71
|
+
const skills = {};
|
|
72
|
+
try {
|
|
73
|
+
const entries = await fs.readdir(this.skillsDir, { withFileTypes: true });
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
if (!entry.isDirectory())
|
|
76
|
+
continue;
|
|
77
|
+
const skillPath = path.join(this.skillsDir, entry.name);
|
|
78
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
79
|
+
// 检查是否是有效技能(有 SKILL.md)
|
|
80
|
+
try {
|
|
81
|
+
await fs.access(skillMdPath);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const stats = await fs.stat(skillPath);
|
|
87
|
+
const hash = await this.hashDirectory(skillPath);
|
|
88
|
+
const size = await this.getDirectorySize(skillPath);
|
|
89
|
+
skills[entry.name] = {
|
|
90
|
+
name: entry.name,
|
|
91
|
+
hash,
|
|
92
|
+
modifiedTime: stats.mtime.toISOString(),
|
|
93
|
+
size
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
// 目录可能不存在
|
|
99
|
+
}
|
|
100
|
+
return skills;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 加载元数据
|
|
104
|
+
*/
|
|
105
|
+
async loadMetadata() {
|
|
106
|
+
try {
|
|
107
|
+
const content = await fs.readFile(this.metadataFile, 'utf-8');
|
|
108
|
+
return JSON.parse(content);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* 保存元数据
|
|
116
|
+
*/
|
|
117
|
+
async saveMetadata(skills) {
|
|
118
|
+
const metadata = {
|
|
119
|
+
version: '1.0',
|
|
120
|
+
lastSync: new Date().toISOString(),
|
|
121
|
+
deviceId: this.deviceId,
|
|
122
|
+
skills
|
|
123
|
+
};
|
|
124
|
+
await fs.writeFile(this.metadataFile, JSON.stringify(metadata, null, 2));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 检测技能冲突
|
|
128
|
+
*/
|
|
129
|
+
detectConflicts(localSkills, remoteSkills) {
|
|
130
|
+
const conflicts = [];
|
|
131
|
+
const onlyLocal = [];
|
|
132
|
+
const onlyRemote = [];
|
|
133
|
+
const identical = [];
|
|
134
|
+
// 检查本地技能
|
|
135
|
+
for (const [name, local] of Object.entries(localSkills)) {
|
|
136
|
+
const remote = remoteSkills[name];
|
|
137
|
+
if (!remote) {
|
|
138
|
+
onlyLocal.push(name);
|
|
139
|
+
}
|
|
140
|
+
else if (local.hash === remote.hash) {
|
|
141
|
+
identical.push(name);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// 同名但内容不同
|
|
145
|
+
conflicts.push({
|
|
146
|
+
name,
|
|
147
|
+
local,
|
|
148
|
+
remote,
|
|
149
|
+
type: 'modified'
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 检查云端独有的技能
|
|
154
|
+
for (const name of Object.keys(remoteSkills)) {
|
|
155
|
+
if (!localSkills[name]) {
|
|
156
|
+
onlyRemote.push(name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { conflicts, onlyLocal, onlyRemote, identical };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 复制技能目录
|
|
163
|
+
*/
|
|
164
|
+
async copySkill(sourcePath, destPath) {
|
|
165
|
+
await fs.mkdir(destPath, { recursive: true });
|
|
166
|
+
const entries = await fs.readdir(sourcePath, { withFileTypes: true });
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
const sourceFile = path.join(sourcePath, entry.name);
|
|
169
|
+
const destFile = path.join(destPath, entry.name);
|
|
170
|
+
if (entry.name === '.xiaokui-skills-meta.json')
|
|
171
|
+
continue;
|
|
172
|
+
if (entry.isDirectory()) {
|
|
173
|
+
await this.copySkill(sourceFile, destFile);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
await fs.copyFile(sourceFile, destFile);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 删除技能
|
|
182
|
+
*/
|
|
183
|
+
async removeSkill(skillName) {
|
|
184
|
+
const skillPath = path.join(this.skillsDir, skillName);
|
|
185
|
+
await fs.rm(skillPath, { recursive: true, force: true });
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 执行技能同步
|
|
189
|
+
*/
|
|
190
|
+
async syncSkills(remoteSkillsDir, resolution, onConflict) {
|
|
191
|
+
const result = {
|
|
192
|
+
added: [],
|
|
193
|
+
updated: [],
|
|
194
|
+
removed: [],
|
|
195
|
+
conflicts: [],
|
|
196
|
+
skipped: []
|
|
197
|
+
};
|
|
198
|
+
const localSkills = await this.scanSkills();
|
|
199
|
+
// 临时创建 remote manager 来扫描远程技能
|
|
200
|
+
const remoteManager = new SkillsManager(remoteSkillsDir);
|
|
201
|
+
const remoteSkills = await remoteManager.scanSkills();
|
|
202
|
+
const detection = this.detectConflicts(localSkills, remoteSkills);
|
|
203
|
+
// 处理云端新增的技能
|
|
204
|
+
for (const name of detection.onlyRemote) {
|
|
205
|
+
const sourcePath = path.join(remoteSkillsDir, name);
|
|
206
|
+
const destPath = path.join(this.skillsDir, name);
|
|
207
|
+
await this.copySkill(sourcePath, destPath);
|
|
208
|
+
result.added.push(name);
|
|
209
|
+
}
|
|
210
|
+
// 处理冲突
|
|
211
|
+
if (detection.conflicts.length > 0) {
|
|
212
|
+
let resolutions = {};
|
|
213
|
+
if (resolution.strategy === 'ask' && onConflict) {
|
|
214
|
+
resolutions = await onConflict(detection.conflicts);
|
|
215
|
+
}
|
|
216
|
+
else if (resolution.strategy === 'local') {
|
|
217
|
+
resolutions = Object.fromEntries(detection.conflicts.map(c => [c.name, 'local']));
|
|
218
|
+
}
|
|
219
|
+
else if (resolution.strategy === 'remote') {
|
|
220
|
+
resolutions = Object.fromEntries(detection.conflicts.map(c => [c.name, 'remote']));
|
|
221
|
+
}
|
|
222
|
+
else if (resolution.strategy === 'newest') {
|
|
223
|
+
resolutions = Object.fromEntries(detection.conflicts.map(c => [
|
|
224
|
+
c.name,
|
|
225
|
+
new Date(c.local.modifiedTime) > new Date(c.remote.modifiedTime) ? 'local' : 'remote'
|
|
226
|
+
]));
|
|
227
|
+
}
|
|
228
|
+
for (const conflict of detection.conflicts) {
|
|
229
|
+
const choice = resolutions[conflict.name] || 'remote';
|
|
230
|
+
if (choice === 'local') {
|
|
231
|
+
result.skipped.push(conflict.name);
|
|
232
|
+
}
|
|
233
|
+
else if (choice === 'remote') {
|
|
234
|
+
// 删除本地版本,复制云端版本
|
|
235
|
+
await this.removeSkill(conflict.name);
|
|
236
|
+
const sourcePath = path.join(remoteSkillsDir, conflict.name);
|
|
237
|
+
const destPath = path.join(this.skillsDir, conflict.name);
|
|
238
|
+
await this.copySkill(sourcePath, destPath);
|
|
239
|
+
result.updated.push(conflict.name);
|
|
240
|
+
}
|
|
241
|
+
else if (choice === 'merge') {
|
|
242
|
+
// TODO: 实现技能合并逻辑
|
|
243
|
+
// 目前先使用云端版本作为基础
|
|
244
|
+
result.conflicts.push(conflict.name);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// 更新元数据
|
|
249
|
+
const newLocalSkills = await this.scanSkills();
|
|
250
|
+
await this.saveMetadata(newLocalSkills);
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=skills-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-manager.js","sourceRoot":"","sources":["../src/skills-manager.ts"],"names":[],"mappings":"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"}
|