mcp-probe-kit 2.0.2 → 2.1.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.
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 文档模板配置
3
+ *
4
+ * 根据项目类型(category)定义需要生成的文档列表
5
+ */
6
+ export interface DocumentTemplate {
7
+ filename: string;
8
+ title: string;
9
+ purpose: string;
10
+ }
11
+ /**
12
+ * 根据项目类型获取文档列表
13
+ */
14
+ export declare function getDocumentTemplates(category: string): DocumentTemplate[];
@@ -0,0 +1,248 @@
1
+ /**
2
+ * 文档模板配置
3
+ *
4
+ * 根据项目类型(category)定义需要生成的文档列表
5
+ */
6
+ /**
7
+ * 根据项目类型获取文档列表
8
+ */
9
+ export function getDocumentTemplates(category) {
10
+ const templates = documentTemplatesByCategory[category];
11
+ if (!templates) {
12
+ // 未知类型,返回通用模板
13
+ return documentTemplatesByCategory['unknown'];
14
+ }
15
+ return templates;
16
+ }
17
+ /**
18
+ * 各类型项目的文档模板配置
19
+ */
20
+ const documentTemplatesByCategory = {
21
+ // 后端 API 项目
22
+ 'backend-api': [
23
+ {
24
+ filename: 'how-to-add-api.md',
25
+ title: '如何添加新接口',
26
+ purpose: '指导开发者如何在项目中添加新的 API 接口'
27
+ },
28
+ {
29
+ filename: 'how-to-database.md',
30
+ title: '如何操作数据库',
31
+ purpose: '指导开发者如何连接和操作数据库'
32
+ },
33
+ {
34
+ filename: 'how-to-auth.md',
35
+ title: '如何处理认证',
36
+ purpose: '指导开发者如何实现用户认证和授权'
37
+ },
38
+ {
39
+ filename: 'how-to-test.md',
40
+ title: '如何编写测试',
41
+ purpose: '指导开发者如何编写单元测试和集成测试'
42
+ },
43
+ {
44
+ filename: 'how-to-deploy.md',
45
+ title: '如何部署',
46
+ purpose: '指导开发者如何部署应用到生产环境'
47
+ }
48
+ ],
49
+ // 前端 SPA 项目
50
+ 'frontend-spa': [
51
+ {
52
+ filename: 'how-to-new-page.md',
53
+ title: '如何创建新页面',
54
+ purpose: '指导开发者如何创建新的页面组件'
55
+ },
56
+ {
57
+ filename: 'how-to-call-api.md',
58
+ title: '如何调用 API',
59
+ purpose: '指导开发者如何调用后端 API 接口'
60
+ },
61
+ {
62
+ filename: 'how-to-state.md',
63
+ title: '如何管理状态',
64
+ purpose: '指导开发者如何使用状态管理工具'
65
+ },
66
+ {
67
+ filename: 'how-to-routing.md',
68
+ title: '如何处理路由',
69
+ purpose: '指导开发者如何配置和使用路由'
70
+ },
71
+ {
72
+ filename: 'how-to-styling.md',
73
+ title: '如何处理样式',
74
+ purpose: '指导开发者如何编写和组织样式代码'
75
+ }
76
+ ],
77
+ // 全栈项目
78
+ 'fullstack': [
79
+ {
80
+ filename: 'how-to-new-feature.md',
81
+ title: '如何开发新功能',
82
+ purpose: '指导开发者如何开发前后端联动的新功能'
83
+ },
84
+ {
85
+ filename: 'how-to-api-route.md',
86
+ title: '如何添加 API 路由',
87
+ purpose: '指导开发者如何添加服务端 API 路由'
88
+ },
89
+ {
90
+ filename: 'how-to-new-page.md',
91
+ title: '如何创建新页面',
92
+ purpose: '指导开发者如何创建新的页面'
93
+ },
94
+ {
95
+ filename: 'how-to-database.md',
96
+ title: '如何操作数据库',
97
+ purpose: '指导开发者如何连接和操作数据库'
98
+ },
99
+ {
100
+ filename: 'how-to-deploy.md',
101
+ title: '如何部署',
102
+ purpose: '指导开发者如何部署全栈应用'
103
+ }
104
+ ],
105
+ // 移动端项目
106
+ 'mobile': [
107
+ {
108
+ filename: 'how-to-new-screen.md',
109
+ title: '如何创建新屏幕',
110
+ purpose: '指导开发者如何创建新的屏幕页面'
111
+ },
112
+ {
113
+ filename: 'how-to-navigation.md',
114
+ title: '如何处理导航',
115
+ purpose: '指导开发者如何配置和使用导航'
116
+ },
117
+ {
118
+ filename: 'how-to-api.md',
119
+ title: '如何调用 API',
120
+ purpose: '指导开发者如何调用后端 API'
121
+ },
122
+ {
123
+ filename: 'how-to-state.md',
124
+ title: '如何管理状态',
125
+ purpose: '指导开发者如何管理应用状态'
126
+ },
127
+ {
128
+ filename: 'how-to-build.md',
129
+ title: '如何构建和发布',
130
+ purpose: '指导开发者如何构建和发布应用'
131
+ }
132
+ ],
133
+ // 桌面应用项目
134
+ 'desktop': [
135
+ {
136
+ filename: 'how-to-new-window.md',
137
+ title: '如何创建新窗口',
138
+ purpose: '指导开发者如何创建新的窗口'
139
+ },
140
+ {
141
+ filename: 'how-to-ipc.md',
142
+ title: '如何进程通信',
143
+ purpose: '指导开发者如何实现主进程和渲染进程通信'
144
+ },
145
+ {
146
+ filename: 'how-to-native.md',
147
+ title: '如何调用原生 API',
148
+ purpose: '指导开发者如何调用系统原生 API'
149
+ },
150
+ {
151
+ filename: 'how-to-package.md',
152
+ title: '如何打包',
153
+ purpose: '指导开发者如何打包桌面应用'
154
+ }
155
+ ],
156
+ // 数据科学项目
157
+ 'data-science': [
158
+ {
159
+ filename: 'how-to-new-analysis.md',
160
+ title: '如何开始新分析',
161
+ purpose: '指导开发者如何创建新的数据分析任务'
162
+ },
163
+ {
164
+ filename: 'how-to-data-load.md',
165
+ title: '如何加载数据',
166
+ purpose: '指导开发者如何加载和预处理数据'
167
+ },
168
+ {
169
+ filename: 'how-to-visualize.md',
170
+ title: '如何可视化',
171
+ purpose: '指导开发者如何创建数据可视化'
172
+ },
173
+ {
174
+ filename: 'how-to-model.md',
175
+ title: '如何训练模型',
176
+ purpose: '指导开发者如何训练和评估机器学习模型'
177
+ }
178
+ ],
179
+ // CLI 工具项目
180
+ 'cli': [
181
+ {
182
+ filename: 'how-to-new-command.md',
183
+ title: '如何添加新命令',
184
+ purpose: '指导开发者如何添加新的 CLI 命令'
185
+ },
186
+ {
187
+ filename: 'how-to-args.md',
188
+ title: '如何处理参数',
189
+ purpose: '指导开发者如何解析和验证命令行参数'
190
+ },
191
+ {
192
+ filename: 'how-to-test.md',
193
+ title: '如何测试',
194
+ purpose: '指导开发者如何测试 CLI 工具'
195
+ },
196
+ {
197
+ filename: 'how-to-publish.md',
198
+ title: '如何发布',
199
+ purpose: '指导开发者如何发布 CLI 工具'
200
+ }
201
+ ],
202
+ // 库/SDK 项目
203
+ 'library': [
204
+ {
205
+ filename: 'how-to-new-api.md',
206
+ title: '如何添加新 API',
207
+ purpose: '指导开发者如何添加新的公共 API'
208
+ },
209
+ {
210
+ filename: 'how-to-test.md',
211
+ title: '如何测试',
212
+ purpose: '指导开发者如何编写测试'
213
+ },
214
+ {
215
+ filename: 'how-to-docs.md',
216
+ title: '如何写文档',
217
+ purpose: '指导开发者如何编写 API 文档'
218
+ },
219
+ {
220
+ filename: 'how-to-publish.md',
221
+ title: '如何发布',
222
+ purpose: '指导开发者如何发布新版本'
223
+ }
224
+ ],
225
+ // 未知类型(通用)
226
+ 'unknown': [
227
+ {
228
+ filename: 'project-overview.md',
229
+ title: '项目概览',
230
+ purpose: '项目的基本信息和技术栈'
231
+ },
232
+ {
233
+ filename: 'project-structure.md',
234
+ title: '项目结构',
235
+ purpose: '项目的目录结构和代码组织'
236
+ },
237
+ {
238
+ filename: 'development-guide.md',
239
+ title: '开发指南',
240
+ purpose: '如何在项目中进行开发'
241
+ },
242
+ {
243
+ filename: 'testing-guide.md',
244
+ title: '测试指南',
245
+ purpose: '如何运行和编写测试'
246
+ }
247
+ ]
248
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 项目类型检测模块
3
+ *
4
+ * 功能:
5
+ * - 检测项目使用的编程语言
6
+ * - 检测项目使用的框架
7
+ * - 判断项目类型(后端/前端/全栈等)
8
+ */
9
+ export interface ProjectDetectionResult {
10
+ language: string;
11
+ category: string;
12
+ framework?: string;
13
+ confidence: number;
14
+ indicators: string[];
15
+ }
16
+ /**
17
+ * 检测项目类型
18
+ */
19
+ export declare function detectProjectType(projectRoot?: string): ProjectDetectionResult;
@@ -0,0 +1,344 @@
1
+ /**
2
+ * 项目类型检测模块
3
+ *
4
+ * 功能:
5
+ * - 检测项目使用的编程语言
6
+ * - 检测项目使用的框架
7
+ * - 判断项目类型(后端/前端/全栈等)
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ // 检测规则配置
12
+ const detectionRules = {
13
+ javascript: {
14
+ indicators: ['package.json'],
15
+ frameworks: {
16
+ // 后端框架
17
+ 'express': { deps: ['express'], category: 'backend-api' },
18
+ 'koa': { deps: ['koa'], category: 'backend-api' },
19
+ 'fastify': { deps: ['fastify'], category: 'backend-api' },
20
+ 'nestjs': { deps: ['@nestjs/core', '@nestjs/common'], category: 'backend-api' },
21
+ 'hapi': { deps: ['@hapi/hapi'], category: 'backend-api' },
22
+ // 前端框架
23
+ 'react': { deps: ['react'], category: 'frontend-spa' },
24
+ 'vue': { deps: ['vue'], category: 'frontend-spa' },
25
+ 'angular': { deps: ['@angular/core'], category: 'frontend-spa' },
26
+ 'svelte': { deps: ['svelte'], category: 'frontend-spa' },
27
+ // 全栈框架
28
+ 'nextjs': { deps: ['next'], category: 'fullstack' },
29
+ 'nuxtjs': { deps: ['nuxt'], category: 'fullstack' },
30
+ 'remix': { deps: ['@remix-run/react'], category: 'fullstack' },
31
+ 'sveltekit': { deps: ['@sveltejs/kit'], category: 'fullstack' },
32
+ // 移动端
33
+ 'react-native': { deps: ['react-native'], category: 'mobile' },
34
+ 'expo': { deps: ['expo'], category: 'mobile' },
35
+ // 桌面端
36
+ 'electron': { deps: ['electron'], category: 'desktop' },
37
+ 'tauri': { deps: ['@tauri-apps/api'], category: 'desktop' },
38
+ // MCP 服务器
39
+ 'mcp-server': { deps: ['@modelcontextprotocol/sdk'], category: 'library' }
40
+ }
41
+ },
42
+ python: {
43
+ indicators: ['requirements.txt', 'pyproject.toml', 'setup.py', 'Pipfile'],
44
+ frameworks: {
45
+ 'django': { deps: ['Django', 'django'], category: 'backend-api' },
46
+ 'flask': { deps: ['Flask', 'flask'], category: 'backend-api' },
47
+ 'fastapi': { deps: ['fastapi'], category: 'backend-api' },
48
+ 'tornado': { deps: ['tornado'], category: 'backend-api' },
49
+ 'jupyter': { deps: ['jupyter', 'notebook'], category: 'data-science' },
50
+ 'pandas': { deps: ['pandas'], category: 'data-science' },
51
+ 'numpy': { deps: ['numpy'], category: 'data-science' },
52
+ 'click': { deps: ['click'], category: 'cli' },
53
+ 'typer': { deps: ['typer'], category: 'cli' }
54
+ }
55
+ },
56
+ java: {
57
+ indicators: ['pom.xml', 'build.gradle', 'build.gradle.kts'],
58
+ frameworks: {
59
+ 'spring-boot': { deps: ['spring-boot-starter'], category: 'backend-api' },
60
+ 'spring-mvc': { deps: ['spring-webmvc'], category: 'backend-api' },
61
+ 'android': { files: ['AndroidManifest.xml'], category: 'mobile' },
62
+ 'quarkus': { deps: ['quarkus'], category: 'backend-api' },
63
+ 'micronaut': { deps: ['micronaut'], category: 'backend-api' }
64
+ }
65
+ },
66
+ go: {
67
+ indicators: ['go.mod'],
68
+ frameworks: {
69
+ 'gin': { imports: ['github.com/gin-gonic/gin'], category: 'backend-api' },
70
+ 'echo': { imports: ['github.com/labstack/echo'], category: 'backend-api' },
71
+ 'fiber': { imports: ['github.com/gofiber/fiber'], category: 'backend-api' },
72
+ 'chi': { imports: ['github.com/go-chi/chi'], category: 'backend-api' },
73
+ 'cobra': { imports: ['github.com/spf13/cobra'], category: 'cli' }
74
+ }
75
+ },
76
+ rust: {
77
+ indicators: ['Cargo.toml'],
78
+ frameworks: {
79
+ 'actix': { deps: ['actix-web'], category: 'backend-api' },
80
+ 'rocket': { deps: ['rocket'], category: 'backend-api' },
81
+ 'axum': { deps: ['axum'], category: 'backend-api' },
82
+ 'warp': { deps: ['warp'], category: 'backend-api' },
83
+ 'clap': { deps: ['clap'], category: 'cli' }
84
+ }
85
+ },
86
+ cpp: {
87
+ indicators: ['CMakeLists.txt', 'Makefile', 'meson.build'],
88
+ frameworks: {
89
+ 'qt': { files: ['*.pro', '*.qrc'], category: 'desktop' },
90
+ 'boost': { files: ['boost'], category: 'library' }
91
+ }
92
+ },
93
+ php: {
94
+ indicators: ['composer.json'],
95
+ frameworks: {
96
+ 'laravel': { deps: ['laravel/framework'], category: 'backend-api' },
97
+ 'symfony': { deps: ['symfony/symfony'], category: 'backend-api' },
98
+ 'codeigniter': { deps: ['codeigniter4/framework'], category: 'backend-api' }
99
+ }
100
+ },
101
+ ruby: {
102
+ indicators: ['Gemfile'],
103
+ frameworks: {
104
+ 'rails': { deps: ['rails'], category: 'backend-api' },
105
+ 'sinatra': { deps: ['sinatra'], category: 'backend-api' }
106
+ }
107
+ },
108
+ csharp: {
109
+ indicators: ['*.csproj', '*.sln'],
110
+ frameworks: {
111
+ 'aspnet-core': { files: ['Program.cs', 'Startup.cs'], category: 'backend-api' },
112
+ 'unity': { files: ['Assets', 'ProjectSettings'], category: 'desktop' }
113
+ }
114
+ }
115
+ };
116
+ /**
117
+ * 检测项目类型
118
+ */
119
+ export function detectProjectType(projectRoot = process.cwd()) {
120
+ const indicators = [];
121
+ let detectedLanguage = 'unknown';
122
+ let detectedFramework;
123
+ let detectedCategory = 'unknown';
124
+ let confidence = 0;
125
+ // 遍历所有语言的检测规则
126
+ for (const [language, rule] of Object.entries(detectionRules)) {
127
+ // 检查语言特征文件是否存在
128
+ const languageIndicator = rule.indicators.find(indicator => {
129
+ const filePath = path.join(projectRoot, indicator);
130
+ return fs.existsSync(filePath);
131
+ });
132
+ if (languageIndicator) {
133
+ detectedLanguage = language;
134
+ indicators.push(languageIndicator);
135
+ confidence = 50; // 基础置信度
136
+ // 检测框架
137
+ const frameworkResult = detectFramework(projectRoot, language, rule);
138
+ if (frameworkResult) {
139
+ detectedFramework = frameworkResult.framework;
140
+ detectedCategory = frameworkResult.category;
141
+ confidence = frameworkResult.confidence;
142
+ indicators.push(...frameworkResult.indicators);
143
+ }
144
+ break; // 找到语言后停止
145
+ }
146
+ }
147
+ // 如果没有检测到语言,尝试通过文件扩展名判断
148
+ if (detectedLanguage === 'unknown') {
149
+ const languageByExtension = detectLanguageByExtension(projectRoot);
150
+ if (languageByExtension) {
151
+ detectedLanguage = languageByExtension.language;
152
+ confidence = languageByExtension.confidence;
153
+ indicators.push(...languageByExtension.indicators);
154
+ }
155
+ }
156
+ return {
157
+ language: detectedLanguage,
158
+ category: detectedCategory,
159
+ framework: detectedFramework,
160
+ confidence,
161
+ indicators
162
+ };
163
+ }
164
+ /**
165
+ * 检测框架
166
+ */
167
+ function detectFramework(projectRoot, language, rule) {
168
+ for (const [framework, config] of Object.entries(rule.frameworks)) {
169
+ const indicators = [];
170
+ let matched = false;
171
+ // 检查依赖
172
+ if (config.deps) {
173
+ const deps = getDependencies(projectRoot, language);
174
+ if (deps && config.deps.some(dep => deps.includes(dep))) {
175
+ matched = true;
176
+ indicators.push(`dependency: ${config.deps.find(d => deps.includes(d))}`);
177
+ }
178
+ }
179
+ // 检查开发依赖
180
+ if (config.devDeps) {
181
+ const devDeps = getDevDependencies(projectRoot, language);
182
+ if (devDeps && config.devDeps.some(dep => devDeps.includes(dep))) {
183
+ matched = true;
184
+ indicators.push(`devDependency: ${config.devDeps.find(d => devDeps.includes(d))}`);
185
+ }
186
+ }
187
+ // 检查 imports
188
+ if (config.imports) {
189
+ const hasImport = checkImports(projectRoot, language, config.imports);
190
+ if (hasImport) {
191
+ matched = true;
192
+ indicators.push(`import: ${config.imports[0]}`);
193
+ }
194
+ }
195
+ // 检查特征文件
196
+ if (config.files) {
197
+ const hasFile = config.files.some(file => {
198
+ const filePath = path.join(projectRoot, file);
199
+ return fs.existsSync(filePath);
200
+ });
201
+ if (hasFile) {
202
+ matched = true;
203
+ indicators.push(`file: ${config.files[0]}`);
204
+ }
205
+ }
206
+ if (matched) {
207
+ return {
208
+ framework,
209
+ category: config.category,
210
+ confidence: 80,
211
+ indicators
212
+ };
213
+ }
214
+ }
215
+ return null;
216
+ }
217
+ /**
218
+ * 获取依赖列表
219
+ */
220
+ function getDependencies(projectRoot, language) {
221
+ try {
222
+ if (language === 'javascript') {
223
+ const pkgPath = path.join(projectRoot, 'package.json');
224
+ if (fs.existsSync(pkgPath)) {
225
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
226
+ return Object.keys(pkg.dependencies || {});
227
+ }
228
+ }
229
+ else if (language === 'python') {
230
+ const reqPath = path.join(projectRoot, 'requirements.txt');
231
+ if (fs.existsSync(reqPath)) {
232
+ const content = fs.readFileSync(reqPath, 'utf-8');
233
+ return content.split('\n')
234
+ .map(line => line.trim().split(/[=<>]/)[0])
235
+ .filter(Boolean);
236
+ }
237
+ }
238
+ else if (language === 'rust') {
239
+ const cargoPath = path.join(projectRoot, 'Cargo.toml');
240
+ if (fs.existsSync(cargoPath)) {
241
+ const content = fs.readFileSync(cargoPath, 'utf-8');
242
+ // 简单解析 TOML(只提取依赖名)
243
+ const deps = content.match(/\[dependencies\]([\s\S]*?)(\[|$)/)?.[1];
244
+ if (deps) {
245
+ return deps.split('\n')
246
+ .map(line => line.trim().split(/\s*=/)[0])
247
+ .filter(Boolean);
248
+ }
249
+ }
250
+ }
251
+ else if (language === 'go') {
252
+ const goModPath = path.join(projectRoot, 'go.mod');
253
+ if (fs.existsSync(goModPath)) {
254
+ const content = fs.readFileSync(goModPath, 'utf-8');
255
+ const requires = content.match(/require\s+\(([\s\S]*?)\)/)?.[1];
256
+ if (requires) {
257
+ return requires.split('\n')
258
+ .map(line => line.trim().split(/\s+/)[0])
259
+ .filter(Boolean);
260
+ }
261
+ }
262
+ }
263
+ }
264
+ catch (error) {
265
+ // 忽略解析错误
266
+ }
267
+ return null;
268
+ }
269
+ /**
270
+ * 获取开发依赖列表
271
+ */
272
+ function getDevDependencies(projectRoot, language) {
273
+ try {
274
+ if (language === 'javascript') {
275
+ const pkgPath = path.join(projectRoot, 'package.json');
276
+ if (fs.existsSync(pkgPath)) {
277
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
278
+ return Object.keys(pkg.devDependencies || {});
279
+ }
280
+ }
281
+ }
282
+ catch (error) {
283
+ // 忽略解析错误
284
+ }
285
+ return null;
286
+ }
287
+ /**
288
+ * 检查 imports
289
+ */
290
+ function checkImports(projectRoot, language, imports) {
291
+ // 简化实现:检查 go.mod 或主文件
292
+ if (language === 'go') {
293
+ const goModPath = path.join(projectRoot, 'go.mod');
294
+ if (fs.existsSync(goModPath)) {
295
+ const content = fs.readFileSync(goModPath, 'utf-8');
296
+ return imports.some(imp => content.includes(imp));
297
+ }
298
+ }
299
+ return false;
300
+ }
301
+ /**
302
+ * 通过文件扩展名检测语言
303
+ */
304
+ function detectLanguageByExtension(projectRoot) {
305
+ const extensionMap = {
306
+ '.js': 'javascript',
307
+ '.ts': 'javascript',
308
+ '.jsx': 'javascript',
309
+ '.tsx': 'javascript',
310
+ '.py': 'python',
311
+ '.java': 'java',
312
+ '.go': 'go',
313
+ '.rs': 'rust',
314
+ '.cpp': 'cpp',
315
+ '.cc': 'cpp',
316
+ '.c': 'cpp',
317
+ '.php': 'php',
318
+ '.rb': 'ruby',
319
+ '.cs': 'csharp'
320
+ };
321
+ try {
322
+ const srcDirs = ['src', 'lib', 'app', 'main'];
323
+ for (const dir of srcDirs) {
324
+ const dirPath = path.join(projectRoot, dir);
325
+ if (fs.existsSync(dirPath)) {
326
+ const files = fs.readdirSync(dirPath);
327
+ for (const file of files) {
328
+ const ext = path.extname(file);
329
+ if (extensionMap[ext]) {
330
+ return {
331
+ language: extensionMap[ext],
332
+ confidence: 30,
333
+ indicators: [`file extension: ${ext}`]
334
+ };
335
+ }
336
+ }
337
+ }
338
+ }
339
+ }
340
+ catch (error) {
341
+ // 忽略错误
342
+ }
343
+ return null;
344
+ }
@@ -20,6 +20,7 @@ export function okStructured(text, structuredContent, meta) {
20
20
  },
21
21
  ],
22
22
  structuredContent,
23
+ isError: false,
23
24
  };
24
25
  if (meta) {
25
26
  response._meta = meta;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 任务生成器
3
+ *
4
+ * 将分析任务转换为格式化的指导文本
5
+ */
6
+ import type { AnalysisTask } from './analysis-tasks.js';
7
+ import type { ProjectDetectionResult } from './project-detector.js';
8
+ /**
9
+ * 生成完整的分析任务指导文本
10
+ */
11
+ export declare function generateTaskGuide(detection: ProjectDetectionResult, tasks: AnalysisTask[], docsDir: string): string;