mta-mcp 2.18.0 → 3.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/agents/flutter.agent.md +40 -64
- package/agents/mta.agent.md +226 -0
- package/agents/vue3.agent.md +41 -0
- package/agents/wechat-miniprogram.agent.md +23 -0
- package/bin/mta.cjs +98 -0
- package/dist/index.js +1668 -760
- package/dist/index.js.map +1 -1
- package/dist/skills/filesystem.d.ts +96 -0
- package/dist/skills/filesystem.js +269 -0
- package/dist/skills/filesystem.js.map +1 -0
- package/dist/skills/http.d.ts +73 -0
- package/dist/skills/http.js +234 -0
- package/dist/skills/http.js.map +1 -0
- package/dist/skills/index.d.ts +79 -0
- package/dist/skills/index.js +206 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/memory.d.ts +73 -0
- package/dist/skills/memory.js +223 -0
- package/dist/skills/memory.js.map +1 -0
- package/dist/skills/thinking.d.ts +48 -0
- package/dist/skills/thinking.js +199 -0
- package/dist/skills/thinking.js.map +1 -0
- package/dist/skills/versionChecker.d.ts +30 -0
- package/dist/skills/versionChecker.js +225 -0
- package/dist/skills/versionChecker.js.map +1 -0
- package/package.json +8 -5
- package/skills.json +68 -0
- package/standards/mcp-tools/sketch-mcp.md +497 -0
- package/standards/patterns/design-system-restoration.md +570 -0
- package/standards/syntax-mapping.md +256 -0
- package/standards/workflows/design-restoration.md +401 -0
- package/templates/README.md +14 -0
- package/templates/design-measurement/README.md +81 -0
- package/templates/design-measurement/component-measurement.js +52 -0
- package/templates/design-measurement/gap-measurement.js +79 -0
- package/templates/design-measurement/style-extraction.js +109 -0
- package/common/i18n.md +0 -385
- package/common/typescript-strict.md +0 -186
- package/troubleshooting/README.md +0 -368
- package/troubleshooting/USAGE_GUIDE.md +0 -289
- package/troubleshooting/flutter/clip-/351/230/264/345/275/261/350/243/201/345/211/252.md +0 -244
- package/troubleshooting/flutter/component-/351/200/232/347/224/250/345/214/226/346/217/220/345/217/226.md +0 -269
- package/troubleshooting/flutter/input-/345/255/227/346/256/265/347/274/272/345/244/261.md +0 -240
- package/troubleshooting/flutter/input-/350/276/271/346/241/206/351/227/256/351/242/230.md +0 -236
- package/troubleshooting/flutter/layout-/345/260/272/345/257/270/344/270/215/345/214/271/351/205/215.md +0 -214
- package/troubleshooting/flutter/shadow-/351/200/217/345/207/272/351/227/256/351/242/230.md +0 -172
- package/troubleshooting/flutter/sketch-/345/210/227/350/241/250item/345/214/272/345/237/237.md +0 -212
- package/troubleshooting/flutter/sketch-/345/233/276/346/240/207/345/260/272/345/257/270.md +0 -135
- package/troubleshooting/flutter/sketch-/345/256/214/346/225/264/346/217/220/345/217/226.md +0 -201
- package/troubleshooting/flutter/sketch-/345/261/236/346/200/247/346/234/252/344/275/277/347/224/250.md +0 -139
- package/troubleshooting/flutter/sketch-/350/203/214/346/231/257/345/261/202/351/253/230/345/272/246.md +0 -264
- package/troubleshooting/flutter/svg-/346/234/252/345/261/205/344/270/255.md +0 -120
- package/troubleshooting/flutter/svg-/351/242/234/350/211/262/345/274/202/345/270/270.md +0 -117
- package/troubleshooting/flutter/tabbar-/345/212/250/347/224/273/345/220/214/346/255/245.md +0 -107
- package/troubleshooting/flutter/withopacity-/345/274/203/347/224/250.md +0 -81
- package/troubleshooting/vue3/cascader-/350/257/257/346/233/277/346/215/242.md +0 -130
- package/troubleshooting/vue3/drawer-input-/346/240/267/345/274/217.md +0 -181
- package/troubleshooting/vue3/table-/347/274/226/350/276/221/345/217/226/346/266/210.md +0 -148
- package/troubleshooting/vue3/table-/350/276/271/346/241/206/351/227/256/351/242/230.md +0 -178
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// src/core/logger.ts
|
|
2
|
+
var LOG_LEVEL_NAMES = {
|
|
3
|
+
[0 /* DEBUG */]: "DEBUG",
|
|
4
|
+
[1 /* INFO */]: "INFO",
|
|
5
|
+
[2 /* WARN */]: "WARN",
|
|
6
|
+
[3 /* ERROR */]: "ERROR",
|
|
7
|
+
[4 /* SILENT */]: "SILENT"
|
|
8
|
+
};
|
|
9
|
+
var globalConfig = {
|
|
10
|
+
level: process.env.DEBUG ? 0 /* DEBUG */ : 1 /* INFO */,
|
|
11
|
+
timestamp: false,
|
|
12
|
+
prefix: "[MCP]"
|
|
13
|
+
};
|
|
14
|
+
var Logger = class _Logger {
|
|
15
|
+
constructor(name, config) {
|
|
16
|
+
this.name = name || "";
|
|
17
|
+
this.config = { ...globalConfig, ...config };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 格式化日志消息
|
|
21
|
+
*/
|
|
22
|
+
format(level, message, ...args) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (this.config.timestamp) {
|
|
25
|
+
parts.push((/* @__PURE__ */ new Date()).toISOString());
|
|
26
|
+
}
|
|
27
|
+
parts.push(this.config.prefix);
|
|
28
|
+
if (this.name) {
|
|
29
|
+
parts.push(`[${this.name}]`);
|
|
30
|
+
}
|
|
31
|
+
parts.push(`[${LOG_LEVEL_NAMES[level]}]`);
|
|
32
|
+
parts.push(message);
|
|
33
|
+
if (args.length > 0) {
|
|
34
|
+
const formatted = args.map((arg) => {
|
|
35
|
+
if (typeof arg === "object") {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.stringify(arg, null, 2);
|
|
38
|
+
} catch {
|
|
39
|
+
return String(arg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return String(arg);
|
|
43
|
+
});
|
|
44
|
+
parts.push(...formatted);
|
|
45
|
+
}
|
|
46
|
+
return parts.join(" ");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 检查日志级别是否应该输出
|
|
50
|
+
*/
|
|
51
|
+
shouldLog(level) {
|
|
52
|
+
return level >= this.config.level;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 调试日志
|
|
56
|
+
*/
|
|
57
|
+
debug(message, ...args) {
|
|
58
|
+
if (this.shouldLog(0 /* DEBUG */)) {
|
|
59
|
+
console.error(this.format(0 /* DEBUG */, message, ...args));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 信息日志
|
|
64
|
+
*/
|
|
65
|
+
info(message, ...args) {
|
|
66
|
+
if (this.shouldLog(1 /* INFO */)) {
|
|
67
|
+
console.error(this.format(1 /* INFO */, message, ...args));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 简化的 log 方法(等同于 info)
|
|
72
|
+
*/
|
|
73
|
+
log(message, ...args) {
|
|
74
|
+
this.info(message, ...args);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 警告日志
|
|
78
|
+
*/
|
|
79
|
+
warn(message, ...args) {
|
|
80
|
+
if (this.shouldLog(2 /* WARN */)) {
|
|
81
|
+
console.error(this.format(2 /* WARN */, message, ...args));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 错误日志
|
|
86
|
+
*/
|
|
87
|
+
error(message, ...args) {
|
|
88
|
+
if (this.shouldLog(3 /* ERROR */)) {
|
|
89
|
+
console.error(this.format(3 /* ERROR */, message, ...args));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 创建子 Logger
|
|
94
|
+
*/
|
|
95
|
+
child(name) {
|
|
96
|
+
const childName = this.name ? `${this.name}:${name}` : name;
|
|
97
|
+
return new _Logger(childName, this.config);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var logger = new Logger();
|
|
101
|
+
function createLogger(name) {
|
|
102
|
+
return new Logger(name);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/core/autoConfig.ts
|
|
106
|
+
var CACHE_DURATION = 5 * 60 * 1e3;
|
|
107
|
+
|
|
108
|
+
// src/skills/memory.ts
|
|
109
|
+
var logger2 = createLogger("Skills:Memory");
|
|
110
|
+
var memoryStore = /* @__PURE__ */ new Map();
|
|
111
|
+
async function storeMemory(key, value) {
|
|
112
|
+
memoryStore.set(key, value);
|
|
113
|
+
logger2.info(`\u5DF2\u5B58\u50A8\u8BB0\u5FC6: ${key}`);
|
|
114
|
+
}
|
|
115
|
+
async function retrieveMemory(key) {
|
|
116
|
+
const value = memoryStore.get(key);
|
|
117
|
+
if (value) {
|
|
118
|
+
logger2.info(`\u68C0\u7D22\u8BB0\u5FC6: ${key}`);
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
logger2.warn(`\u8BB0\u5FC6\u4E0D\u5B58\u5728: ${key}`);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
async function listMemories() {
|
|
125
|
+
const result = {};
|
|
126
|
+
for (const [key, value] of memoryStore.entries()) {
|
|
127
|
+
result[key] = value;
|
|
128
|
+
}
|
|
129
|
+
logger2.info(`\u5217\u51FA\u6240\u6709\u8BB0\u5FC6\uFF0C\u5171 ${memoryStore.size} \u6761`);
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
async function handleStoreMemory(args) {
|
|
133
|
+
const { key, value } = args;
|
|
134
|
+
if (!key || !value) {
|
|
135
|
+
return {
|
|
136
|
+
error: "\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: key \u548C value"
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
await storeMemory(key, value);
|
|
140
|
+
return {
|
|
141
|
+
success: true,
|
|
142
|
+
message: `\u5DF2\u5B58\u50A8\u8BB0\u5FC6: ${key}`
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async function handleRetrieveMemory(args) {
|
|
146
|
+
const { key } = args;
|
|
147
|
+
if (!key) {
|
|
148
|
+
return {
|
|
149
|
+
error: "\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: key"
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const value = await retrieveMemory(key);
|
|
153
|
+
if (value === null) {
|
|
154
|
+
return {
|
|
155
|
+
found: false,
|
|
156
|
+
message: `\u8BB0\u5FC6\u4E0D\u5B58\u5728: ${key}`
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
found: true,
|
|
161
|
+
key,
|
|
162
|
+
value
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async function handleListMemories() {
|
|
166
|
+
const memories = await listMemories();
|
|
167
|
+
return {
|
|
168
|
+
count: Object.keys(memories).length,
|
|
169
|
+
memories
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
var MEMORY_TOOLS = [
|
|
173
|
+
{
|
|
174
|
+
name: "store_memory",
|
|
175
|
+
description: "\u5B58\u50A8\u4E00\u6761\u8BB0\u5FC6\uFF0C\u7528\u4E8E\u8DE8\u4F1A\u8BDD\u4FDD\u5B58\u9879\u76EE\u7EA6\u5B9A\u3001\u4E1A\u52A1\u89C4\u5219\u7B49\u4FE1\u606F",
|
|
176
|
+
inputSchema: {
|
|
177
|
+
type: "object",
|
|
178
|
+
properties: {
|
|
179
|
+
key: {
|
|
180
|
+
type: "string",
|
|
181
|
+
description: "\u8BB0\u5FC6\u7684\u952E\uFF08\u552F\u4E00\u6807\u8BC6\uFF09"
|
|
182
|
+
},
|
|
183
|
+
value: {
|
|
184
|
+
type: "string",
|
|
185
|
+
description: "\u8BB0\u5FC6\u7684\u5185\u5BB9"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
required: ["key", "value"]
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
name: "retrieve_memory",
|
|
193
|
+
description: "\u68C0\u7D22\u4E00\u6761\u8BB0\u5FC6",
|
|
194
|
+
inputSchema: {
|
|
195
|
+
type: "object",
|
|
196
|
+
properties: {
|
|
197
|
+
key: {
|
|
198
|
+
type: "string",
|
|
199
|
+
description: "\u8BB0\u5FC6\u7684\u952E"
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
required: ["key"]
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
name: "list_memories",
|
|
207
|
+
description: "\u5217\u51FA\u6240\u6709\u5B58\u50A8\u7684\u8BB0\u5FC6",
|
|
208
|
+
inputSchema: {
|
|
209
|
+
type: "object",
|
|
210
|
+
properties: {}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
];
|
|
214
|
+
export {
|
|
215
|
+
MEMORY_TOOLS,
|
|
216
|
+
handleListMemories,
|
|
217
|
+
handleRetrieveMemory,
|
|
218
|
+
handleStoreMemory,
|
|
219
|
+
listMemories,
|
|
220
|
+
retrieveMemory,
|
|
221
|
+
storeMemory
|
|
222
|
+
};
|
|
223
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/logger.ts","../../src/core/autoConfig.ts","../../src/skills/memory.ts"],"sourcesContent":["/**\n * MCP 日志模块\n * \n * 统一的日志接口,支持不同级别和格式化输出\n * MCP 服务器通过 stderr 输出日志,避免污染 stdout\n * \n * @module core/logger\n */\n\n/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4\n}\n\n/**\n * 日志级别名称\n */\nconst LOG_LEVEL_NAMES: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.SILENT]: 'SILENT'\n};\n\n/**\n * 日志配置\n */\ninterface LoggerConfig {\n /** 最小日志级别 */\n level: LogLevel;\n /** 是否显示时间戳 */\n timestamp: boolean;\n /** 前缀 */\n prefix: string;\n}\n\n/**\n * 全局日志配置\n */\nlet globalConfig: LoggerConfig = {\n level: process.env.DEBUG ? LogLevel.DEBUG : LogLevel.INFO,\n timestamp: false,\n prefix: '[MCP]'\n};\n\n/**\n * Logger 类\n */\nexport class Logger {\n private readonly name: string;\n private readonly config: LoggerConfig;\n \n constructor(name?: string, config?: Partial<LoggerConfig>) {\n this.name = name || '';\n this.config = { ...globalConfig, ...config };\n }\n \n /**\n * 格式化日志消息\n */\n private format(level: LogLevel, message: string, ...args: unknown[]): string {\n const parts: string[] = [];\n \n if (this.config.timestamp) {\n parts.push(new Date().toISOString());\n }\n \n parts.push(this.config.prefix);\n \n if (this.name) {\n parts.push(`[${this.name}]`);\n }\n \n parts.push(`[${LOG_LEVEL_NAMES[level]}]`);\n parts.push(message);\n \n // 处理额外参数\n if (args.length > 0) {\n const formatted = args.map(arg => {\n if (typeof arg === 'object') {\n try {\n return JSON.stringify(arg, null, 2);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n });\n parts.push(...formatted);\n }\n \n return parts.join(' ');\n }\n \n /**\n * 检查日志级别是否应该输出\n */\n private shouldLog(level: LogLevel): boolean {\n return level >= this.config.level;\n }\n \n /**\n * 调试日志\n */\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.error(this.format(LogLevel.DEBUG, message, ...args));\n }\n }\n \n /**\n * 信息日志\n */\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.error(this.format(LogLevel.INFO, message, ...args));\n }\n }\n \n /**\n * 简化的 log 方法(等同于 info)\n */\n log(message: string, ...args: unknown[]): void {\n this.info(message, ...args);\n }\n \n /**\n * 警告日志\n */\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.error(this.format(LogLevel.WARN, message, ...args));\n }\n }\n \n /**\n * 错误日志\n */\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.format(LogLevel.ERROR, message, ...args));\n }\n }\n \n /**\n * 创建子 Logger\n */\n child(name: string): Logger {\n const childName = this.name ? `${this.name}:${name}` : name;\n return new Logger(childName, this.config);\n }\n}\n\n/**\n * 配置全局日志\n */\nexport function configureLogger(config: Partial<LoggerConfig>): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * 设置日志级别\n */\nexport function setLogLevel(level: LogLevel): void {\n globalConfig.level = level;\n}\n\n/**\n * 默认 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带名称的 Logger\n */\nexport function createLogger(name: string): Logger {\n return new Logger(name);\n}\n\n/**\n * 工具函数:计时日志\n */\nexport function createTimer(logger: Logger, operation: string): () => void {\n const start = Date.now();\n logger.debug(`开始: ${operation}`);\n \n return () => {\n const duration = Date.now() - start;\n logger.debug(`完成: ${operation} (${duration}ms)`);\n };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * 自动配置检测与修复\n * 当 AI 调用任何工具时,自动检测并修复配置问题\n */\n\nexport interface ConfigCheckResult {\n needsSetup: boolean;\n wasFixed: boolean;\n workspacePath: string;\n message?: string;\n}\n\n// 已检测过的工作区缓存(避免重复检测)\nconst checkedWorkspaces = new Map<string, { configured: boolean; timestamp: number }>();\nconst CACHE_DURATION = 5 * 60 * 1000; // 5 分钟缓存\n\n/**\n * 检测并自动修复工作区配置\n * 使用缓存避免重复检测,只在首次或缓存过期时执行\n * @param workspacePath 工作区路径\n * @returns 配置检测结果\n */\nexport function ensureWorkspaceConfig(workspacePath: string): ConfigCheckResult {\n const result: ConfigCheckResult = {\n needsSetup: false,\n wasFixed: false,\n workspacePath\n };\n \n if (!workspacePath || !fs.existsSync(workspacePath)) {\n return result;\n }\n \n // 检查缓存\n const cached = checkedWorkspaces.get(workspacePath);\n const now = Date.now();\n \n if (cached && cached.configured && (now - cached.timestamp) < CACHE_DURATION) {\n // 缓存有效且已配置,直接返回\n return result;\n }\n \n const vscodeDir = path.join(workspacePath, '.vscode');\n const mcpJsonPath = path.join(vscodeDir, 'mcp.json');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n \n // 快速检查是否已配置(只读取文件,不修改)\n let hasMtaConfig = false;\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n hasMtaConfig = !!(config.servers?.mta || config.mcpServers?.mta);\n } catch {\n // 配置文件损坏\n }\n }\n \n if (hasMtaConfig) {\n // 已配置,更新缓存并返回\n checkedWorkspaces.set(workspacePath, { configured: true, timestamp: now });\n return result;\n }\n \n // 需要配置,自动修复\n result.needsSetup = true;\n \n try {\n // 创建 .vscode 目录\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n \n // 创建或更新 mcp.json\n let mcpConfig: any = { servers: {} };\n if (fs.existsSync(mcpJsonPath)) {\n try {\n mcpConfig = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (!mcpConfig.servers) {\n mcpConfig.servers = {};\n }\n } catch {\n mcpConfig = { servers: {} };\n }\n }\n \n mcpConfig.servers.mta = {\n command: 'npx',\n args: ['-y', 'mta-mcp'],\n env: {}\n };\n \n fs.writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2));\n \n // 更新 settings.json 启用 MCP\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));\n } catch {\n settings = {};\n }\n }\n \n if (!settings['github.copilot.chat.mcp.enabled']) {\n settings['github.copilot.chat.mcp.enabled'] = true;\n fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n }\n \n result.wasFixed = true;\n result.message = `✅ 已自动为 ${path.basename(workspacePath)} 配置 MTA MCP。请重新加载 VS Code 窗口使配置生效。`;\n \n // 更新缓存\n checkedWorkspaces.set(workspacePath, { configured: true, timestamp: now });\n \n } catch (error) {\n result.message = `⚠️ 自动配置失败: ${error instanceof Error ? error.message : String(error)}`;\n }\n \n return result;\n}\n\n/**\n * 包装工具响应,添加自动配置信息\n */\nexport function wrapResponseWithConfigInfo(\n response: any,\n configResult: ConfigCheckResult\n): any {\n if (!configResult.wasFixed) {\n return response;\n }\n \n // 在响应中添加配置修复信息\n if (typeof response === 'object' && response !== null) {\n return {\n ...response,\n _autoConfig: {\n wasFixed: true,\n message: configResult.message,\n action: '请运行命令: Cmd+Shift+P → \"重新加载窗口\" 使配置生效'\n }\n };\n }\n \n return response;\n}\n","/**\n * Memory Skill - 跨会话记忆\n * 基于内存的简单 KV 存储,记住项目业务逻辑和约定\n */\n\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger('Skills:Memory');\n\n// 内存存储(简单实现)\nconst memoryStore = new Map<string, string>();\n\n/**\n * 存储记忆\n */\nexport async function storeMemory(key: string, value: string): Promise<void> {\n memoryStore.set(key, value);\n logger.info(`已存储记忆: ${key}`);\n}\n\n/**\n * 检索记忆\n */\nexport async function retrieveMemory(key: string): Promise<string | null> {\n const value = memoryStore.get(key);\n if (value) {\n logger.info(`检索记忆: ${key}`);\n return value;\n }\n logger.warn(`记忆不存在: ${key}`);\n return null;\n}\n\n/**\n * 列出所有记忆\n */\nexport async function listMemories(): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n for (const [key, value] of memoryStore.entries()) {\n result[key] = value;\n }\n logger.info(`列出所有记忆,共 ${memoryStore.size} 条`);\n return result;\n}\n\n/**\n * 处理 store_memory 工具调用\n */\nexport async function handleStoreMemory(args: any): Promise<any> {\n const { key, value } = args;\n \n if (!key || !value) {\n return {\n error: '缺少必需参数: key 和 value'\n };\n }\n \n await storeMemory(key, value);\n \n return {\n success: true,\n message: `已存储记忆: ${key}`\n };\n}\n\n/**\n * 处理 retrieve_memory 工具调用\n */\nexport async function handleRetrieveMemory(args: any): Promise<any> {\n const { key } = args;\n \n if (!key) {\n return {\n error: '缺少必需参数: key'\n };\n }\n \n const value = await retrieveMemory(key);\n \n if (value === null) {\n return {\n found: false,\n message: `记忆不存在: ${key}`\n };\n }\n \n return {\n found: true,\n key,\n value\n };\n}\n\n/**\n * 处理 list_memories 工具调用\n */\nexport async function handleListMemories(): Promise<any> {\n const memories = await listMemories();\n \n return {\n count: Object.keys(memories).length,\n memories\n };\n}\n\n// 导出工具定义\nexport const MEMORY_TOOLS = [\n {\n name: 'store_memory',\n description: '存储一条记忆,用于跨会话保存项目约定、业务规则等信息',\n inputSchema: {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n description: '记忆的键(唯一标识)'\n },\n value: {\n type: 'string',\n description: '记忆的内容'\n }\n },\n required: ['key', 'value']\n }\n },\n {\n name: 'retrieve_memory',\n description: '检索一条记忆',\n inputSchema: {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n description: '记忆的键'\n }\n },\n required: ['key']\n }\n },\n {\n name: 'list_memories',\n description: '列出所有存储的记忆',\n inputSchema: {\n type: 'object',\n properties: {}\n }\n }\n];\n"],"mappings":"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","names":["logger"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sequential Thinking Skill - 复杂问题分步思考
|
|
3
|
+
* 用于架构设计和重构规划
|
|
4
|
+
*/
|
|
5
|
+
interface ThinkingStep {
|
|
6
|
+
step: number;
|
|
7
|
+
title: string;
|
|
8
|
+
analysis: string;
|
|
9
|
+
conclusion?: string;
|
|
10
|
+
}
|
|
11
|
+
interface ThinkingResult {
|
|
12
|
+
problem: string;
|
|
13
|
+
steps: ThinkingStep[];
|
|
14
|
+
finalConclusion: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 分步思考复杂问题
|
|
19
|
+
*/
|
|
20
|
+
declare function thinkStepByStep(problem: string, context?: string): Promise<ThinkingResult>;
|
|
21
|
+
/**
|
|
22
|
+
* 处理 think_step_by_step 工具调用
|
|
23
|
+
*/
|
|
24
|
+
declare function handleThinkStepByStep(args: any): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* 获取思考历史
|
|
27
|
+
*/
|
|
28
|
+
declare function getThinkingHistory(): ThinkingResult[];
|
|
29
|
+
declare const THINKING_TOOLS: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: string;
|
|
34
|
+
properties: {
|
|
35
|
+
problem: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
context: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
required: string[];
|
|
45
|
+
};
|
|
46
|
+
}[];
|
|
47
|
+
|
|
48
|
+
export { THINKING_TOOLS, getThinkingHistory, handleThinkStepByStep, thinkStepByStep };
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// src/core/logger.ts
|
|
2
|
+
var LOG_LEVEL_NAMES = {
|
|
3
|
+
[0 /* DEBUG */]: "DEBUG",
|
|
4
|
+
[1 /* INFO */]: "INFO",
|
|
5
|
+
[2 /* WARN */]: "WARN",
|
|
6
|
+
[3 /* ERROR */]: "ERROR",
|
|
7
|
+
[4 /* SILENT */]: "SILENT"
|
|
8
|
+
};
|
|
9
|
+
var globalConfig = {
|
|
10
|
+
level: process.env.DEBUG ? 0 /* DEBUG */ : 1 /* INFO */,
|
|
11
|
+
timestamp: false,
|
|
12
|
+
prefix: "[MCP]"
|
|
13
|
+
};
|
|
14
|
+
var Logger = class _Logger {
|
|
15
|
+
constructor(name, config) {
|
|
16
|
+
this.name = name || "";
|
|
17
|
+
this.config = { ...globalConfig, ...config };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 格式化日志消息
|
|
21
|
+
*/
|
|
22
|
+
format(level, message, ...args) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (this.config.timestamp) {
|
|
25
|
+
parts.push((/* @__PURE__ */ new Date()).toISOString());
|
|
26
|
+
}
|
|
27
|
+
parts.push(this.config.prefix);
|
|
28
|
+
if (this.name) {
|
|
29
|
+
parts.push(`[${this.name}]`);
|
|
30
|
+
}
|
|
31
|
+
parts.push(`[${LOG_LEVEL_NAMES[level]}]`);
|
|
32
|
+
parts.push(message);
|
|
33
|
+
if (args.length > 0) {
|
|
34
|
+
const formatted = args.map((arg) => {
|
|
35
|
+
if (typeof arg === "object") {
|
|
36
|
+
try {
|
|
37
|
+
return JSON.stringify(arg, null, 2);
|
|
38
|
+
} catch {
|
|
39
|
+
return String(arg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return String(arg);
|
|
43
|
+
});
|
|
44
|
+
parts.push(...formatted);
|
|
45
|
+
}
|
|
46
|
+
return parts.join(" ");
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 检查日志级别是否应该输出
|
|
50
|
+
*/
|
|
51
|
+
shouldLog(level) {
|
|
52
|
+
return level >= this.config.level;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 调试日志
|
|
56
|
+
*/
|
|
57
|
+
debug(message, ...args) {
|
|
58
|
+
if (this.shouldLog(0 /* DEBUG */)) {
|
|
59
|
+
console.error(this.format(0 /* DEBUG */, message, ...args));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 信息日志
|
|
64
|
+
*/
|
|
65
|
+
info(message, ...args) {
|
|
66
|
+
if (this.shouldLog(1 /* INFO */)) {
|
|
67
|
+
console.error(this.format(1 /* INFO */, message, ...args));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 简化的 log 方法(等同于 info)
|
|
72
|
+
*/
|
|
73
|
+
log(message, ...args) {
|
|
74
|
+
this.info(message, ...args);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 警告日志
|
|
78
|
+
*/
|
|
79
|
+
warn(message, ...args) {
|
|
80
|
+
if (this.shouldLog(2 /* WARN */)) {
|
|
81
|
+
console.error(this.format(2 /* WARN */, message, ...args));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 错误日志
|
|
86
|
+
*/
|
|
87
|
+
error(message, ...args) {
|
|
88
|
+
if (this.shouldLog(3 /* ERROR */)) {
|
|
89
|
+
console.error(this.format(3 /* ERROR */, message, ...args));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 创建子 Logger
|
|
94
|
+
*/
|
|
95
|
+
child(name) {
|
|
96
|
+
const childName = this.name ? `${this.name}:${name}` : name;
|
|
97
|
+
return new _Logger(childName, this.config);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var logger = new Logger();
|
|
101
|
+
function createLogger(name) {
|
|
102
|
+
return new Logger(name);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/core/autoConfig.ts
|
|
106
|
+
var CACHE_DURATION = 5 * 60 * 1e3;
|
|
107
|
+
|
|
108
|
+
// src/skills/thinking.ts
|
|
109
|
+
var logger2 = createLogger("Skills:Thinking");
|
|
110
|
+
var thinkingHistory = [];
|
|
111
|
+
async function thinkStepByStep(problem, context) {
|
|
112
|
+
logger2.info(`\u5F00\u59CB\u5206\u6B65\u601D\u8003: ${problem}`);
|
|
113
|
+
const steps = [
|
|
114
|
+
{
|
|
115
|
+
step: 1,
|
|
116
|
+
title: "\u95EE\u9898\u5206\u6790",
|
|
117
|
+
analysis: `\u5206\u6790\u95EE\u9898: ${problem}
|
|
118
|
+
${context ? `\u4E0A\u4E0B\u6587: ${context}` : ""}`
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
step: 2,
|
|
122
|
+
title: "\u62C6\u89E3\u5B50\u95EE\u9898",
|
|
123
|
+
analysis: "\u5C06\u95EE\u9898\u62C6\u89E3\u4E3A\u591A\u4E2A\u53EF\u7BA1\u7406\u7684\u5B50\u95EE\u9898"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
step: 3,
|
|
127
|
+
title: "\u8BC4\u4F30\u65B9\u6848",
|
|
128
|
+
analysis: "\u8BC4\u4F30\u4E0D\u540C\u7684\u89E3\u51B3\u65B9\u6848\u53CA\u5176\u4F18\u7F3A\u70B9"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
step: 4,
|
|
132
|
+
title: "\u9009\u62E9\u6700\u4F18\u65B9\u6848",
|
|
133
|
+
analysis: "\u57FA\u4E8E\u8BC4\u4F30\u7ED3\u679C\u9009\u62E9\u6700\u9002\u5408\u7684\u65B9\u6848"
|
|
134
|
+
}
|
|
135
|
+
];
|
|
136
|
+
const result = {
|
|
137
|
+
problem,
|
|
138
|
+
steps,
|
|
139
|
+
finalConclusion: "\u7B49\u5F85 AI \u8865\u5145\u5177\u4F53\u7684\u601D\u8003\u5185\u5BB9",
|
|
140
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
141
|
+
};
|
|
142
|
+
thinkingHistory.push(result);
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
async function handleThinkStepByStep(args) {
|
|
146
|
+
const { problem, context } = args;
|
|
147
|
+
if (!problem) {
|
|
148
|
+
return {
|
|
149
|
+
error: "\u7F3A\u5C11\u5FC5\u9700\u53C2\u6570: problem"
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const result = await thinkStepByStep(problem, context);
|
|
154
|
+
return {
|
|
155
|
+
success: true,
|
|
156
|
+
thinking: result,
|
|
157
|
+
guidance: [
|
|
158
|
+
"1. \u8FD9\u662F\u4E00\u4E2A\u601D\u8003\u6846\u67B6\uFF0C\u8BF7\u57FA\u4E8E\u6B64\u6846\u67B6\u5C55\u5F00\u8BE6\u7EC6\u5206\u6790",
|
|
159
|
+
"2. \u6BCF\u4E00\u6B65\u90FD\u9700\u8981\u6DF1\u5165\u601D\u8003\uFF0C\u4E0D\u8981\u6025\u4E8E\u5F97\u51FA\u7ED3\u8BBA",
|
|
160
|
+
"3. \u8003\u8651\u591A\u4E2A\u89D2\u5EA6\u548C\u53EF\u80FD\u7684\u5F71\u54CD",
|
|
161
|
+
"4. \u5728\u6700\u540E\u4E00\u6B65\u7ED9\u51FA\u660E\u786E\u7684\u5EFA\u8BAE\u6216\u7ED3\u8BBA"
|
|
162
|
+
]
|
|
163
|
+
};
|
|
164
|
+
} catch (error) {
|
|
165
|
+
return {
|
|
166
|
+
error: error.message
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function getThinkingHistory() {
|
|
171
|
+
return thinkingHistory;
|
|
172
|
+
}
|
|
173
|
+
var THINKING_TOOLS = [
|
|
174
|
+
{
|
|
175
|
+
name: "think_step_by_step",
|
|
176
|
+
description: "\u5BF9\u590D\u6742\u95EE\u9898\u8FDB\u884C\u5206\u6B65\u601D\u8003\uFF0C\u9002\u7528\u4E8E\u67B6\u6784\u8BBE\u8BA1\u3001\u91CD\u6784\u89C4\u5212\u7B49\u9700\u8981\u6DF1\u5EA6\u5206\u6790\u7684\u573A\u666F",
|
|
177
|
+
inputSchema: {
|
|
178
|
+
type: "object",
|
|
179
|
+
properties: {
|
|
180
|
+
problem: {
|
|
181
|
+
type: "string",
|
|
182
|
+
description: "\u9700\u8981\u6DF1\u5165\u601D\u8003\u7684\u95EE\u9898\u6216\u4EFB\u52A1"
|
|
183
|
+
},
|
|
184
|
+
context: {
|
|
185
|
+
type: "string",
|
|
186
|
+
description: "\u76F8\u5173\u80CC\u666F\u4FE1\u606F\u6216\u7EA6\u675F\u6761\u4EF6\uFF08\u53EF\u9009\uFF09"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
required: ["problem"]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
];
|
|
193
|
+
export {
|
|
194
|
+
THINKING_TOOLS,
|
|
195
|
+
getThinkingHistory,
|
|
196
|
+
handleThinkStepByStep,
|
|
197
|
+
thinkStepByStep
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=thinking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/logger.ts","../../src/core/autoConfig.ts","../../src/skills/thinking.ts"],"sourcesContent":["/**\n * MCP 日志模块\n * \n * 统一的日志接口,支持不同级别和格式化输出\n * MCP 服务器通过 stderr 输出日志,避免污染 stdout\n * \n * @module core/logger\n */\n\n/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4\n}\n\n/**\n * 日志级别名称\n */\nconst LOG_LEVEL_NAMES: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.SILENT]: 'SILENT'\n};\n\n/**\n * 日志配置\n */\ninterface LoggerConfig {\n /** 最小日志级别 */\n level: LogLevel;\n /** 是否显示时间戳 */\n timestamp: boolean;\n /** 前缀 */\n prefix: string;\n}\n\n/**\n * 全局日志配置\n */\nlet globalConfig: LoggerConfig = {\n level: process.env.DEBUG ? LogLevel.DEBUG : LogLevel.INFO,\n timestamp: false,\n prefix: '[MCP]'\n};\n\n/**\n * Logger 类\n */\nexport class Logger {\n private readonly name: string;\n private readonly config: LoggerConfig;\n \n constructor(name?: string, config?: Partial<LoggerConfig>) {\n this.name = name || '';\n this.config = { ...globalConfig, ...config };\n }\n \n /**\n * 格式化日志消息\n */\n private format(level: LogLevel, message: string, ...args: unknown[]): string {\n const parts: string[] = [];\n \n if (this.config.timestamp) {\n parts.push(new Date().toISOString());\n }\n \n parts.push(this.config.prefix);\n \n if (this.name) {\n parts.push(`[${this.name}]`);\n }\n \n parts.push(`[${LOG_LEVEL_NAMES[level]}]`);\n parts.push(message);\n \n // 处理额外参数\n if (args.length > 0) {\n const formatted = args.map(arg => {\n if (typeof arg === 'object') {\n try {\n return JSON.stringify(arg, null, 2);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n });\n parts.push(...formatted);\n }\n \n return parts.join(' ');\n }\n \n /**\n * 检查日志级别是否应该输出\n */\n private shouldLog(level: LogLevel): boolean {\n return level >= this.config.level;\n }\n \n /**\n * 调试日志\n */\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n console.error(this.format(LogLevel.DEBUG, message, ...args));\n }\n }\n \n /**\n * 信息日志\n */\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n console.error(this.format(LogLevel.INFO, message, ...args));\n }\n }\n \n /**\n * 简化的 log 方法(等同于 info)\n */\n log(message: string, ...args: unknown[]): void {\n this.info(message, ...args);\n }\n \n /**\n * 警告日志\n */\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n console.error(this.format(LogLevel.WARN, message, ...args));\n }\n }\n \n /**\n * 错误日志\n */\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n console.error(this.format(LogLevel.ERROR, message, ...args));\n }\n }\n \n /**\n * 创建子 Logger\n */\n child(name: string): Logger {\n const childName = this.name ? `${this.name}:${name}` : name;\n return new Logger(childName, this.config);\n }\n}\n\n/**\n * 配置全局日志\n */\nexport function configureLogger(config: Partial<LoggerConfig>): void {\n globalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * 设置日志级别\n */\nexport function setLogLevel(level: LogLevel): void {\n globalConfig.level = level;\n}\n\n/**\n * 默认 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带名称的 Logger\n */\nexport function createLogger(name: string): Logger {\n return new Logger(name);\n}\n\n/**\n * 工具函数:计时日志\n */\nexport function createTimer(logger: Logger, operation: string): () => void {\n const start = Date.now();\n logger.debug(`开始: ${operation}`);\n \n return () => {\n const duration = Date.now() - start;\n logger.debug(`完成: ${operation} (${duration}ms)`);\n };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * 自动配置检测与修复\n * 当 AI 调用任何工具时,自动检测并修复配置问题\n */\n\nexport interface ConfigCheckResult {\n needsSetup: boolean;\n wasFixed: boolean;\n workspacePath: string;\n message?: string;\n}\n\n// 已检测过的工作区缓存(避免重复检测)\nconst checkedWorkspaces = new Map<string, { configured: boolean; timestamp: number }>();\nconst CACHE_DURATION = 5 * 60 * 1000; // 5 分钟缓存\n\n/**\n * 检测并自动修复工作区配置\n * 使用缓存避免重复检测,只在首次或缓存过期时执行\n * @param workspacePath 工作区路径\n * @returns 配置检测结果\n */\nexport function ensureWorkspaceConfig(workspacePath: string): ConfigCheckResult {\n const result: ConfigCheckResult = {\n needsSetup: false,\n wasFixed: false,\n workspacePath\n };\n \n if (!workspacePath || !fs.existsSync(workspacePath)) {\n return result;\n }\n \n // 检查缓存\n const cached = checkedWorkspaces.get(workspacePath);\n const now = Date.now();\n \n if (cached && cached.configured && (now - cached.timestamp) < CACHE_DURATION) {\n // 缓存有效且已配置,直接返回\n return result;\n }\n \n const vscodeDir = path.join(workspacePath, '.vscode');\n const mcpJsonPath = path.join(vscodeDir, 'mcp.json');\n const settingsPath = path.join(vscodeDir, 'settings.json');\n \n // 快速检查是否已配置(只读取文件,不修改)\n let hasMtaConfig = false;\n if (fs.existsSync(mcpJsonPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n hasMtaConfig = !!(config.servers?.mta || config.mcpServers?.mta);\n } catch {\n // 配置文件损坏\n }\n }\n \n if (hasMtaConfig) {\n // 已配置,更新缓存并返回\n checkedWorkspaces.set(workspacePath, { configured: true, timestamp: now });\n return result;\n }\n \n // 需要配置,自动修复\n result.needsSetup = true;\n \n try {\n // 创建 .vscode 目录\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n \n // 创建或更新 mcp.json\n let mcpConfig: any = { servers: {} };\n if (fs.existsSync(mcpJsonPath)) {\n try {\n mcpConfig = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));\n if (!mcpConfig.servers) {\n mcpConfig.servers = {};\n }\n } catch {\n mcpConfig = { servers: {} };\n }\n }\n \n mcpConfig.servers.mta = {\n command: 'npx',\n args: ['-y', 'mta-mcp'],\n env: {}\n };\n \n fs.writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2));\n \n // 更新 settings.json 启用 MCP\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));\n } catch {\n settings = {};\n }\n }\n \n if (!settings['github.copilot.chat.mcp.enabled']) {\n settings['github.copilot.chat.mcp.enabled'] = true;\n fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));\n }\n \n result.wasFixed = true;\n result.message = `✅ 已自动为 ${path.basename(workspacePath)} 配置 MTA MCP。请重新加载 VS Code 窗口使配置生效。`;\n \n // 更新缓存\n checkedWorkspaces.set(workspacePath, { configured: true, timestamp: now });\n \n } catch (error) {\n result.message = `⚠️ 自动配置失败: ${error instanceof Error ? error.message : String(error)}`;\n }\n \n return result;\n}\n\n/**\n * 包装工具响应,添加自动配置信息\n */\nexport function wrapResponseWithConfigInfo(\n response: any,\n configResult: ConfigCheckResult\n): any {\n if (!configResult.wasFixed) {\n return response;\n }\n \n // 在响应中添加配置修复信息\n if (typeof response === 'object' && response !== null) {\n return {\n ...response,\n _autoConfig: {\n wasFixed: true,\n message: configResult.message,\n action: '请运行命令: Cmd+Shift+P → \"重新加载窗口\" 使配置生效'\n }\n };\n }\n \n return response;\n}\n","/**\n * Sequential Thinking Skill - 复杂问题分步思考\n * 用于架构设计和重构规划\n */\n\nimport { createLogger } from '../core/index.js';\n\nconst logger = createLogger('Skills:Thinking');\n\ninterface ThinkingStep {\n step: number;\n title: string;\n analysis: string;\n conclusion?: string;\n}\n\ninterface ThinkingResult {\n problem: string;\n steps: ThinkingStep[];\n finalConclusion: string;\n createdAt: string;\n}\n\n// 存储思考历史\nconst thinkingHistory: ThinkingResult[] = [];\n\n/**\n * 分步思考复杂问题\n */\nexport async function thinkStepByStep(\n problem: string,\n context?: string\n): Promise<ThinkingResult> {\n logger.info(`开始分步思考: ${problem}`);\n \n // 这是一个框架,实际的思考逻辑由 AI 提供\n // 这里只是记录和结构化思考过程\n \n const steps: ThinkingStep[] = [\n {\n step: 1,\n title: '问题分析',\n analysis: `分析问题: ${problem}\\n${context ? `上下文: ${context}` : ''}`\n },\n {\n step: 2,\n title: '拆解子问题',\n analysis: '将问题拆解为多个可管理的子问题'\n },\n {\n step: 3,\n title: '评估方案',\n analysis: '评估不同的解决方案及其优缺点'\n },\n {\n step: 4,\n title: '选择最优方案',\n analysis: '基于评估结果选择最适合的方案'\n }\n ];\n \n const result: ThinkingResult = {\n problem,\n steps,\n finalConclusion: '等待 AI 补充具体的思考内容',\n createdAt: new Date().toISOString()\n };\n \n thinkingHistory.push(result);\n \n return result;\n}\n\n/**\n * 处理 think_step_by_step 工具调用\n */\nexport async function handleThinkStepByStep(args: any): Promise<any> {\n const { problem, context } = args;\n \n if (!problem) {\n return {\n error: '缺少必需参数: problem'\n };\n }\n \n try {\n const result = await thinkStepByStep(problem, context);\n \n return {\n success: true,\n thinking: result,\n guidance: [\n '1. 这是一个思考框架,请基于此框架展开详细分析',\n '2. 每一步都需要深入思考,不要急于得出结论',\n '3. 考虑多个角度和可能的影响',\n '4. 在最后一步给出明确的建议或结论'\n ]\n };\n } catch (error: any) {\n return {\n error: error.message\n };\n }\n}\n\n/**\n * 获取思考历史\n */\nexport function getThinkingHistory(): ThinkingResult[] {\n return thinkingHistory;\n}\n\n// 导出工具定义\nexport const THINKING_TOOLS = [\n {\n name: 'think_step_by_step',\n description: '对复杂问题进行分步思考,适用于架构设计、重构规划等需要深度分析的场景',\n inputSchema: {\n type: 'object',\n properties: {\n problem: {\n type: 'string',\n description: '需要深入思考的问题或任务'\n },\n context: {\n type: 'string',\n description: '相关背景信息或约束条件(可选)'\n }\n },\n required: ['problem']\n }\n }\n];\n"],"mappings":"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","names":["logger"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills 版本检测工具
|
|
3
|
+
*
|
|
4
|
+
* 检测 skills.json 中定义的 Skills 是否有更新版本
|
|
5
|
+
*/
|
|
6
|
+
interface VersionInfo {
|
|
7
|
+
id: string;
|
|
8
|
+
package: string;
|
|
9
|
+
currentVersion: string;
|
|
10
|
+
latestVersion: string | null;
|
|
11
|
+
needsUpdate: boolean;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 检测所有 Skills 的版本
|
|
16
|
+
*/
|
|
17
|
+
declare function checkSkillsVersions(): Promise<VersionInfo[]>;
|
|
18
|
+
/**
|
|
19
|
+
* 更新 skills.json 中的版本号
|
|
20
|
+
*/
|
|
21
|
+
declare function updateSkillsVersions(skillIds?: string[]): Promise<{
|
|
22
|
+
updated: string[];
|
|
23
|
+
failed: string[];
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* 格式化版本检测结果(用于 CLI 输出)
|
|
27
|
+
*/
|
|
28
|
+
declare function formatVersionCheckResult(results: VersionInfo[]): string;
|
|
29
|
+
|
|
30
|
+
export { checkSkillsVersions, formatVersionCheckResult, updateSkillsVersions };
|