xiaokui-mcp 1.0.3 → 1.2.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/diagnostics.d.ts +7 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +273 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.js +193 -75
- 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 +51 -50
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
|
*小葵永远陪伴着主人~ (◕‿◕✿)*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6PH,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDpF;AAED,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 小葵启动诊断模块 - 内嵌版
|
|
3
|
+
* 集成到 xiaokui-mcp 中,在 init/sync 后自动执行
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs/promises';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
// 颜色输出
|
|
9
|
+
const colors = {
|
|
10
|
+
reset: '\x1b[0m',
|
|
11
|
+
bright: '\x1b[1m',
|
|
12
|
+
dim: '\x1b[2m',
|
|
13
|
+
red: '\x1b[31m',
|
|
14
|
+
green: '\x1b[32m',
|
|
15
|
+
yellow: '\x1b[33m',
|
|
16
|
+
blue: '\x1b[34m',
|
|
17
|
+
magenta: '\x1b[35m',
|
|
18
|
+
cyan: '\x1b[36m'
|
|
19
|
+
};
|
|
20
|
+
function log(level, message) {
|
|
21
|
+
const colorMap = {
|
|
22
|
+
info: colors.blue,
|
|
23
|
+
success: colors.green,
|
|
24
|
+
warning: colors.yellow,
|
|
25
|
+
error: colors.red,
|
|
26
|
+
title: colors.magenta + colors.bright,
|
|
27
|
+
section: colors.cyan + colors.bright
|
|
28
|
+
};
|
|
29
|
+
const prefix = {
|
|
30
|
+
info: 'ℹ️',
|
|
31
|
+
success: '✅',
|
|
32
|
+
warning: '⚠️',
|
|
33
|
+
error: '❌',
|
|
34
|
+
title: '🌻',
|
|
35
|
+
section: '📋'
|
|
36
|
+
};
|
|
37
|
+
console.log(`${colorMap[level]}${prefix[level]} ${message}${colors.reset}`);
|
|
38
|
+
}
|
|
39
|
+
// 配置路径
|
|
40
|
+
function getConfigPaths() {
|
|
41
|
+
const HOME_DIR = os.homedir();
|
|
42
|
+
const CLAUDE_ROOT = path.join(HOME_DIR, '.claude');
|
|
43
|
+
return {
|
|
44
|
+
mcp: path.join(CLAUDE_ROOT, '.mcp.json'),
|
|
45
|
+
settings: path.join(CLAUDE_ROOT, 'settings.json'),
|
|
46
|
+
skills: path.join(CLAUDE_ROOT, 'skills'),
|
|
47
|
+
memory: path.join(CLAUDE_ROOT, 'projects/C--Users-mawenxu/memory'),
|
|
48
|
+
claudeRoot: CLAUDE_ROOT
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// 读取 JSON
|
|
52
|
+
async function readJson(filePath) {
|
|
53
|
+
try {
|
|
54
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
55
|
+
return JSON.parse(content);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 计算健康评分
|
|
62
|
+
function calculateHealthScore(results) {
|
|
63
|
+
let score = 100;
|
|
64
|
+
const details = [];
|
|
65
|
+
// MCP 评分 (30分)
|
|
66
|
+
if (results.mcp?.servers?.length > 0) {
|
|
67
|
+
const mcpWorking = results.mcp.servers.filter((s) => s.canStart).length;
|
|
68
|
+
const mcpRatio = mcpWorking / results.mcp.servers.length;
|
|
69
|
+
const mcpScore = Math.round(mcpRatio * 30);
|
|
70
|
+
score -= (30 - mcpScore);
|
|
71
|
+
details.push({ category: 'MCP服务器', score: mcpScore, max: 30, status: mcpRatio === 1 ? '完美' : mcpRatio > 0.5 ? '一般' : '需修复' });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
score -= 30;
|
|
75
|
+
details.push({ category: 'MCP服务器', score: 0, max: 30, status: '未配置' });
|
|
76
|
+
}
|
|
77
|
+
// 技能评分 (25分)
|
|
78
|
+
if (results.skills?.skills?.length > 0) {
|
|
79
|
+
const skillWorking = results.skills.skills.filter((s) => s.status === 'working').length;
|
|
80
|
+
const skillRatio = skillWorking / results.skills.skills.length;
|
|
81
|
+
const skillScore = Math.round(skillRatio * 25);
|
|
82
|
+
score -= (25 - skillScore);
|
|
83
|
+
details.push({ category: '技能系统', score: skillScore, max: 25, status: skillRatio === 1 ? '完美' : skillRatio > 0.5 ? '一般' : '需修复' });
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
details.push({ category: '技能系统', score: 25, max: 25, status: '正常' });
|
|
87
|
+
}
|
|
88
|
+
// 记忆评分 (25分)
|
|
89
|
+
if (results.memory?.memoryIndex?.exists) {
|
|
90
|
+
const hasOrphans = results.memory.issues?.some((i) => i.includes('孤立'));
|
|
91
|
+
const memoryScore = hasOrphans ? 20 : 25;
|
|
92
|
+
score -= (25 - memoryScore);
|
|
93
|
+
details.push({ category: '记忆系统', score: memoryScore, max: 25, status: hasOrphans ? '需整理' : '完美' });
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
score -= 25;
|
|
97
|
+
details.push({ category: '记忆系统', score: 0, max: 25, status: '未配置' });
|
|
98
|
+
}
|
|
99
|
+
// 优化评分 (20分)
|
|
100
|
+
const hasIssues = results.optimization?.duplicates?.length > 0 || results.optimization?.conflicts?.length > 0;
|
|
101
|
+
const optScore = hasIssues ? 15 : 20;
|
|
102
|
+
score -= (20 - optScore);
|
|
103
|
+
details.push({ category: '体系优化', score: optScore, max: 20, status: hasIssues ? '有建议' : '完美' });
|
|
104
|
+
return { score: Math.max(0, score), details };
|
|
105
|
+
}
|
|
106
|
+
// 检查 MCP 状态
|
|
107
|
+
async function checkMCPStatus(configPaths) {
|
|
108
|
+
const mcpConfig = await readJson(configPaths.mcp);
|
|
109
|
+
if (!mcpConfig) {
|
|
110
|
+
return { status: 'missing_config', servers: [] };
|
|
111
|
+
}
|
|
112
|
+
const results = {
|
|
113
|
+
servers: [],
|
|
114
|
+
missingEnv: []
|
|
115
|
+
};
|
|
116
|
+
const servers = mcpConfig.mcpServers || {};
|
|
117
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
118
|
+
const cfg = config;
|
|
119
|
+
const missingVars = [];
|
|
120
|
+
if (cfg.env) {
|
|
121
|
+
for (const [key, value] of Object.entries(cfg.env)) {
|
|
122
|
+
const val = value;
|
|
123
|
+
const envName = val.match(/\$\{([^}]+)\}/)?.[1] || key;
|
|
124
|
+
if (val.includes('${') || !process.env[envName]) {
|
|
125
|
+
missingVars.push(envName);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
results.servers.push({
|
|
130
|
+
name,
|
|
131
|
+
canStart: missingVars.length === 0,
|
|
132
|
+
missingEnvVars: missingVars
|
|
133
|
+
});
|
|
134
|
+
if (missingVars.length > 0) {
|
|
135
|
+
results.missingEnv.push({ name, vars: missingVars });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return results;
|
|
139
|
+
}
|
|
140
|
+
// 检查技能
|
|
141
|
+
async function checkSkills(configPaths) {
|
|
142
|
+
const results = {
|
|
143
|
+
skills: [],
|
|
144
|
+
withMemory: []
|
|
145
|
+
};
|
|
146
|
+
try {
|
|
147
|
+
const skillDirs = await fs.readdir(configPaths.skills);
|
|
148
|
+
for (const dir of skillDirs) {
|
|
149
|
+
const skillPath = path.join(configPaths.skills, dir);
|
|
150
|
+
const stat = await fs.stat(skillPath);
|
|
151
|
+
if (!stat.isDirectory())
|
|
152
|
+
continue;
|
|
153
|
+
const yamlPath = path.join(skillPath, 'skill.yaml');
|
|
154
|
+
let hasYaml = false;
|
|
155
|
+
try {
|
|
156
|
+
await fs.access(yamlPath);
|
|
157
|
+
hasYaml = true;
|
|
158
|
+
}
|
|
159
|
+
catch { }
|
|
160
|
+
const scriptDir = path.join(skillPath, 'scripts');
|
|
161
|
+
let hasScripts = false;
|
|
162
|
+
try {
|
|
163
|
+
const scripts = await fs.readdir(scriptDir);
|
|
164
|
+
hasScripts = scripts.length > 0;
|
|
165
|
+
}
|
|
166
|
+
catch { }
|
|
167
|
+
const isMemorySkill = dir.toLowerCase().includes('memory') ||
|
|
168
|
+
dir.toLowerCase().includes('cache');
|
|
169
|
+
const isSystemSkill = dir.toLowerCase().includes('xiaokui') ||
|
|
170
|
+
dir.toLowerCase().includes('start');
|
|
171
|
+
const skillInfo = {
|
|
172
|
+
name: dir,
|
|
173
|
+
hasYaml,
|
|
174
|
+
hasScripts,
|
|
175
|
+
isMemorySkill,
|
|
176
|
+
isSystemSkill,
|
|
177
|
+
status: hasYaml && hasScripts ? 'working' : 'incomplete'
|
|
178
|
+
};
|
|
179
|
+
results.skills.push(skillInfo);
|
|
180
|
+
if (isMemorySkill && skillInfo.status === 'working') {
|
|
181
|
+
results.withMemory.push(skillInfo);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// 忽略错误
|
|
187
|
+
}
|
|
188
|
+
return results;
|
|
189
|
+
}
|
|
190
|
+
// 检查记忆系统
|
|
191
|
+
async function checkMemoryArchitecture(configPaths) {
|
|
192
|
+
const results = {
|
|
193
|
+
memoryIndex: null,
|
|
194
|
+
issues: []
|
|
195
|
+
};
|
|
196
|
+
try {
|
|
197
|
+
const indexPath = path.join(configPaths.memory, 'MEMORY.md');
|
|
198
|
+
try {
|
|
199
|
+
const indexContent = await fs.readFile(indexPath, 'utf-8');
|
|
200
|
+
results.memoryIndex = {
|
|
201
|
+
exists: true,
|
|
202
|
+
entries: (indexContent.match(/^- /gm) || []).length
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
results.issues.push('缺少 MEMORY.md 索引');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// 忽略错误
|
|
211
|
+
}
|
|
212
|
+
return results;
|
|
213
|
+
}
|
|
214
|
+
// 技能优化分析
|
|
215
|
+
async function analyzeSkillOptimization(skills) {
|
|
216
|
+
const analysis = {
|
|
217
|
+
duplicates: [],
|
|
218
|
+
conflicts: []
|
|
219
|
+
};
|
|
220
|
+
const memorySkills = skills.filter(s => s.isMemorySkill);
|
|
221
|
+
if (memorySkills.length > 1) {
|
|
222
|
+
analysis.duplicates.push({
|
|
223
|
+
type: 'memory',
|
|
224
|
+
skills: memorySkills.map(s => s.name)
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return analysis;
|
|
228
|
+
}
|
|
229
|
+
// 主诊断函数
|
|
230
|
+
export async function runDiagnostics(mode = 'sync') {
|
|
231
|
+
console.log('\n' + colors.bright + '═══════════════════════════════════════════════════════════════' + colors.reset);
|
|
232
|
+
log('title', `小葵启动诊断 (${mode === 'init' ? '初始化后' : '同步后'})`);
|
|
233
|
+
log('info', '正在检查系统状态...\n');
|
|
234
|
+
const configPaths = getConfigPaths();
|
|
235
|
+
// 执行检查
|
|
236
|
+
const allResults = {
|
|
237
|
+
mcp: await checkMCPStatus(configPaths),
|
|
238
|
+
skills: await checkSkills(configPaths),
|
|
239
|
+
memory: await checkMemoryArchitecture(configPaths),
|
|
240
|
+
optimization: null
|
|
241
|
+
};
|
|
242
|
+
allResults.optimization = await analyzeSkillOptimization(allResults.skills.skills || []);
|
|
243
|
+
// 计算健康评分
|
|
244
|
+
const healthScore = calculateHealthScore(allResults);
|
|
245
|
+
// 显示报告
|
|
246
|
+
const score = healthScore.score;
|
|
247
|
+
const scoreColor = score >= 90 ? colors.green : score >= 70 ? colors.yellow : colors.red;
|
|
248
|
+
const scoreIcon = score >= 90 ? '🌟' : score >= 70 ? '⭐' : '💫';
|
|
249
|
+
console.log(`
|
|
250
|
+
${colors.bright}╔════════════════════════════════════════════════════════════════╗
|
|
251
|
+
║ ${scoreIcon} 小葵健康评分: ${scoreColor}${score}${colors.reset}${colors.bright}/100 ║
|
|
252
|
+
╚════════════════════════════════════════════════════════════════╝${colors.reset}
|
|
253
|
+
`);
|
|
254
|
+
console.log(`${colors.cyan}评分详情:${colors.reset}`);
|
|
255
|
+
for (const detail of healthScore.details) {
|
|
256
|
+
const dc = detail.score === detail.max ? colors.green : detail.score > detail.max * 0.6 ? colors.yellow : colors.red;
|
|
257
|
+
console.log(` ${dc}${detail.score}/${detail.max}${colors.reset} ${detail.category} ${colors.dim}(${detail.status})${colors.reset}`);
|
|
258
|
+
}
|
|
259
|
+
console.log(`
|
|
260
|
+
${colors.cyan}📊 系统概览${colors.reset}
|
|
261
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
262
|
+
MCP 服务器: ${allResults.mcp.servers.filter((s) => s.canStart).length}/${allResults.mcp.servers.length} 个正常
|
|
263
|
+
技能系统: ${allResults.skills.skills.filter((s) => s.status === 'working').length}/${allResults.skills.skills.length} 个正常
|
|
264
|
+
系统技能: ${allResults.skills.skills.filter((s) => s.isSystemSkill).length} 个
|
|
265
|
+
|
|
266
|
+
${score >= 80 ? colors.green + '✅ 系统状态良好,小葵已准备就绪!' : colors.yellow + '⚠️ 系统有需要关注的问题'}
|
|
267
|
+
${colors.reset}
|
|
268
|
+
${colors.dim}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
269
|
+
`);
|
|
270
|
+
return `健康评分: ${score}/100`;
|
|
271
|
+
}
|
|
272
|
+
export default runDiagnostics;
|
|
273
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|