xiaozhi-client 1.6.2 → 1.6.3-beta.1
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/dist/Logger.d.ts +94 -0
- package/dist/Logger.js +3 -0
- package/dist/Logger.js.map +1 -0
- package/dist/ProxyMCPServer.d.ts +117 -0
- package/dist/ProxyMCPServer.js +2 -2
- package/dist/ProxyMCPServer.js.map +1 -1
- package/dist/WebServer.js +11 -11
- package/dist/WebServer.js.map +1 -1
- package/dist/WebServerStandalone.js +11 -11
- package/dist/WebServerStandalone.js.map +1 -1
- package/dist/cli.js +11 -11
- package/dist/cli.js.map +1 -1
- package/dist/configManager.js +2 -2
- package/dist/configManager.js.map +1 -1
- package/dist/mcpCommands.js +2 -2
- package/dist/mcpCommands.js.map +1 -1
- package/dist/mcpServerProxy.js +5 -5
- package/dist/mcpServerProxy.js.map +1 -1
- package/dist/package.json +3 -2
- package/dist/services/MCPServer.d.ts +4 -0
- package/dist/services/MCPServer.js +4 -4
- package/dist/services/MCPServer.js.map +1 -1
- package/package.json +26 -32
- package/dist/logger.d.ts +0 -46
- package/dist/logger.js +0 -3
- package/dist/logger.js.map +0 -1
- package/web/README.md +0 -169
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xiaozhi-client",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.3-beta.1",
|
|
4
4
|
"description": "小智 AI 客户端 命令行工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -20,29 +20,6 @@
|
|
|
20
20
|
"xiaozhi": "./dist/cli.js",
|
|
21
21
|
"xiaozhi-client": "./dist/cli.js"
|
|
22
22
|
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"build": "pnpm run build:web && tsup",
|
|
25
|
-
"build:web": "cd web && pnpm install && pnpm run build",
|
|
26
|
-
"dev": "tsup --watch",
|
|
27
|
-
"test": "vitest run",
|
|
28
|
-
"test:watch": "vitest",
|
|
29
|
-
"test:coverage": "vitest run --coverage",
|
|
30
|
-
"test:ui": "vitest --ui",
|
|
31
|
-
"format": "biome format --write .",
|
|
32
|
-
"lint": "biome lint --write .",
|
|
33
|
-
"type:check": "tsc --noEmit",
|
|
34
|
-
"check": "biome check .",
|
|
35
|
-
"check:fix": "biome check --write --unsafe .",
|
|
36
|
-
"check:all": "pnpm check && pnpm type:check && pnpm spell:check && pnpm duplicate:check",
|
|
37
|
-
"spell:check": "cspell \"src/**/*.ts\" \"*.md\" \"*.json\"",
|
|
38
|
-
"duplicate:check": "jscpd src/",
|
|
39
|
-
"docker:update-version": "node scripts/update-dockerfile-version.js",
|
|
40
|
-
"release": "semantic-release",
|
|
41
|
-
"release:beta": "semantic-release",
|
|
42
|
-
"release:dry": "semantic-release --dry-run",
|
|
43
|
-
"release:dry:beta": "semantic-release --dry-run",
|
|
44
|
-
"example": "node --loader ts-node/esm"
|
|
45
|
-
},
|
|
46
23
|
"keywords": [
|
|
47
24
|
"xiaozhi",
|
|
48
25
|
"mcp",
|
|
@@ -60,7 +37,6 @@
|
|
|
60
37
|
"cli-table3": "^0.6.5",
|
|
61
38
|
"commander": "^14.0.0",
|
|
62
39
|
"comment-json": "^4.2.5",
|
|
63
|
-
"consola": "^3.4.2",
|
|
64
40
|
"dayjs": "^1.11.13",
|
|
65
41
|
"dotenv": "^16.3.1",
|
|
66
42
|
"eventsource": "^4.0.0",
|
|
@@ -71,6 +47,8 @@
|
|
|
71
47
|
"jsonc-parser": "^3.3.1",
|
|
72
48
|
"node-fetch": "2",
|
|
73
49
|
"ora": "^8.2.0",
|
|
50
|
+
"pino": "^8.0.0",
|
|
51
|
+
"pino-pretty": "^10.0.0",
|
|
74
52
|
"ws": "^8.14.2",
|
|
75
53
|
"zod": "^3.25.62"
|
|
76
54
|
},
|
|
@@ -104,11 +82,27 @@
|
|
|
104
82
|
"typescript": "^5.8.3",
|
|
105
83
|
"vitest": "^3.2.3"
|
|
106
84
|
},
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
85
|
+
"scripts": {
|
|
86
|
+
"build": "pnpm run build:web && tsup",
|
|
87
|
+
"build:web": "cd web && pnpm install && pnpm run build",
|
|
88
|
+
"dev": "tsup --watch",
|
|
89
|
+
"test": "vitest run",
|
|
90
|
+
"test:watch": "vitest",
|
|
91
|
+
"test:coverage": "vitest run --coverage",
|
|
92
|
+
"test:ui": "vitest --ui",
|
|
93
|
+
"format": "biome format --write .",
|
|
94
|
+
"lint": "biome lint --write .",
|
|
95
|
+
"type:check": "tsc --noEmit",
|
|
96
|
+
"check": "biome check .",
|
|
97
|
+
"check:fix": "biome check --write --unsafe .",
|
|
98
|
+
"check:all": "pnpm check && pnpm type:check && pnpm spell:check && pnpm duplicate:check",
|
|
99
|
+
"spell:check": "cspell \"src/**/*.ts\" \"*.md\" \"*.json\"",
|
|
100
|
+
"duplicate:check": "jscpd src/",
|
|
101
|
+
"docker:update-version": "node scripts/update-dockerfile-version.js",
|
|
102
|
+
"release": "semantic-release",
|
|
103
|
+
"release:beta": "semantic-release",
|
|
104
|
+
"release:dry": "semantic-release --dry-run",
|
|
105
|
+
"release:dry:beta": "semantic-release --dry-run",
|
|
106
|
+
"example": "node --loader ts-node/esm"
|
|
113
107
|
}
|
|
114
|
-
}
|
|
108
|
+
}
|
package/dist/logger.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
declare class Logger {
|
|
2
|
-
private logFilePath;
|
|
3
|
-
private writeStream;
|
|
4
|
-
private consolaInstance;
|
|
5
|
-
private isDaemonMode;
|
|
6
|
-
constructor();
|
|
7
|
-
/**
|
|
8
|
-
* 初始化日志文件
|
|
9
|
-
* @param projectDir 项目目录
|
|
10
|
-
*/
|
|
11
|
-
initLogFile(projectDir: string): void;
|
|
12
|
-
/**
|
|
13
|
-
* 记录日志到文件
|
|
14
|
-
* @param level 日志级别
|
|
15
|
-
* @param message 日志消息
|
|
16
|
-
* @param args 额外参数
|
|
17
|
-
*/
|
|
18
|
-
private logToFile;
|
|
19
|
-
/**
|
|
20
|
-
* 设置是否启用文件日志
|
|
21
|
-
* @param enable 是否启用
|
|
22
|
-
*/
|
|
23
|
-
enableFileLogging(enable: boolean): void;
|
|
24
|
-
/**
|
|
25
|
-
* 日志方法
|
|
26
|
-
*/
|
|
27
|
-
info(message: string, ...args: any[]): void;
|
|
28
|
-
success(message: string, ...args: any[]): void;
|
|
29
|
-
warn(message: string, ...args: any[]): void;
|
|
30
|
-
error(message: string, ...args: any[]): void;
|
|
31
|
-
debug(message: string, ...args: any[]): void;
|
|
32
|
-
log(message: string, ...args: any[]): void;
|
|
33
|
-
/**
|
|
34
|
-
* 创建一个带标签的日志实例(已废弃,直接返回原实例)
|
|
35
|
-
* @param tag 标签(不再使用)
|
|
36
|
-
* @deprecated 标签功能已移除
|
|
37
|
-
*/
|
|
38
|
-
withTag(tag: string): Logger;
|
|
39
|
-
/**
|
|
40
|
-
* 关闭日志文件流
|
|
41
|
-
*/
|
|
42
|
-
close(): void;
|
|
43
|
-
}
|
|
44
|
-
declare const logger: Logger;
|
|
45
|
-
|
|
46
|
-
export { Logger, logger };
|
package/dist/logger.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
var f=Object.defineProperty;var l=(o,t)=>f(o,"name",{value:t,configurable:!0});import h from"fs";import u from"path";import c from"chalk";import{createConsola as d}from"consola";function w(o){let t=o.getFullYear(),e=String(o.getMonth()+1).padStart(2,"0"),n=String(o.getDate()).padStart(2,"0"),g=String(o.getHours()).padStart(2,"0"),r=String(o.getMinutes()).padStart(2,"0"),s=String(o.getSeconds()).padStart(2,"0");return`${t}-${e}-${n} ${g}:${r}:${s}`}l(w,"formatDateTime");var m=class{static{l(this,"Logger")}logFilePath=null;writeStream=null;consolaInstance;isDaemonMode;constructor(){this.isDaemonMode=process.env.XIAOZHI_DAEMON==="true",this.consolaInstance=d({formatOptions:{date:!1,colors:!0,compact:!0},fancy:!1});let t=this.isDaemonMode;this.consolaInstance.setReporters([{log:l(e=>{let n={info:"INFO",success:"SUCCESS",warn:"WARN",error:"ERROR",debug:"DEBUG",log:"LOG"},g={info:c.blue,success:c.green,warn:c.yellow,error:c.red,debug:c.gray,log:l(i=>i,"log")},r=n[e.type]||e.type.toUpperCase(),s=g[e.type]||(i=>i),a=w(new Date),p=s(`[${r}]`),S=`[${a}] ${p} ${e.args.join(" ")}`;if(!t)try{console.error(S)}catch(i){if(i instanceof Error&&i.message?.includes("EPIPE"))return;throw i}},"log")}])}initLogFile(t){this.logFilePath=u.join(t,"xiaozhi.log"),h.existsSync(this.logFilePath)||h.writeFileSync(this.logFilePath,""),this.writeStream=h.createWriteStream(this.logFilePath,{flags:"a",encoding:"utf8"})}logToFile(t,e,...n){if(this.writeStream){let r=`[${new Date().toISOString()}] [${t.toUpperCase()}] ${e}`,s=n.length>0?`${r} ${n.map(a=>typeof a=="object"?JSON.stringify(a):String(a)).join(" ")}`:r;this.writeStream.write(`${s}
|
|
2
|
-
`)}}enableFileLogging(t){t&&!this.writeStream&&this.logFilePath?this.writeStream=h.createWriteStream(this.logFilePath,{flags:"a",encoding:"utf8"}):!t&&this.writeStream&&(this.writeStream.end(),this.writeStream=null)}info(t,...e){this.consolaInstance.info(t,...e),this.logToFile("info",t,...e)}success(t,...e){this.consolaInstance.success(t,...e),this.logToFile("success",t,...e)}warn(t,...e){this.consolaInstance.warn(t,...e),this.logToFile("warn",t,...e)}error(t,...e){this.consolaInstance.error(t,...e),this.logToFile("error",t,...e)}debug(t,...e){this.consolaInstance.debug(t,...e),this.logToFile("debug",t,...e)}log(t,...e){this.consolaInstance.log(t,...e),this.logToFile("log",t,...e)}withTag(t){return this}close(){this.writeStream&&(this.writeStream.end(),this.writeStream=null)}},D=new m;export{m as Logger,D as logger};
|
|
3
|
-
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { type consola, createConsola } from \"consola\";\n\nfunction formatDateTime(date: Date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\nexport class Logger {\n private logFilePath: string | null = null;\n private writeStream: fs.WriteStream | null = null;\n private consolaInstance: typeof consola;\n private isDaemonMode: boolean;\n\n constructor() {\n // 检查是否为守护进程模式\n this.isDaemonMode = process.env.XIAOZHI_DAEMON === \"true\";\n // 创建自定义的 consola 实例,禁用图标并自定义格式\n this.consolaInstance = createConsola({\n formatOptions: {\n date: false,\n colors: true,\n compact: true,\n },\n fancy: false,\n });\n\n // 保存对当前实例的引用,以便在闭包中访问\n const isDaemonMode = this.isDaemonMode;\n\n // 自定义格式化器\n this.consolaInstance.setReporters([\n {\n log: (logObj) => {\n const levelMap: Record<string, string> = {\n info: \"INFO\",\n success: \"SUCCESS\",\n warn: \"WARN\",\n error: \"ERROR\",\n debug: \"DEBUG\",\n log: \"LOG\",\n };\n\n const colorMap: Record<string, (text: string) => string> = {\n info: chalk.blue,\n success: chalk.green,\n warn: chalk.yellow,\n error: chalk.red,\n debug: chalk.gray,\n log: (text: string) => text,\n };\n\n const level = levelMap[logObj.type] || logObj.type.toUpperCase();\n const colorFn = colorMap[logObj.type] || ((text: string) => text);\n const timestamp = formatDateTime(new Date());\n\n // 为级别添加颜色\n const coloredLevel = colorFn(`[${level}]`);\n const message = `[${timestamp}] ${coloredLevel} ${logObj.args.join(\n \" \"\n )}`;\n\n // 守护进程模式下不输出到控制台,只写入文件\n if (!isDaemonMode) {\n // 输出到 stderr(与原来保持一致)\n try {\n console.error(message);\n } catch (error) {\n // 忽略 EPIPE 错误\n if (error instanceof Error && error.message?.includes(\"EPIPE\")) {\n return;\n }\n throw error;\n }\n }\n },\n },\n ]);\n }\n\n /**\n * 初始化日志文件\n * @param projectDir 项目目录\n */\n initLogFile(projectDir: string): void {\n this.logFilePath = path.join(projectDir, \"xiaozhi.log\");\n\n // 确保日志文件存在\n if (!fs.existsSync(this.logFilePath)) {\n fs.writeFileSync(this.logFilePath, \"\");\n }\n\n // 创建写入流,追加模式\n this.writeStream = fs.createWriteStream(this.logFilePath, {\n flags: \"a\",\n encoding: \"utf8\",\n });\n }\n\n /**\n * 记录日志到文件\n * @param level 日志级别\n * @param message 日志消息\n * @param args 额外参数\n */\n private logToFile(level: string, message: string, ...args: any[]): void {\n if (this.writeStream) {\n const timestamp = new Date().toISOString();\n const formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;\n const fullMessage =\n args.length > 0\n ? `${formattedMessage} ${args\n .map((arg) =>\n typeof arg === \"object\" ? JSON.stringify(arg) : String(arg)\n )\n .join(\" \")}`\n : formattedMessage;\n\n this.writeStream.write(`${fullMessage}\\n`);\n }\n }\n\n /**\n * 设置是否启用文件日志\n * @param enable 是否启用\n */\n enableFileLogging(enable: boolean): void {\n if (enable && !this.writeStream && this.logFilePath) {\n this.writeStream = fs.createWriteStream(this.logFilePath, {\n flags: \"a\",\n encoding: \"utf8\",\n });\n } else if (!enable && this.writeStream) {\n this.writeStream.end();\n this.writeStream = null;\n }\n }\n\n /**\n * 日志方法\n */\n info(message: string, ...args: any[]): void {\n this.consolaInstance.info(message, ...args);\n this.logToFile(\"info\", message, ...args);\n }\n\n success(message: string, ...args: any[]): void {\n this.consolaInstance.success(message, ...args);\n this.logToFile(\"success\", message, ...args);\n }\n\n warn(message: string, ...args: any[]): void {\n this.consolaInstance.warn(message, ...args);\n this.logToFile(\"warn\", message, ...args);\n }\n\n error(message: string, ...args: any[]): void {\n this.consolaInstance.error(message, ...args);\n this.logToFile(\"error\", message, ...args);\n }\n\n debug(message: string, ...args: any[]): void {\n this.consolaInstance.debug(message, ...args);\n this.logToFile(\"debug\", message, ...args);\n }\n\n log(message: string, ...args: any[]): void {\n this.consolaInstance.log(message, ...args);\n this.logToFile(\"log\", message, ...args);\n }\n\n /**\n * 创建一个带标签的日志实例(已废弃,直接返回原实例)\n * @param tag 标签(不再使用)\n * @deprecated 标签功能已移除\n */\n withTag(tag: string): Logger {\n // 不再添加标签,直接返回共享实例\n return this;\n }\n\n /**\n * 关闭日志文件流\n */\n close(): void {\n if (this.writeStream) {\n this.writeStream.end();\n this.writeStream = null;\n }\n }\n}\n\n// 导出单例实例\nexport const logger = new Logger();\n"],"mappings":"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","names":["fs","path","chalk","createConsola","formatDateTime","date","year","month","day","hours","minutes","seconds","__name","Logger","createConsola","isDaemonMode","logObj","levelMap","colorMap","chalk","text","level","colorFn","timestamp","coloredLevel","message","error","projectDir","path","fs","args","formattedMessage","fullMessage","arg","enable","tag","logger"]}
|
package/web/README.md
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
# 小智客户端 Web UI
|
|
2
|
-
|
|
3
|
-
这是小智客户端的 Web 配置界面,提供了一个现代化、直观的界面来管理 MCP 服务配置。
|
|
4
|
-
|
|
5
|
-
## 功能特性
|
|
6
|
-
|
|
7
|
-
- 🎨 **现代化设计**:基于 shadcn/ui 组件库,提供优雅的用户界面
|
|
8
|
-
- 🔧 **可视化配置**:无需手动编辑 JSON 文件,通过界面即可完成所有配置
|
|
9
|
-
- 🚀 **实时状态监控**:实时显示与小智服务器的连接状态
|
|
10
|
-
- 📦 **MCP 服务管理**:支持添加、编辑、删除 MCP 服务,支持本地和 SSE 类型
|
|
11
|
-
- ⚙️ **灵活的配置选项**:可调整心跳间隔、超时时间等连接参数
|
|
12
|
-
- 🎯 **优秀的用户体验**:Toast 通知、确认对话框、平滑动画等
|
|
13
|
-
|
|
14
|
-
## 技术栈
|
|
15
|
-
|
|
16
|
-
- **框架**: React 18 + TypeScript
|
|
17
|
-
- **构建工具**: Vite
|
|
18
|
-
- **样式**: Tailwind CSS
|
|
19
|
-
- **UI 组件**: shadcn/ui
|
|
20
|
-
- **状态管理**: React Hooks
|
|
21
|
-
- **通知系统**: Sonner
|
|
22
|
-
- **图标**: Lucide React
|
|
23
|
-
- **代码质量**: Biome (代码格式化和 linting)
|
|
24
|
-
- **测试**: Vitest + React Testing Library
|
|
25
|
-
|
|
26
|
-
## 开发指南
|
|
27
|
-
|
|
28
|
-
### 安装依赖
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
pnpm install
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### 开发命令
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
# 启动开发服务器
|
|
38
|
-
pnpm dev
|
|
39
|
-
|
|
40
|
-
# 构建生产版本
|
|
41
|
-
pnpm build
|
|
42
|
-
|
|
43
|
-
# 预览生产构建
|
|
44
|
-
pnpm preview
|
|
45
|
-
|
|
46
|
-
# 运行测试
|
|
47
|
-
pnpm test
|
|
48
|
-
|
|
49
|
-
# 运行测试(watch 模式)
|
|
50
|
-
pnpm test:watch
|
|
51
|
-
|
|
52
|
-
# 生成测试覆盖率报告
|
|
53
|
-
pnpm test:coverage
|
|
54
|
-
|
|
55
|
-
# 代码格式化
|
|
56
|
-
pnpm format
|
|
57
|
-
|
|
58
|
-
# 代码检查
|
|
59
|
-
pnpm lint
|
|
60
|
-
|
|
61
|
-
# 类型检查
|
|
62
|
-
pnpm type:check
|
|
63
|
-
|
|
64
|
-
# 运行所有检查并修复
|
|
65
|
-
pnpm check:write
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 项目结构
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
web/
|
|
72
|
-
├── src/
|
|
73
|
-
│ ├── components/
|
|
74
|
-
│ │ ├── ui/ # shadcn/ui 组件
|
|
75
|
-
│ │ ├── ConfigEditor.tsx # 配置编辑器
|
|
76
|
-
│ │ ├── MCPServerList.tsx # MCP 服务列表
|
|
77
|
-
│ │ └── StatusCard.tsx # 状态卡片
|
|
78
|
-
│ ├── hooks/ # 自定义 React Hooks
|
|
79
|
-
│ │ └── useWebSocket.ts # WebSocket 连接管理
|
|
80
|
-
│ ├── pages/ # 页面组件
|
|
81
|
-
│ │ └── Dashboard.tsx # 主控制台页面
|
|
82
|
-
│ ├── types/ # TypeScript 类型定义
|
|
83
|
-
│ ├── utils/ # 工具函数
|
|
84
|
-
│ ├── App.tsx # 应用主组件
|
|
85
|
-
│ ├── main.tsx # 应用入口
|
|
86
|
-
│ └── index.css # 全局样式
|
|
87
|
-
├── public/ # 静态资源
|
|
88
|
-
├── tests/ # 测试文件
|
|
89
|
-
└── package.json # 项目配置
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### UI 组件说明
|
|
93
|
-
|
|
94
|
-
#### StatusCard
|
|
95
|
-
显示与小智服务器的连接状态,包括:
|
|
96
|
-
- 连接状态指示器(连接中/已连接/已断开)
|
|
97
|
-
- 最后活动时间
|
|
98
|
-
- 重连按钮
|
|
99
|
-
|
|
100
|
-
#### ConfigEditor
|
|
101
|
-
配置编辑器,用于:
|
|
102
|
-
- 编辑 MCP 接入点 URL
|
|
103
|
-
- 调整连接参数(心跳间隔、超时时间等)
|
|
104
|
-
- 管理 ModelScope API Key
|
|
105
|
-
|
|
106
|
-
#### MCPServerList
|
|
107
|
-
MCP 服务管理界面,支持:
|
|
108
|
-
- 查看所有已配置的 MCP 服务
|
|
109
|
-
- 添加新服务(支持 JSON 批量导入)
|
|
110
|
-
- 编辑现有服务配置
|
|
111
|
-
- 删除服务(带确认对话框)
|
|
112
|
-
|
|
113
|
-
### 样式定制
|
|
114
|
-
|
|
115
|
-
项目使用 Tailwind CSS 和 CSS 变量进行样式管理。主题颜色定义在 `src/index.css` 中:
|
|
116
|
-
|
|
117
|
-
```css
|
|
118
|
-
:root {
|
|
119
|
-
--background: 0 0% 100%;
|
|
120
|
-
--foreground: 222.2 84% 4.9%;
|
|
121
|
-
--primary: 222.2 47.4% 11.2%;
|
|
122
|
-
--destructive: 0 84.2% 60.2%;
|
|
123
|
-
/* ... 其他颜色变量 */
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### 添加新的 UI 组件
|
|
128
|
-
|
|
129
|
-
如果需要添加新的 shadcn/ui 组件:
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
# 查看可用组件
|
|
133
|
-
npx shadcn@latest add
|
|
134
|
-
|
|
135
|
-
# 添加特定组件(例如 dialog)
|
|
136
|
-
npx shadcn@latest add dialog
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### 测试
|
|
140
|
-
|
|
141
|
-
项目使用 Vitest 进行单元测试:
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
# 运行所有测试
|
|
145
|
-
pnpm test
|
|
146
|
-
|
|
147
|
-
# 运行特定测试文件
|
|
148
|
-
pnpm test ConfigEditor
|
|
149
|
-
|
|
150
|
-
# 生成覆盖率报告
|
|
151
|
-
pnpm test:coverage
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### 贡献指南
|
|
155
|
-
|
|
156
|
-
1. Fork 项目
|
|
157
|
-
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
|
|
158
|
-
3. 提交更改 (`git commit -m 'feat: 添加某个很棒的功能'`)
|
|
159
|
-
4. 推送到分支 (`git push origin feature/amazing-feature`)
|
|
160
|
-
5. 创建 Pull Request
|
|
161
|
-
|
|
162
|
-
提交前请确保:
|
|
163
|
-
- 所有测试通过 (`pnpm test`)
|
|
164
|
-
- 代码通过格式检查 (`pnpm check:write`)
|
|
165
|
-
- 类型检查通过 (`pnpm type:check`)
|
|
166
|
-
|
|
167
|
-
## 许可证
|
|
168
|
-
|
|
169
|
-
MIT License
|