mta-mcp 3.1.0 → 3.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/agents/_TEMPLATE.md +26 -0
- package/agents/flutter.agent.md +16 -10
- package/agents/i18n.agent.md +21 -0
- package/agents/logicflow.agent.md +22 -0
- package/agents/mta.agent.md +35 -0
- package/agents/vue3.agent.md +16 -10
- package/agents/wechat-miniprogram.agent.md +22 -0
- package/bin/mta.cjs +0 -98
- package/dist/index.js +948 -1355
- package/dist/index.js.map +1 -1
- package/package.json +6 -8
- package/dist/skills/filesystem.d.ts +0 -96
- package/dist/skills/filesystem.js +0 -269
- package/dist/skills/filesystem.js.map +0 -1
- package/dist/skills/http.d.ts +0 -73
- package/dist/skills/http.js +0 -234
- package/dist/skills/http.js.map +0 -1
- package/dist/skills/index.d.ts +0 -79
- package/dist/skills/index.js +0 -206
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/memory.d.ts +0 -73
- package/dist/skills/memory.js +0 -223
- package/dist/skills/memory.js.map +0 -1
- package/dist/skills/thinking.d.ts +0 -48
- package/dist/skills/thinking.js +0 -199
- package/dist/skills/thinking.js.map +0 -1
- package/dist/skills/versionChecker.d.ts +0 -30
- package/dist/skills/versionChecker.js +0 -225
- package/dist/skills/versionChecker.js.map +0 -1
- package/skills.json +0 -68
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
// src/skills/versionChecker.ts
|
|
2
|
-
import axios from "axios";
|
|
3
|
-
import * as fs from "fs";
|
|
4
|
-
import * as path from "path";
|
|
5
|
-
import { fileURLToPath } from "url";
|
|
6
|
-
|
|
7
|
-
// src/core/logger.ts
|
|
8
|
-
var LOG_LEVEL_NAMES = {
|
|
9
|
-
[0 /* DEBUG */]: "DEBUG",
|
|
10
|
-
[1 /* INFO */]: "INFO",
|
|
11
|
-
[2 /* WARN */]: "WARN",
|
|
12
|
-
[3 /* ERROR */]: "ERROR",
|
|
13
|
-
[4 /* SILENT */]: "SILENT"
|
|
14
|
-
};
|
|
15
|
-
var globalConfig = {
|
|
16
|
-
level: process.env.DEBUG ? 0 /* DEBUG */ : 1 /* INFO */,
|
|
17
|
-
timestamp: false,
|
|
18
|
-
prefix: "[MCP]"
|
|
19
|
-
};
|
|
20
|
-
var Logger = class _Logger {
|
|
21
|
-
constructor(name, config) {
|
|
22
|
-
this.name = name || "";
|
|
23
|
-
this.config = { ...globalConfig, ...config };
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* 格式化日志消息
|
|
27
|
-
*/
|
|
28
|
-
format(level, message, ...args) {
|
|
29
|
-
const parts = [];
|
|
30
|
-
if (this.config.timestamp) {
|
|
31
|
-
parts.push((/* @__PURE__ */ new Date()).toISOString());
|
|
32
|
-
}
|
|
33
|
-
parts.push(this.config.prefix);
|
|
34
|
-
if (this.name) {
|
|
35
|
-
parts.push(`[${this.name}]`);
|
|
36
|
-
}
|
|
37
|
-
parts.push(`[${LOG_LEVEL_NAMES[level]}]`);
|
|
38
|
-
parts.push(message);
|
|
39
|
-
if (args.length > 0) {
|
|
40
|
-
const formatted = args.map((arg) => {
|
|
41
|
-
if (typeof arg === "object") {
|
|
42
|
-
try {
|
|
43
|
-
return JSON.stringify(arg, null, 2);
|
|
44
|
-
} catch {
|
|
45
|
-
return String(arg);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return String(arg);
|
|
49
|
-
});
|
|
50
|
-
parts.push(...formatted);
|
|
51
|
-
}
|
|
52
|
-
return parts.join(" ");
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 检查日志级别是否应该输出
|
|
56
|
-
*/
|
|
57
|
-
shouldLog(level) {
|
|
58
|
-
return level >= this.config.level;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* 调试日志
|
|
62
|
-
*/
|
|
63
|
-
debug(message, ...args) {
|
|
64
|
-
if (this.shouldLog(0 /* DEBUG */)) {
|
|
65
|
-
console.error(this.format(0 /* DEBUG */, message, ...args));
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* 信息日志
|
|
70
|
-
*/
|
|
71
|
-
info(message, ...args) {
|
|
72
|
-
if (this.shouldLog(1 /* INFO */)) {
|
|
73
|
-
console.error(this.format(1 /* INFO */, message, ...args));
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* 简化的 log 方法(等同于 info)
|
|
78
|
-
*/
|
|
79
|
-
log(message, ...args) {
|
|
80
|
-
this.info(message, ...args);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 警告日志
|
|
84
|
-
*/
|
|
85
|
-
warn(message, ...args) {
|
|
86
|
-
if (this.shouldLog(2 /* WARN */)) {
|
|
87
|
-
console.error(this.format(2 /* WARN */, message, ...args));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* 错误日志
|
|
92
|
-
*/
|
|
93
|
-
error(message, ...args) {
|
|
94
|
-
if (this.shouldLog(3 /* ERROR */)) {
|
|
95
|
-
console.error(this.format(3 /* ERROR */, message, ...args));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 创建子 Logger
|
|
100
|
-
*/
|
|
101
|
-
child(name) {
|
|
102
|
-
const childName = this.name ? `${this.name}:${name}` : name;
|
|
103
|
-
return new _Logger(childName, this.config);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
var logger = new Logger();
|
|
107
|
-
function createLogger(name) {
|
|
108
|
-
return new Logger(name);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// src/core/autoConfig.ts
|
|
112
|
-
var CACHE_DURATION = 5 * 60 * 1e3;
|
|
113
|
-
|
|
114
|
-
// src/skills/versionChecker.ts
|
|
115
|
-
var __filename = fileURLToPath(import.meta.url);
|
|
116
|
-
var __dirname = path.dirname(__filename);
|
|
117
|
-
var logger2 = createLogger("Skills:Version");
|
|
118
|
-
async function fetchLatestVersion(packageName) {
|
|
119
|
-
try {
|
|
120
|
-
const response = await axios.get(`https://registry.npmjs.org/${packageName}/latest`, {
|
|
121
|
-
timeout: 1e4
|
|
122
|
-
});
|
|
123
|
-
return response.data.version || null;
|
|
124
|
-
} catch (error) {
|
|
125
|
-
logger2.warn(`\u83B7\u53D6 ${packageName} \u7248\u672C\u5931\u8D25`);
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
function semverGt(v1, v2) {
|
|
130
|
-
const parse = (v) => v.split(".").map((n) => parseInt(n, 10) || 0);
|
|
131
|
-
const [a1, a2, a3] = parse(v1);
|
|
132
|
-
const [b1, b2, b3] = parse(v2);
|
|
133
|
-
if (a1 !== b1) return a1 > b1;
|
|
134
|
-
if (a2 !== b2) return a2 > b2;
|
|
135
|
-
return a3 > b3;
|
|
136
|
-
}
|
|
137
|
-
async function checkSkillsVersions() {
|
|
138
|
-
const registryPath = path.join(__dirname, "../../skills.json");
|
|
139
|
-
if (!fs.existsSync(registryPath)) {
|
|
140
|
-
logger2.error("skills.json \u4E0D\u5B58\u5728");
|
|
141
|
-
return [];
|
|
142
|
-
}
|
|
143
|
-
const registry = JSON.parse(fs.readFileSync(registryPath, "utf-8"));
|
|
144
|
-
const results = [];
|
|
145
|
-
logger2.info("\u5F00\u59CB\u68C0\u6D4B Skills \u7248\u672C...");
|
|
146
|
-
for (const [id, skill] of Object.entries(registry.skills)) {
|
|
147
|
-
const latestVersion = await fetchLatestVersion(skill.package);
|
|
148
|
-
results.push({
|
|
149
|
-
id,
|
|
150
|
-
package: skill.package,
|
|
151
|
-
currentVersion: skill.version,
|
|
152
|
-
latestVersion,
|
|
153
|
-
needsUpdate: latestVersion ? semverGt(latestVersion, skill.version) : false,
|
|
154
|
-
enabled: skill.enabled
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
registry.lastCheck = (/* @__PURE__ */ new Date()).toISOString();
|
|
158
|
-
fs.writeFileSync(registryPath, JSON.stringify(registry, null, 2), "utf-8");
|
|
159
|
-
return results;
|
|
160
|
-
}
|
|
161
|
-
async function updateSkillsVersions(skillIds) {
|
|
162
|
-
const registryPath = path.join(__dirname, "../../skills.json");
|
|
163
|
-
if (!fs.existsSync(registryPath)) {
|
|
164
|
-
logger2.error("skills.json \u4E0D\u5B58\u5728");
|
|
165
|
-
return { updated: [], failed: [] };
|
|
166
|
-
}
|
|
167
|
-
const registry = JSON.parse(fs.readFileSync(registryPath, "utf-8"));
|
|
168
|
-
const updated = [];
|
|
169
|
-
const failed = [];
|
|
170
|
-
const targetSkills = skillIds || Object.keys(registry.skills);
|
|
171
|
-
for (const id of targetSkills) {
|
|
172
|
-
const skill = registry.skills[id];
|
|
173
|
-
if (!skill) {
|
|
174
|
-
failed.push(id);
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
const latestVersion = await fetchLatestVersion(skill.package);
|
|
178
|
-
if (latestVersion && semverGt(latestVersion, skill.version)) {
|
|
179
|
-
registry.skills[id].version = latestVersion;
|
|
180
|
-
updated.push(id);
|
|
181
|
-
logger2.info(`${id}: ${skill.version} -> ${latestVersion}`);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
if (updated.length > 0) {
|
|
185
|
-
registry.lastCheck = (/* @__PURE__ */ new Date()).toISOString();
|
|
186
|
-
fs.writeFileSync(registryPath, JSON.stringify(registry, null, 2), "utf-8");
|
|
187
|
-
logger2.info(`\u5DF2\u66F4\u65B0 ${updated.length} \u4E2A Skills \u7248\u672C`);
|
|
188
|
-
}
|
|
189
|
-
return { updated, failed };
|
|
190
|
-
}
|
|
191
|
-
function formatVersionCheckResult(results) {
|
|
192
|
-
const lines = [];
|
|
193
|
-
lines.push("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
|
|
194
|
-
lines.push("\u2502 MTA Skills \u7248\u672C\u68C0\u6D4B \u2502");
|
|
195
|
-
lines.push("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524");
|
|
196
|
-
lines.push("\u2502 Skill \u2502 \u5F53\u524D\u7248\u672C \u2502 \u6700\u65B0\u7248\u672C \u2502 \u72B6\u6001 \u2502");
|
|
197
|
-
lines.push("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524");
|
|
198
|
-
for (const info of results) {
|
|
199
|
-
const skillName = info.id.padEnd(18);
|
|
200
|
-
const current = info.currentVersion.padEnd(8);
|
|
201
|
-
const latest = (info.latestVersion || "?").padEnd(8);
|
|
202
|
-
let status;
|
|
203
|
-
if (!info.enabled) {
|
|
204
|
-
status = "\u23F8\uFE0F \u672A\u542F\u7528";
|
|
205
|
-
} else if (info.needsUpdate) {
|
|
206
|
-
status = "\u{1F504} \u53EF\u66F4\u65B0";
|
|
207
|
-
} else {
|
|
208
|
-
status = "\u2705 \u6700\u65B0";
|
|
209
|
-
}
|
|
210
|
-
lines.push(`\u2502 ${skillName} \u2502 ${current} \u2502 ${latest} \u2502 ${status.padEnd(13)} \u2502`);
|
|
211
|
-
}
|
|
212
|
-
lines.push("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518");
|
|
213
|
-
const updatable = results.filter((r) => r.needsUpdate).length;
|
|
214
|
-
if (updatable > 0) {
|
|
215
|
-
lines.push("");
|
|
216
|
-
lines.push(`\u{1F4A1} \u6709 ${updatable} \u4E2A Skills \u53EF\u66F4\u65B0\uFF0C\u8FD0\u884C: npx mta-mcp --update-skills`);
|
|
217
|
-
}
|
|
218
|
-
return lines.join("\n");
|
|
219
|
-
}
|
|
220
|
-
export {
|
|
221
|
-
checkSkillsVersions,
|
|
222
|
-
formatVersionCheckResult,
|
|
223
|
-
updateSkillsVersions
|
|
224
|
-
};
|
|
225
|
-
//# sourceMappingURL=versionChecker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/skills/versionChecker.ts","../../src/core/logger.ts","../../src/core/autoConfig.ts"],"sourcesContent":["/**\n * Skills 版本检测工具\n * \n * 检测 skills.json 中定义的 Skills 是否有更新版本\n */\n\nimport axios from 'axios';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createLogger } from '../core/index.js';\n\n// ESM 模块兼容:获取 __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst logger = createLogger('Skills:Version');\n\ninterface VersionInfo {\n id: string;\n package: string;\n currentVersion: string;\n latestVersion: string | null;\n needsUpdate: boolean;\n enabled: boolean;\n}\n\n/**\n * 从 npm registry 获取包的最新版本\n */\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n try {\n const response = await axios.get(`https://registry.npmjs.org/${packageName}/latest`, {\n timeout: 10000\n });\n return response.data.version || null;\n } catch (error) {\n logger.warn(`获取 ${packageName} 版本失败`);\n return null;\n }\n}\n\n/**\n * 简单的语义版本比较\n */\nfunction semverGt(v1: string, v2: string): boolean {\n const parse = (v: string) => v.split('.').map(n => parseInt(n, 10) || 0);\n const [a1, a2, a3] = parse(v1);\n const [b1, b2, b3] = parse(v2);\n \n if (a1 !== b1) return a1 > b1;\n if (a2 !== b2) return a2 > b2;\n return a3 > b3;\n}\n\n/**\n * 检测所有 Skills 的版本\n */\nexport async function checkSkillsVersions(): Promise<VersionInfo[]> {\n const registryPath = path.join(__dirname, '../../skills.json');\n \n if (!fs.existsSync(registryPath)) {\n logger.error('skills.json 不存在');\n return [];\n }\n \n const registry = JSON.parse(fs.readFileSync(registryPath, 'utf-8'));\n const results: VersionInfo[] = [];\n \n logger.info('开始检测 Skills 版本...');\n \n for (const [id, skill] of Object.entries(registry.skills) as [string, any][]) {\n const latestVersion = await fetchLatestVersion(skill.package);\n \n results.push({\n id,\n package: skill.package,\n currentVersion: skill.version,\n latestVersion,\n needsUpdate: latestVersion ? semverGt(latestVersion, skill.version) : false,\n enabled: skill.enabled\n });\n }\n \n // 更新 lastCheck 时间\n registry.lastCheck = new Date().toISOString();\n fs.writeFileSync(registryPath, JSON.stringify(registry, null, 2), 'utf-8');\n \n return results;\n}\n\n/**\n * 更新 skills.json 中的版本号\n */\nexport async function updateSkillsVersions(skillIds?: string[]): Promise<{ updated: string[]; failed: string[] }> {\n const registryPath = path.join(__dirname, '../../skills.json');\n \n if (!fs.existsSync(registryPath)) {\n logger.error('skills.json 不存在');\n return { updated: [], failed: [] };\n }\n \n const registry = JSON.parse(fs.readFileSync(registryPath, 'utf-8'));\n const updated: string[] = [];\n const failed: string[] = [];\n \n const targetSkills = skillIds || Object.keys(registry.skills);\n \n for (const id of targetSkills) {\n const skill = registry.skills[id];\n if (!skill) {\n failed.push(id);\n continue;\n }\n \n const latestVersion = await fetchLatestVersion(skill.package);\n \n if (latestVersion && semverGt(latestVersion, skill.version)) {\n registry.skills[id].version = latestVersion;\n updated.push(id);\n logger.info(`${id}: ${skill.version} -> ${latestVersion}`);\n }\n }\n \n if (updated.length > 0) {\n registry.lastCheck = new Date().toISOString();\n fs.writeFileSync(registryPath, JSON.stringify(registry, null, 2), 'utf-8');\n logger.info(`已更新 ${updated.length} 个 Skills 版本`);\n }\n \n return { updated, failed };\n}\n\n/**\n * 格式化版本检测结果(用于 CLI 输出)\n */\nexport function formatVersionCheckResult(results: VersionInfo[]): string {\n const lines: string[] = [];\n \n lines.push('┌───────────────────────────────────────────────────────────┐');\n lines.push('│ MTA Skills 版本检测 │');\n lines.push('├────────────────────┬──────────┬──────────┬────────────────┤');\n lines.push('│ Skill │ 当前版本 │ 最新版本 │ 状态 │');\n lines.push('├────────────────────┼──────────┼──────────┼────────────────┤');\n \n for (const info of results) {\n const skillName = info.id.padEnd(18);\n const current = info.currentVersion.padEnd(8);\n const latest = (info.latestVersion || '?').padEnd(8);\n \n let status: string;\n if (!info.enabled) {\n status = '⏸️ 未启用';\n } else if (info.needsUpdate) {\n status = '🔄 可更新';\n } else {\n status = '✅ 最新';\n }\n \n lines.push(`│ ${skillName} │ ${current} │ ${latest} │ ${status.padEnd(13)} │`);\n }\n \n lines.push('└────────────────────┴──────────┴──────────┴────────────────┘');\n \n const updatable = results.filter(r => r.needsUpdate).length;\n if (updatable > 0) {\n lines.push('');\n lines.push(`💡 有 ${updatable} 个 Skills 可更新,运行: npx mta-mcp --update-skills`);\n }\n \n return lines.join('\\n');\n}\n","/**\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"],"mappings":"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","names":["logger"]}
|
package/skills.json
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"lastCheck": "2026-01-22T07:30:39.972Z",
|
|
5
|
-
"skills": {
|
|
6
|
-
"fetch": {
|
|
7
|
-
"package": "@anthropic-ai/sdk",
|
|
8
|
-
"version": "0.71.2",
|
|
9
|
-
"enabled": true,
|
|
10
|
-
"description": "HTTP 请求能力,可发送 GET/POST 等请求",
|
|
11
|
-
"tools": [
|
|
12
|
-
"http_request"
|
|
13
|
-
],
|
|
14
|
-
"category": "api"
|
|
15
|
-
},
|
|
16
|
-
"memory": {
|
|
17
|
-
"package": "@modelcontextprotocol/server-memory",
|
|
18
|
-
"version": "2025.11.25",
|
|
19
|
-
"enabled": true,
|
|
20
|
-
"description": "跨会话记忆,记住项目业务逻辑和约定",
|
|
21
|
-
"tools": [
|
|
22
|
-
"store_memory",
|
|
23
|
-
"retrieve_memory",
|
|
24
|
-
"list_memories"
|
|
25
|
-
],
|
|
26
|
-
"category": "context"
|
|
27
|
-
},
|
|
28
|
-
"filesystem": {
|
|
29
|
-
"package": "@modelcontextprotocol/server-filesystem",
|
|
30
|
-
"version": "2026.1.14",
|
|
31
|
-
"enabled": true,
|
|
32
|
-
"description": "高级文件操作,批量处理和模式匹配",
|
|
33
|
-
"tools": [
|
|
34
|
-
"glob_files",
|
|
35
|
-
"batch_rename"
|
|
36
|
-
],
|
|
37
|
-
"category": "filesystem"
|
|
38
|
-
},
|
|
39
|
-
"sequential-thinking": {
|
|
40
|
-
"package": "@modelcontextprotocol/server-sequential-thinking",
|
|
41
|
-
"version": "2025.12.18",
|
|
42
|
-
"enabled": true,
|
|
43
|
-
"description": "复杂问题分步思考,架构设计和重构规划",
|
|
44
|
-
"tools": [
|
|
45
|
-
"think_step_by_step"
|
|
46
|
-
],
|
|
47
|
-
"category": "thinking"
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"categories": {
|
|
51
|
-
"api": {
|
|
52
|
-
"name": "API 请求",
|
|
53
|
-
"icon": "globe"
|
|
54
|
-
},
|
|
55
|
-
"context": {
|
|
56
|
-
"name": "上下文记忆",
|
|
57
|
-
"icon": "book"
|
|
58
|
-
},
|
|
59
|
-
"filesystem": {
|
|
60
|
-
"name": "文件系统",
|
|
61
|
-
"icon": "files"
|
|
62
|
-
},
|
|
63
|
-
"thinking": {
|
|
64
|
-
"name": "思维增强",
|
|
65
|
-
"icon": "lightbulb"
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|