repowiki-core 0.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/dist/analyzer/api-analyzer.d.ts +22 -0
- package/dist/analyzer/api-analyzer.d.ts.map +1 -0
- package/dist/analyzer/api-analyzer.js +272 -0
- package/dist/analyzer/api-analyzer.js.map +1 -0
- package/dist/analyzer/config-analyzer.d.ts +18 -0
- package/dist/analyzer/config-analyzer.d.ts.map +1 -0
- package/dist/analyzer/config-analyzer.js +200 -0
- package/dist/analyzer/config-analyzer.js.map +1 -0
- package/dist/analyzer/database-analyzer.d.ts +24 -0
- package/dist/analyzer/database-analyzer.d.ts.map +1 -0
- package/dist/analyzer/database-analyzer.js +391 -0
- package/dist/analyzer/database-analyzer.js.map +1 -0
- package/dist/analyzer/index.d.ts +10 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +10 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/module-analyzer.d.ts +20 -0
- package/dist/analyzer/module-analyzer.d.ts.map +1 -0
- package/dist/analyzer/module-analyzer.js +252 -0
- package/dist/analyzer/module-analyzer.js.map +1 -0
- package/dist/analyzer/workflow-analyzer.d.ts +19 -0
- package/dist/analyzer/workflow-analyzer.d.ts.map +1 -0
- package/dist/analyzer/workflow-analyzer.js +165 -0
- package/dist/analyzer/workflow-analyzer.js.map +1 -0
- package/dist/detector/dependency-detector.d.ts +50 -0
- package/dist/detector/dependency-detector.d.ts.map +1 -0
- package/dist/detector/dependency-detector.js +326 -0
- package/dist/detector/dependency-detector.js.map +1 -0
- package/dist/detector/entrypoint-detector.d.ts +30 -0
- package/dist/detector/entrypoint-detector.d.ts.map +1 -0
- package/dist/detector/entrypoint-detector.js +240 -0
- package/dist/detector/entrypoint-detector.js.map +1 -0
- package/dist/detector/index.d.ts +10 -0
- package/dist/detector/index.d.ts.map +1 -0
- package/dist/detector/index.js +10 -0
- package/dist/detector/index.js.map +1 -0
- package/dist/detector/tech-stack-detector.d.ts +41 -0
- package/dist/detector/tech-stack-detector.d.ts.map +1 -0
- package/dist/detector/tech-stack-detector.js +300 -0
- package/dist/detector/tech-stack-detector.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +9 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/markdown-generator.d.ts +71 -0
- package/dist/generator/markdown-generator.d.ts.map +1 -0
- package/dist/generator/markdown-generator.js +235 -0
- package/dist/generator/markdown-generator.js.map +1 -0
- package/dist/generator/mermaid-generator.d.ts +30 -0
- package/dist/generator/mermaid-generator.d.ts.map +1 -0
- package/dist/generator/mermaid-generator.js +297 -0
- package/dist/generator/mermaid-generator.js.map +1 -0
- package/dist/generator/sidebar-generator.d.ts +10 -0
- package/dist/generator/sidebar-generator.d.ts.map +1 -0
- package/dist/generator/sidebar-generator.js +120 -0
- package/dist/generator/sidebar-generator.js.map +1 -0
- package/dist/generator/wiki-generator.d.ts +45 -0
- package/dist/generator/wiki-generator.d.ts.map +1 -0
- package/dist/generator/wiki-generator.js +217 -0
- package/dist/generator/wiki-generator.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/auth-manager.d.ts +50 -0
- package/dist/llm/auth-manager.d.ts.map +1 -0
- package/dist/llm/auth-manager.js +172 -0
- package/dist/llm/auth-manager.js.map +1 -0
- package/dist/llm/index.d.ts +10 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +9 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm-client.d.ts +132 -0
- package/dist/llm/llm-client.d.ts.map +1 -0
- package/dist/llm/llm-client.js +308 -0
- package/dist/llm/llm-client.js.map +1 -0
- package/dist/llm/prompt-manager.d.ts +67 -0
- package/dist/llm/prompt-manager.d.ts.map +1 -0
- package/dist/llm/prompt-manager.js +283 -0
- package/dist/llm/prompt-manager.js.map +1 -0
- package/dist/models/analysis-result.d.ts +425 -0
- package/dist/models/analysis-result.d.ts.map +1 -0
- package/dist/models/analysis-result.js +34 -0
- package/dist/models/analysis-result.js.map +1 -0
- package/dist/models/analysis-types.d.ts +223 -0
- package/dist/models/analysis-types.d.ts.map +1 -0
- package/dist/models/analysis-types.js +95 -0
- package/dist/models/analysis-types.js.map +1 -0
- package/dist/models/file-reference.d.ts +62 -0
- package/dist/models/file-reference.d.ts.map +1 -0
- package/dist/models/file-reference.js +34 -0
- package/dist/models/file-reference.js.map +1 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +10 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/project-profile.d.ts +48 -0
- package/dist/models/project-profile.d.ts.map +1 -0
- package/dist/models/project-profile.js +26 -0
- package/dist/models/project-profile.js.map +1 -0
- package/dist/models/wiki-page.d.ts +57 -0
- package/dist/models/wiki-page.d.ts.map +1 -0
- package/dist/models/wiki-page.js +19 -0
- package/dist/models/wiki-page.js.map +1 -0
- package/dist/pipeline.d.ts +30 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +159 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/scanner/file-scanner.d.ts +27 -0
- package/dist/scanner/file-scanner.d.ts.map +1 -0
- package/dist/scanner/file-scanner.js +149 -0
- package/dist/scanner/file-scanner.js.map +1 -0
- package/dist/scanner/ignore-rules.d.ts +31 -0
- package/dist/scanner/ignore-rules.d.ts.map +1 -0
- package/dist/scanner/ignore-rules.js +98 -0
- package/dist/scanner/ignore-rules.js.map +1 -0
- package/dist/scanner/index.d.ts +8 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +8 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/tree-builder.d.ts +20 -0
- package/dist/scanner/tree-builder.d.ts.map +1 -0
- package/dist/scanner/tree-builder.js +118 -0
- package/dist/scanner/tree-builder.js.map +1 -0
- package/package.json +34 -0
- package/src/analyzer/api-analyzer.ts +324 -0
- package/src/analyzer/config-analyzer.ts +209 -0
- package/src/analyzer/database-analyzer.ts +468 -0
- package/src/analyzer/index.ts +26 -0
- package/src/analyzer/module-analyzer.ts +308 -0
- package/src/analyzer/workflow-analyzer.ts +190 -0
- package/src/detector/dependency-detector.ts +390 -0
- package/src/detector/entrypoint-detector.ts +270 -0
- package/src/detector/index.ts +21 -0
- package/src/detector/tech-stack-detector.ts +377 -0
- package/src/generator/index.ts +36 -0
- package/src/generator/markdown-generator.ts +277 -0
- package/src/generator/mermaid-generator.ts +340 -0
- package/src/generator/sidebar-generator.ts +134 -0
- package/src/generator/wiki-generator.ts +281 -0
- package/src/index.ts +12 -0
- package/src/llm/auth-manager.ts +207 -0
- package/src/llm/index.ts +21 -0
- package/src/llm/llm-client.ts +417 -0
- package/src/llm/prompt-manager.ts +325 -0
- package/src/models/analysis-result.ts +44 -0
- package/src/models/analysis-types.ts +121 -0
- package/src/models/file-reference.ts +41 -0
- package/src/models/index.ts +44 -0
- package/src/models/project-profile.ts +29 -0
- package/src/models/wiki-page.ts +23 -0
- package/src/pipeline.ts +225 -0
- package/src/scanner/file-scanner.ts +192 -0
- package/src/scanner/ignore-rules.ts +112 -0
- package/src/scanner/index.ts +19 -0
- package/src/scanner/tree-builder.ts +156 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module prompt-manager
|
|
3
|
+
* @description 提示词模板管理器,使用 Handlebars 构建 LLM 提示词。
|
|
4
|
+
*
|
|
5
|
+
* 提供以下五类提示词构建函数:
|
|
6
|
+
* 1. buildModuleAnalysisPrompt - 模块分析
|
|
7
|
+
* 2. buildMermaidPrompt - Mermaid 架构图生成
|
|
8
|
+
* 3. buildWikiPagePrompt - Wiki 页面生成
|
|
9
|
+
* 4. buildWikiPlanPrompt - Wiki 规划
|
|
10
|
+
* 5. buildSourceSummaryPrompt - 源码摘要
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import Handlebars from 'handlebars';
|
|
14
|
+
import type { ChatMessage } from './llm-client.js';
|
|
15
|
+
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Handlebars 模板定义
|
|
18
|
+
// ============================================================================
|
|
19
|
+
|
|
20
|
+
// --- 模块分析 ---
|
|
21
|
+
|
|
22
|
+
const MODULE_ANALYSIS_SYSTEM = `你是一个资深软件架构师。你的目标是理解给定的模块作用,并用专业的语言描述它。
|
|
23
|
+
|
|
24
|
+
严格要求:
|
|
25
|
+
- 严禁使用任何 Emoji 表情符号
|
|
26
|
+
- 使用准确、专业的中文描述
|
|
27
|
+
- 基于提供的文件列表和 AST 摘要进行分析,不要编造不存在的内容`;
|
|
28
|
+
|
|
29
|
+
const MODULE_ANALYSIS_USER_TEMPLATE = Handlebars.compile(`请分析以下模块:
|
|
30
|
+
|
|
31
|
+
## 模块路径
|
|
32
|
+
{{modulePath}}
|
|
33
|
+
|
|
34
|
+
## 文件列表
|
|
35
|
+
{{fileList}}
|
|
36
|
+
|
|
37
|
+
## AST 摘要
|
|
38
|
+
{{astSummaries}}
|
|
39
|
+
|
|
40
|
+
## 输出格式
|
|
41
|
+
请以如下 JSON 格式输出(不要包含其他任何内容):
|
|
42
|
+
|
|
43
|
+
\`\`\`json
|
|
44
|
+
{
|
|
45
|
+
"summary": "模块的功能概述",
|
|
46
|
+
"core_components": [
|
|
47
|
+
{
|
|
48
|
+
"name": "组件名称",
|
|
49
|
+
"description": "组件的职责描述"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
\`\`\``, { noEscape: true });
|
|
54
|
+
|
|
55
|
+
// --- Mermaid 架构图 ---
|
|
56
|
+
|
|
57
|
+
const MERMAID_SYSTEM = `你是一个架构制图专家。你的任务是根据提供的模块和依赖关系,生成清晰的 Mermaid 流程图。
|
|
58
|
+
|
|
59
|
+
严格要求:
|
|
60
|
+
- 严禁使用任何 Emoji 表情符号
|
|
61
|
+
- 生成合法的 Mermaid flowchart LR 语法
|
|
62
|
+
- 使用 subgraph 对相关模块进行逻辑分组
|
|
63
|
+
- 节点标签使用简洁的中文或英文名称
|
|
64
|
+
- 箭头标注使用简短的依赖描述
|
|
65
|
+
- 只输出 \`\`\`mermaid 代码块,不要输出任何其他内容`;
|
|
66
|
+
|
|
67
|
+
const MERMAID_USER_TEMPLATE = Handlebars.compile(`请根据以下信息生成 Mermaid 架构流程图:
|
|
68
|
+
|
|
69
|
+
## 模块列表
|
|
70
|
+
{{modules}}
|
|
71
|
+
|
|
72
|
+
## 依赖关系
|
|
73
|
+
{{dependencies}}
|
|
74
|
+
|
|
75
|
+
请生成一个 Mermaid flowchart LR 图,使用 subgraph 对模块进行合理分组。
|
|
76
|
+
只输出 \`\`\`mermaid 代码块。`, { noEscape: true });
|
|
77
|
+
|
|
78
|
+
// --- Wiki 页面 ---
|
|
79
|
+
|
|
80
|
+
const WIKI_PAGE_SYSTEM = `你是一个资深技术文档工程师。你的任务是根据提供的项目信息和源码摘要,生成高质量的技术文档 Wiki 页面。
|
|
81
|
+
|
|
82
|
+
严格要求:
|
|
83
|
+
- 使用清晰的中文,严禁使用任何 Emoji
|
|
84
|
+
- 不能编造不在上下文中出现的文件或服务
|
|
85
|
+
- 每个章节必须注明 章节来源 (引用对应的源文件)
|
|
86
|
+
- 每个图表必须注明 图表来源 (引用生成图表所依据的源文件)
|
|
87
|
+
- 来源引用格式: [file:line-line](file://project/path#Lstart-Lend)
|
|
88
|
+
|
|
89
|
+
你必须严格遵循以下 12 节模板结构:
|
|
90
|
+
|
|
91
|
+
1. H1 标题
|
|
92
|
+
2. <cite> 块 - 列出所有相关源文件
|
|
93
|
+
3. 目录 (ToC) - 使用 Markdown 链接的目录
|
|
94
|
+
4. 引言 - 模块/功能的简介
|
|
95
|
+
5. 项目结构 - 含 Mermaid 目录树图
|
|
96
|
+
6. 核心组件 - 主要组件列表与简述
|
|
97
|
+
7. 架构总览 - 含 Mermaid 架构图
|
|
98
|
+
8. 详细组件分析 - 每个组件含 Mermaid 类图或流程图
|
|
99
|
+
9. 依赖分析 - 含 Mermaid 依赖关系图
|
|
100
|
+
10. 故障排查指南 - 常见问题与排查步骤
|
|
101
|
+
11. 结论 - 总结性评述
|
|
102
|
+
12. 附录 - 补充信息、配置参考等`;
|
|
103
|
+
|
|
104
|
+
const WIKI_PAGE_USER_TEMPLATE = Handlebars.compile(`请为以下内容生成技术文档 Wiki 页面:
|
|
105
|
+
|
|
106
|
+
## 页面标题
|
|
107
|
+
{{pageTitle}}
|
|
108
|
+
|
|
109
|
+
## 项目结构
|
|
110
|
+
{{projectTree}}
|
|
111
|
+
|
|
112
|
+
## 源码摘要
|
|
113
|
+
{{sourceSummaries}}
|
|
114
|
+
|
|
115
|
+
{{#if existingPages}}
|
|
116
|
+
## 已有 Wiki 页面
|
|
117
|
+
以下是已生成的其他 Wiki 页面,请在文档中合理交叉引用:
|
|
118
|
+
{{existingPages}}
|
|
119
|
+
{{/if}}
|
|
120
|
+
|
|
121
|
+
请严格按照 12 节模板结构输出完整的 Markdown 文档。
|
|
122
|
+
每个章节需注明 章节来源,每个图表需注明 图表来源。
|
|
123
|
+
来源格式: [file:line-line](file://project/path#Lstart-Lend)`, { noEscape: true });
|
|
124
|
+
|
|
125
|
+
// --- Wiki 规划 ---
|
|
126
|
+
|
|
127
|
+
const WIKI_PLAN_SYSTEM = `你是一个技术文档规划专家。你的任务是根据项目信息规划一组结构化的 Wiki 页面。
|
|
128
|
+
|
|
129
|
+
严格要求:
|
|
130
|
+
- 严禁使用任何 Emoji 表情符号
|
|
131
|
+
- 页面规划应覆盖项目的所有核心方面
|
|
132
|
+
- 遵循标准文档层级结构
|
|
133
|
+
- 以 JSON 数组格式输出,不要包含其他内容
|
|
134
|
+
|
|
135
|
+
标准文档层级参考:
|
|
136
|
+
- 项目概述/
|
|
137
|
+
- 架构设计/
|
|
138
|
+
- 前端应用架构/
|
|
139
|
+
- 后端服务架构/
|
|
140
|
+
- 核心功能模块/
|
|
141
|
+
- 数据库设计/
|
|
142
|
+
- API参考文档/
|
|
143
|
+
- 部署运维/
|
|
144
|
+
- 开发指南/`;
|
|
145
|
+
|
|
146
|
+
const WIKI_PLAN_USER_TEMPLATE = Handlebars.compile(`请根据以下项目信息,规划 Wiki 文档页面:
|
|
147
|
+
|
|
148
|
+
## 项目结构
|
|
149
|
+
{{projectTree}}
|
|
150
|
+
|
|
151
|
+
## 技术栈
|
|
152
|
+
{{techStack}}
|
|
153
|
+
|
|
154
|
+
## 模块列表
|
|
155
|
+
{{modules}}
|
|
156
|
+
|
|
157
|
+
请以如下 JSON 数组格式输出(不要包含其他任何内容):
|
|
158
|
+
|
|
159
|
+
\`\`\`json
|
|
160
|
+
[
|
|
161
|
+
{
|
|
162
|
+
"title": "页面标题",
|
|
163
|
+
"filename": "文件名.md",
|
|
164
|
+
"summary": "页面内容概述",
|
|
165
|
+
"requiredModules": ["模块路径1", "模块路径2"]
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
\`\`\`
|
|
169
|
+
|
|
170
|
+
注意:
|
|
171
|
+
- filename 使用英文命名,使用连字符分隔
|
|
172
|
+
- 页面应按照标准文档层级结构进行组织
|
|
173
|
+
- requiredModules 关联生成该页面所需的源码模块路径`, { noEscape: true });
|
|
174
|
+
|
|
175
|
+
// --- 源码摘要 ---
|
|
176
|
+
|
|
177
|
+
const SOURCE_SUMMARY_SYSTEM = `你是一个代码分析专家。你的任务是对给定的源代码文件生成精练的摘要。
|
|
178
|
+
|
|
179
|
+
摘要应保留以下关键信息:
|
|
180
|
+
- 所有导出的符号 (export)
|
|
181
|
+
- 类和函数的签名 (参数类型、返回类型)
|
|
182
|
+
- 关键的类型定义和接口
|
|
183
|
+
- 重要的注释和文档说明
|
|
184
|
+
- 核心的业务逻辑描述
|
|
185
|
+
|
|
186
|
+
严格要求:
|
|
187
|
+
- 严禁使用任何 Emoji 表情符号
|
|
188
|
+
- 输出纯文本摘要,不要使用 JSON 格式
|
|
189
|
+
- 摘要控制在约 200 行以内
|
|
190
|
+
- 使用中文描述,代码签名保留原文`;
|
|
191
|
+
|
|
192
|
+
const SOURCE_SUMMARY_USER_TEMPLATE = Handlebars.compile(`请为以下源代码文件生成精练摘要:
|
|
193
|
+
|
|
194
|
+
## 文件路径
|
|
195
|
+
{{filePath}}
|
|
196
|
+
|
|
197
|
+
## 文件内容
|
|
198
|
+
\`\`\`
|
|
199
|
+
{{fileContent}}
|
|
200
|
+
\`\`\`
|
|
201
|
+
|
|
202
|
+
请输出纯文本摘要(不要使用 JSON),控制在约 200 行以内。
|
|
203
|
+
保留所有导出符号、类/函数签名、关键类型定义和重要注释。`, { noEscape: true });
|
|
204
|
+
|
|
205
|
+
// ============================================================================
|
|
206
|
+
// 公开 API
|
|
207
|
+
// ============================================================================
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 构建模块分析提示词。
|
|
211
|
+
*
|
|
212
|
+
* 用于分析指定模块的功能和核心组件,输出结构化 JSON。
|
|
213
|
+
*
|
|
214
|
+
* @param modulePath - 模块路径
|
|
215
|
+
* @param fileList - 模块包含的文件列表
|
|
216
|
+
* @param astSummaries - AST 分析摘要
|
|
217
|
+
* @returns 准备好的 ChatMessage 数组
|
|
218
|
+
*/
|
|
219
|
+
export function buildModuleAnalysisPrompt(
|
|
220
|
+
modulePath: string,
|
|
221
|
+
fileList: string,
|
|
222
|
+
astSummaries: string,
|
|
223
|
+
): ChatMessage[] {
|
|
224
|
+
return [
|
|
225
|
+
{ role: 'system', content: MODULE_ANALYSIS_SYSTEM },
|
|
226
|
+
{
|
|
227
|
+
role: 'user',
|
|
228
|
+
content: MODULE_ANALYSIS_USER_TEMPLATE({ modulePath, fileList, astSummaries }),
|
|
229
|
+
},
|
|
230
|
+
];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 构建 Mermaid 架构图提示词。
|
|
235
|
+
*
|
|
236
|
+
* 用于根据模块和依赖信息生成 Mermaid flowchart LR 图。
|
|
237
|
+
*
|
|
238
|
+
* @param modules - 模块列表描述
|
|
239
|
+
* @param dependencies - 依赖关系描述
|
|
240
|
+
* @returns 准备好的 ChatMessage 数组
|
|
241
|
+
*/
|
|
242
|
+
export function buildMermaidPrompt(
|
|
243
|
+
modules: string,
|
|
244
|
+
dependencies: string,
|
|
245
|
+
): ChatMessage[] {
|
|
246
|
+
return [
|
|
247
|
+
{ role: 'system', content: MERMAID_SYSTEM },
|
|
248
|
+
{
|
|
249
|
+
role: 'user',
|
|
250
|
+
content: MERMAID_USER_TEMPLATE({ modules, dependencies }),
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 构建 Wiki 页面生成提示词。
|
|
257
|
+
*
|
|
258
|
+
* 用于根据项目结构和源码摘要生成标准 12 节结构的技术文档页面。
|
|
259
|
+
*
|
|
260
|
+
* @param pageTitle - 页面标题
|
|
261
|
+
* @param projectTree - 项目目录结构
|
|
262
|
+
* @param sourceSummaries - 源码摘要集合
|
|
263
|
+
* @param existingPages - 已有的 Wiki 页面列表(可选,用于交叉引用)
|
|
264
|
+
* @returns 准备好的 ChatMessage 数组
|
|
265
|
+
*/
|
|
266
|
+
export function buildWikiPagePrompt(
|
|
267
|
+
pageTitle: string,
|
|
268
|
+
projectTree: string,
|
|
269
|
+
sourceSummaries: string,
|
|
270
|
+
existingPages?: string,
|
|
271
|
+
): ChatMessage[] {
|
|
272
|
+
return [
|
|
273
|
+
{ role: 'system', content: WIKI_PAGE_SYSTEM },
|
|
274
|
+
{
|
|
275
|
+
role: 'user',
|
|
276
|
+
content: WIKI_PAGE_USER_TEMPLATE({ pageTitle, projectTree, sourceSummaries, existingPages }),
|
|
277
|
+
},
|
|
278
|
+
];
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* 构建 Wiki 规划提示词。
|
|
283
|
+
*
|
|
284
|
+
* 用于根据项目信息规划 Wiki 文档页面结构,输出结构化 JSON。
|
|
285
|
+
*
|
|
286
|
+
* @param projectTree - 项目目录结构
|
|
287
|
+
* @param techStack - 技术栈描述
|
|
288
|
+
* @param modules - 模块列表描述
|
|
289
|
+
* @returns 准备好的 ChatMessage 数组
|
|
290
|
+
*/
|
|
291
|
+
export function buildWikiPlanPrompt(
|
|
292
|
+
projectTree: string,
|
|
293
|
+
techStack: string,
|
|
294
|
+
modules: string,
|
|
295
|
+
): ChatMessage[] {
|
|
296
|
+
return [
|
|
297
|
+
{ role: 'system', content: WIKI_PLAN_SYSTEM },
|
|
298
|
+
{
|
|
299
|
+
role: 'user',
|
|
300
|
+
content: WIKI_PLAN_USER_TEMPLATE({ projectTree, techStack, modules }),
|
|
301
|
+
},
|
|
302
|
+
];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 构建源码摘要提示词。
|
|
307
|
+
*
|
|
308
|
+
* 用于对单个源文件生成精练摘要,保留关键代码签名和类型信息。
|
|
309
|
+
*
|
|
310
|
+
* @param filePath - 文件路径
|
|
311
|
+
* @param fileContent - 文件内容
|
|
312
|
+
* @returns 准备好的 ChatMessage 数组
|
|
313
|
+
*/
|
|
314
|
+
export function buildSourceSummaryPrompt(
|
|
315
|
+
filePath: string,
|
|
316
|
+
fileContent: string,
|
|
317
|
+
): ChatMessage[] {
|
|
318
|
+
return [
|
|
319
|
+
{ role: 'system', content: SOURCE_SUMMARY_SYSTEM },
|
|
320
|
+
{
|
|
321
|
+
role: 'user',
|
|
322
|
+
content: SOURCE_SUMMARY_USER_TEMPLATE({ filePath, fileContent }),
|
|
323
|
+
},
|
|
324
|
+
];
|
|
325
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
import { ProjectProfileSchema } from './project-profile.js';
|
|
4
|
+
import { WikiPageSchema } from './wiki-page.js';
|
|
5
|
+
import {
|
|
6
|
+
ModuleInfoSchema,
|
|
7
|
+
ApiRouteSchema,
|
|
8
|
+
DatabaseModelSchema,
|
|
9
|
+
} from './analysis-types.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 依赖关系边 Schema
|
|
13
|
+
*/
|
|
14
|
+
export const DependencyEdgeSchema = z.object({
|
|
15
|
+
source: z.string().describe('源文件相对路径'),
|
|
16
|
+
target: z.string().describe('依赖目标相对路径或包名'),
|
|
17
|
+
isExternal: z.boolean().describe('是否为外部依赖'),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 依赖关系图 Schema
|
|
22
|
+
*/
|
|
23
|
+
export const DependencyGraphSchema = z.object({
|
|
24
|
+
edges: z.array(DependencyEdgeSchema).default([]).describe('依赖边列表'),
|
|
25
|
+
internalModules: z.array(z.string()).default([]).describe('内部模块路径列表'),
|
|
26
|
+
externalPackages: z.array(z.string()).default([]).describe('外部依赖包名列表'),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 分析结果 Schema
|
|
31
|
+
* 整合项目概要、目录树、模块、依赖、API 路由、数据模型和 Wiki 页面。
|
|
32
|
+
*/
|
|
33
|
+
export const AnalysisResultSchema = z.object({
|
|
34
|
+
project: ProjectProfileSchema,
|
|
35
|
+
tree: z.string().describe('纯文本树结构'),
|
|
36
|
+
modules: z.array(ModuleInfoSchema),
|
|
37
|
+
dependencies: DependencyGraphSchema,
|
|
38
|
+
apiRoutes: z.array(ApiRouteSchema),
|
|
39
|
+
databaseModels: z.array(DatabaseModelSchema),
|
|
40
|
+
wikiPages: z.array(WikiPageSchema).default([]),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/** 分析结果类型 */
|
|
44
|
+
export type AnalysisResult = z.infer<typeof AnalysisResultSchema>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// ModuleInfo — 模块聚类分析结果
|
|
5
|
+
// ============================================================================
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 核心组件 Schema
|
|
9
|
+
* 描述某模块中的关键类、函数或子系统。
|
|
10
|
+
*/
|
|
11
|
+
export const CoreComponentSchema = z.object({
|
|
12
|
+
/** 组件名称(类名、函数名或子系统名) */
|
|
13
|
+
name: z.string().describe('核心组件名称'),
|
|
14
|
+
/** 组件的作用描述 */
|
|
15
|
+
description: z.string().describe('用途和调用逻辑'),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
/** 核心组件类型 */
|
|
19
|
+
export type CoreComponent = z.infer<typeof CoreComponentSchema>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 模块信息 Schema
|
|
23
|
+
* 描述由 ModuleAnalyzer 聚类生成的逻辑模块。
|
|
24
|
+
*/
|
|
25
|
+
export const ModuleInfoSchema = z.object({
|
|
26
|
+
/** 模块名称(如 api, web, components) */
|
|
27
|
+
moduleName: z.string().describe('模块名称'),
|
|
28
|
+
/** 模块所在的目录相对路径 */
|
|
29
|
+
directory: z.string().describe('目录相对路径'),
|
|
30
|
+
/** 模块内包含的文件相对路径列表 */
|
|
31
|
+
files: z.array(z.string()).default([]).describe('文件相对路径列表'),
|
|
32
|
+
/** 模块职责描述 */
|
|
33
|
+
summary: z.string().default('').describe('模块职责描述'),
|
|
34
|
+
/** 模块分类标签 */
|
|
35
|
+
category: z.string().default('').describe('分类标签'),
|
|
36
|
+
/** 核心组件列表 */
|
|
37
|
+
coreComponents: z.array(CoreComponentSchema).default([]).describe('核心组件'),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/** 模块信息类型 */
|
|
41
|
+
export type ModuleInfo = z.infer<typeof ModuleInfoSchema>;
|
|
42
|
+
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// ApiRoute — API 路由分析结果
|
|
45
|
+
// ============================================================================
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* API 路由 Schema
|
|
49
|
+
* 描述从源码中提取的单个 HTTP 路由定义。
|
|
50
|
+
*/
|
|
51
|
+
export const ApiRouteSchema = z.object({
|
|
52
|
+
/** HTTP 方法(GET, POST, PUT, DELETE, PATCH) */
|
|
53
|
+
method: z.string().describe('HTTP 方法'),
|
|
54
|
+
/** 路由路径 */
|
|
55
|
+
path: z.string().describe('路由路径'),
|
|
56
|
+
/** 处理函数名称 */
|
|
57
|
+
handler: z.string().default('').describe('处理函数名称'),
|
|
58
|
+
/** 所在文件的相对路径 */
|
|
59
|
+
filePath: z.string().describe('文件相对路径'),
|
|
60
|
+
/** 路由定义所在的行号 */
|
|
61
|
+
lineNumber: z.number().default(0).describe('行号'),
|
|
62
|
+
/** 检测到的框架类型 */
|
|
63
|
+
framework: z.string().default('').describe('框架类型'),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/** API 路由类型 */
|
|
67
|
+
export type ApiRoute = z.infer<typeof ApiRouteSchema>;
|
|
68
|
+
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// DatabaseModel — 数据库模型分析结果
|
|
71
|
+
// ============================================================================
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 数据库字段 Schema
|
|
75
|
+
*/
|
|
76
|
+
export const DatabaseFieldSchema = z.object({
|
|
77
|
+
/** 字段名称 */
|
|
78
|
+
name: z.string().describe('字段名称'),
|
|
79
|
+
/** 字段类型 */
|
|
80
|
+
type: z.string().describe('字段类型'),
|
|
81
|
+
/** 是否可空 */
|
|
82
|
+
nullable: z.boolean().default(false).describe('是否可空'),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
/** 数据库字段类型 */
|
|
86
|
+
export type DatabaseField = z.infer<typeof DatabaseFieldSchema>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 数据库关系 Schema
|
|
90
|
+
*/
|
|
91
|
+
export const DatabaseRelationSchema = z.object({
|
|
92
|
+
/** 关系字段名 */
|
|
93
|
+
fieldName: z.string().describe('关系字段名'),
|
|
94
|
+
/** 关联的模型名 */
|
|
95
|
+
relatedModel: z.string().describe('关联模型'),
|
|
96
|
+
/** 关系类型(OneToMany, ManyToOne 等) */
|
|
97
|
+
relationType: z.string().default('').describe('关系类型'),
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/** 数据库关系类型 */
|
|
101
|
+
export type DatabaseRelation = z.infer<typeof DatabaseRelationSchema>;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 数据库模型 Schema
|
|
105
|
+
* 描述从 ORM 定义中提取的数据模型。
|
|
106
|
+
*/
|
|
107
|
+
export const DatabaseModelSchema = z.object({
|
|
108
|
+
/** 模型名称 */
|
|
109
|
+
name: z.string().describe('模型名称'),
|
|
110
|
+
/** 所在文件相对路径 */
|
|
111
|
+
filePath: z.string().describe('文件相对路径'),
|
|
112
|
+
/** 检测到的 ORM 类型 */
|
|
113
|
+
orm: z.string().default('').describe('ORM 类型'),
|
|
114
|
+
/** 字段列表 */
|
|
115
|
+
fields: z.array(DatabaseFieldSchema).default([]).describe('字段列表'),
|
|
116
|
+
/** 关系列表 */
|
|
117
|
+
relations: z.array(DatabaseRelationSchema).default([]).describe('关系列表'),
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
/** 数据库模型类型 */
|
|
121
|
+
export type DatabaseModel = z.infer<typeof DatabaseModelSchema>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 文件节点 Schema
|
|
5
|
+
* 表示扫描到的单个文件或目录。
|
|
6
|
+
*/
|
|
7
|
+
export const FileNodeSchema = z.object({
|
|
8
|
+
/** 文件的绝对路径 */
|
|
9
|
+
path: z.string().describe('文件的绝对路径'),
|
|
10
|
+
/** 相对于项目根目录的路径 */
|
|
11
|
+
relativePath: z.string().describe('相对于项目根目录的路径'),
|
|
12
|
+
/** 节点类型 */
|
|
13
|
+
nodeType: z.enum(['file', 'directory']).describe('节点类型'),
|
|
14
|
+
/** 文件大小 (字节) */
|
|
15
|
+
sizeBytes: z.number().describe('文件大小'),
|
|
16
|
+
/** 检测到的编程语言 */
|
|
17
|
+
language: z.string().optional().describe('语言类型'),
|
|
18
|
+
/** 非空代码行数 */
|
|
19
|
+
lineCount: z.number().optional().describe('非空代码行数'),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/** 文件节点类型 */
|
|
23
|
+
export type FileNode = z.infer<typeof FileNodeSchema>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 源码引用 Schema
|
|
27
|
+
* 指向特定代码片段的行范围,用于 Wiki 页面追溯。
|
|
28
|
+
*/
|
|
29
|
+
export const SourceReferenceSchema = z.object({
|
|
30
|
+
/** 相对文件路径 */
|
|
31
|
+
filePath: z.string().describe('相对文件路径'),
|
|
32
|
+
/** 开始行号 */
|
|
33
|
+
startLine: z.number().describe('开始行'),
|
|
34
|
+
/** 结束行号 */
|
|
35
|
+
endLine: z.number().describe('结束行'),
|
|
36
|
+
/** 引用说明 */
|
|
37
|
+
reason: z.string().describe('引用说明'),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/** 源码引用类型 */
|
|
41
|
+
export type SourceReference = z.infer<typeof SourceReferenceSchema>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* models 模块入口
|
|
3
|
+
* 统一导出所有数据模型 Schema 及类型定义。
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
FileNodeSchema,
|
|
8
|
+
type FileNode,
|
|
9
|
+
SourceReferenceSchema,
|
|
10
|
+
type SourceReference,
|
|
11
|
+
} from './file-reference.js';
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
ProjectProfileSchema,
|
|
15
|
+
type ProjectProfile,
|
|
16
|
+
} from './project-profile.js';
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
CoreComponentSchema,
|
|
20
|
+
type CoreComponent,
|
|
21
|
+
ModuleInfoSchema,
|
|
22
|
+
type ModuleInfo,
|
|
23
|
+
ApiRouteSchema,
|
|
24
|
+
type ApiRoute,
|
|
25
|
+
DatabaseFieldSchema,
|
|
26
|
+
type DatabaseField,
|
|
27
|
+
DatabaseRelationSchema,
|
|
28
|
+
type DatabaseRelation,
|
|
29
|
+
DatabaseModelSchema,
|
|
30
|
+
type DatabaseModel,
|
|
31
|
+
} from './analysis-types.js';
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
WikiPageSchema,
|
|
35
|
+
type WikiPage,
|
|
36
|
+
} from './wiki-page.js';
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
DependencyEdgeSchema,
|
|
40
|
+
DependencyGraphSchema,
|
|
41
|
+
AnalysisResultSchema,
|
|
42
|
+
type AnalysisResult,
|
|
43
|
+
} from './analysis-result.js';
|
|
44
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 项目概要 Schema
|
|
5
|
+
* 描述被分析项目的基本元信息,包括技术栈、入口点和配置文件等。
|
|
6
|
+
*/
|
|
7
|
+
export const ProjectProfileSchema = z.object({
|
|
8
|
+
/** 项目名称 */
|
|
9
|
+
name: z.string().describe('项目名称'),
|
|
10
|
+
/** 项目根目录的绝对路径 */
|
|
11
|
+
rootPath: z.string().describe('绝对路径'),
|
|
12
|
+
/** 使用的主力编程语言 */
|
|
13
|
+
languages: z.array(z.string()).default([]).describe('使用的主力语言'),
|
|
14
|
+
/** 推断出的框架信息 */
|
|
15
|
+
frameworks: z.array(z.string()).default([]).describe('框架推断结果'),
|
|
16
|
+
/** 检测到的包管理器 */
|
|
17
|
+
packageManagers: z.array(z.string()).default([]).describe('包管理器'),
|
|
18
|
+
/** 使用的数据库 */
|
|
19
|
+
databases: z.array(z.string()).default([]).describe('数据库'),
|
|
20
|
+
/** 接入的外部服务 */
|
|
21
|
+
services: z.array(z.string()).default([]).describe('外部服务'),
|
|
22
|
+
/** 入口文件列表 */
|
|
23
|
+
entrypoints: z.array(z.string()).default([]).describe('入口点'),
|
|
24
|
+
/** 配置文件列表 */
|
|
25
|
+
configFiles: z.array(z.string()).default([]).describe('配置文件'),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/** 项目概要类型 */
|
|
29
|
+
export type ProjectProfile = z.infer<typeof ProjectProfileSchema>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
import { SourceReferenceSchema } from './file-reference.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wiki 页面 Schema
|
|
7
|
+
* 表示一篇生成的 Wiki 文档。
|
|
8
|
+
*/
|
|
9
|
+
export const WikiPageSchema = z.object({
|
|
10
|
+
/** 页面标题 */
|
|
11
|
+
title: z.string().describe('标题'),
|
|
12
|
+
/** docs/wiki/ 下的相对文件名 */
|
|
13
|
+
filename: z.string().describe('docs/wiki/ 下的相对路径'),
|
|
14
|
+
/** 页面摘要 */
|
|
15
|
+
summary: z.string().describe('简述'),
|
|
16
|
+
/** 最终渲染的 Markdown 正文 */
|
|
17
|
+
content: z.string().describe('最终 Markdown 文本'),
|
|
18
|
+
/** 引用的源码片段 */
|
|
19
|
+
sourceRefs: z.array(SourceReferenceSchema).default([]),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/** Wiki 页面类型 */
|
|
23
|
+
export type WikiPage = z.infer<typeof WikiPageSchema>;
|