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.
Files changed (157) hide show
  1. package/dist/analyzer/api-analyzer.d.ts +22 -0
  2. package/dist/analyzer/api-analyzer.d.ts.map +1 -0
  3. package/dist/analyzer/api-analyzer.js +272 -0
  4. package/dist/analyzer/api-analyzer.js.map +1 -0
  5. package/dist/analyzer/config-analyzer.d.ts +18 -0
  6. package/dist/analyzer/config-analyzer.d.ts.map +1 -0
  7. package/dist/analyzer/config-analyzer.js +200 -0
  8. package/dist/analyzer/config-analyzer.js.map +1 -0
  9. package/dist/analyzer/database-analyzer.d.ts +24 -0
  10. package/dist/analyzer/database-analyzer.d.ts.map +1 -0
  11. package/dist/analyzer/database-analyzer.js +391 -0
  12. package/dist/analyzer/database-analyzer.js.map +1 -0
  13. package/dist/analyzer/index.d.ts +10 -0
  14. package/dist/analyzer/index.d.ts.map +1 -0
  15. package/dist/analyzer/index.js +10 -0
  16. package/dist/analyzer/index.js.map +1 -0
  17. package/dist/analyzer/module-analyzer.d.ts +20 -0
  18. package/dist/analyzer/module-analyzer.d.ts.map +1 -0
  19. package/dist/analyzer/module-analyzer.js +252 -0
  20. package/dist/analyzer/module-analyzer.js.map +1 -0
  21. package/dist/analyzer/workflow-analyzer.d.ts +19 -0
  22. package/dist/analyzer/workflow-analyzer.d.ts.map +1 -0
  23. package/dist/analyzer/workflow-analyzer.js +165 -0
  24. package/dist/analyzer/workflow-analyzer.js.map +1 -0
  25. package/dist/detector/dependency-detector.d.ts +50 -0
  26. package/dist/detector/dependency-detector.d.ts.map +1 -0
  27. package/dist/detector/dependency-detector.js +326 -0
  28. package/dist/detector/dependency-detector.js.map +1 -0
  29. package/dist/detector/entrypoint-detector.d.ts +30 -0
  30. package/dist/detector/entrypoint-detector.d.ts.map +1 -0
  31. package/dist/detector/entrypoint-detector.js +240 -0
  32. package/dist/detector/entrypoint-detector.js.map +1 -0
  33. package/dist/detector/index.d.ts +10 -0
  34. package/dist/detector/index.d.ts.map +1 -0
  35. package/dist/detector/index.js +10 -0
  36. package/dist/detector/index.js.map +1 -0
  37. package/dist/detector/tech-stack-detector.d.ts +41 -0
  38. package/dist/detector/tech-stack-detector.d.ts.map +1 -0
  39. package/dist/detector/tech-stack-detector.js +300 -0
  40. package/dist/detector/tech-stack-detector.js.map +1 -0
  41. package/dist/generator/index.d.ts +9 -0
  42. package/dist/generator/index.d.ts.map +1 -0
  43. package/dist/generator/index.js +9 -0
  44. package/dist/generator/index.js.map +1 -0
  45. package/dist/generator/markdown-generator.d.ts +71 -0
  46. package/dist/generator/markdown-generator.d.ts.map +1 -0
  47. package/dist/generator/markdown-generator.js +235 -0
  48. package/dist/generator/markdown-generator.js.map +1 -0
  49. package/dist/generator/mermaid-generator.d.ts +30 -0
  50. package/dist/generator/mermaid-generator.d.ts.map +1 -0
  51. package/dist/generator/mermaid-generator.js +297 -0
  52. package/dist/generator/mermaid-generator.js.map +1 -0
  53. package/dist/generator/sidebar-generator.d.ts +10 -0
  54. package/dist/generator/sidebar-generator.d.ts.map +1 -0
  55. package/dist/generator/sidebar-generator.js +120 -0
  56. package/dist/generator/sidebar-generator.js.map +1 -0
  57. package/dist/generator/wiki-generator.d.ts +45 -0
  58. package/dist/generator/wiki-generator.d.ts.map +1 -0
  59. package/dist/generator/wiki-generator.js +217 -0
  60. package/dist/generator/wiki-generator.js.map +1 -0
  61. package/dist/index.d.ts +12 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +12 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/llm/auth-manager.d.ts +50 -0
  66. package/dist/llm/auth-manager.d.ts.map +1 -0
  67. package/dist/llm/auth-manager.js +172 -0
  68. package/dist/llm/auth-manager.js.map +1 -0
  69. package/dist/llm/index.d.ts +10 -0
  70. package/dist/llm/index.d.ts.map +1 -0
  71. package/dist/llm/index.js +9 -0
  72. package/dist/llm/index.js.map +1 -0
  73. package/dist/llm/llm-client.d.ts +132 -0
  74. package/dist/llm/llm-client.d.ts.map +1 -0
  75. package/dist/llm/llm-client.js +308 -0
  76. package/dist/llm/llm-client.js.map +1 -0
  77. package/dist/llm/prompt-manager.d.ts +67 -0
  78. package/dist/llm/prompt-manager.d.ts.map +1 -0
  79. package/dist/llm/prompt-manager.js +283 -0
  80. package/dist/llm/prompt-manager.js.map +1 -0
  81. package/dist/models/analysis-result.d.ts +425 -0
  82. package/dist/models/analysis-result.d.ts.map +1 -0
  83. package/dist/models/analysis-result.js +34 -0
  84. package/dist/models/analysis-result.js.map +1 -0
  85. package/dist/models/analysis-types.d.ts +223 -0
  86. package/dist/models/analysis-types.d.ts.map +1 -0
  87. package/dist/models/analysis-types.js +95 -0
  88. package/dist/models/analysis-types.js.map +1 -0
  89. package/dist/models/file-reference.d.ts +62 -0
  90. package/dist/models/file-reference.d.ts.map +1 -0
  91. package/dist/models/file-reference.js +34 -0
  92. package/dist/models/file-reference.js.map +1 -0
  93. package/dist/models/index.d.ts +10 -0
  94. package/dist/models/index.d.ts.map +1 -0
  95. package/dist/models/index.js +10 -0
  96. package/dist/models/index.js.map +1 -0
  97. package/dist/models/project-profile.d.ts +48 -0
  98. package/dist/models/project-profile.d.ts.map +1 -0
  99. package/dist/models/project-profile.js +26 -0
  100. package/dist/models/project-profile.js.map +1 -0
  101. package/dist/models/wiki-page.d.ts +57 -0
  102. package/dist/models/wiki-page.d.ts.map +1 -0
  103. package/dist/models/wiki-page.js +19 -0
  104. package/dist/models/wiki-page.js.map +1 -0
  105. package/dist/pipeline.d.ts +30 -0
  106. package/dist/pipeline.d.ts.map +1 -0
  107. package/dist/pipeline.js +159 -0
  108. package/dist/pipeline.js.map +1 -0
  109. package/dist/scanner/file-scanner.d.ts +27 -0
  110. package/dist/scanner/file-scanner.d.ts.map +1 -0
  111. package/dist/scanner/file-scanner.js +149 -0
  112. package/dist/scanner/file-scanner.js.map +1 -0
  113. package/dist/scanner/ignore-rules.d.ts +31 -0
  114. package/dist/scanner/ignore-rules.d.ts.map +1 -0
  115. package/dist/scanner/ignore-rules.js +98 -0
  116. package/dist/scanner/ignore-rules.js.map +1 -0
  117. package/dist/scanner/index.d.ts +8 -0
  118. package/dist/scanner/index.d.ts.map +1 -0
  119. package/dist/scanner/index.js +8 -0
  120. package/dist/scanner/index.js.map +1 -0
  121. package/dist/scanner/tree-builder.d.ts +20 -0
  122. package/dist/scanner/tree-builder.d.ts.map +1 -0
  123. package/dist/scanner/tree-builder.js +118 -0
  124. package/dist/scanner/tree-builder.js.map +1 -0
  125. package/package.json +34 -0
  126. package/src/analyzer/api-analyzer.ts +324 -0
  127. package/src/analyzer/config-analyzer.ts +209 -0
  128. package/src/analyzer/database-analyzer.ts +468 -0
  129. package/src/analyzer/index.ts +26 -0
  130. package/src/analyzer/module-analyzer.ts +308 -0
  131. package/src/analyzer/workflow-analyzer.ts +190 -0
  132. package/src/detector/dependency-detector.ts +390 -0
  133. package/src/detector/entrypoint-detector.ts +270 -0
  134. package/src/detector/index.ts +21 -0
  135. package/src/detector/tech-stack-detector.ts +377 -0
  136. package/src/generator/index.ts +36 -0
  137. package/src/generator/markdown-generator.ts +277 -0
  138. package/src/generator/mermaid-generator.ts +340 -0
  139. package/src/generator/sidebar-generator.ts +134 -0
  140. package/src/generator/wiki-generator.ts +281 -0
  141. package/src/index.ts +12 -0
  142. package/src/llm/auth-manager.ts +207 -0
  143. package/src/llm/index.ts +21 -0
  144. package/src/llm/llm-client.ts +417 -0
  145. package/src/llm/prompt-manager.ts +325 -0
  146. package/src/models/analysis-result.ts +44 -0
  147. package/src/models/analysis-types.ts +121 -0
  148. package/src/models/file-reference.ts +41 -0
  149. package/src/models/index.ts +44 -0
  150. package/src/models/project-profile.ts +29 -0
  151. package/src/models/wiki-page.ts +23 -0
  152. package/src/pipeline.ts +225 -0
  153. package/src/scanner/file-scanner.ts +192 -0
  154. package/src/scanner/ignore-rules.ts +112 -0
  155. package/src/scanner/index.ts +19 -0
  156. package/src/scanner/tree-builder.ts +156 -0
  157. package/tsconfig.json +8 -0
@@ -0,0 +1,120 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * 提取页面所在的分组名称(即它所在的相对目录)
4
+ */
5
+ function getPageGroup(page) {
6
+ const dir = path.dirname(page.filename);
7
+ if (dir === '.' || dir === '/' || !dir) {
8
+ return '根目录';
9
+ }
10
+ // 返回最上层或次上层的目录名作为分组名
11
+ return dir.replace(/\\/g, '/');
12
+ }
13
+ /**
14
+ * 清理文件名,去除 .md 后缀
15
+ */
16
+ function stripMarkdownExtension(filePath) {
17
+ if (filePath.endsWith('.md')) {
18
+ return filePath.slice(0, -3);
19
+ }
20
+ return filePath;
21
+ }
22
+ /**
23
+ * 生成符合 GitHub Wiki 扁平或路径兼容的 Wiki 链接
24
+ * 格式:[[显示名称|路径(无后缀)]]
25
+ */
26
+ function formatWikiLink(page) {
27
+ const cleanPath = stripMarkdownExtension(page.filename).replace(/\\/g, '/');
28
+ return `[[${page.title}|${cleanPath}]]`;
29
+ }
30
+ /**
31
+ * 生成 _Sidebar.md 内容,按目录分组展示
32
+ */
33
+ export function generateSidebar(pages) {
34
+ const groups = {};
35
+ for (const page of pages) {
36
+ // 跳过 Home.md 和 _Sidebar.md 本身以避免循环链接
37
+ const basename = path.basename(page.filename).toLowerCase();
38
+ if (basename === 'home.md' || basename === '_sidebar.md') {
39
+ continue;
40
+ }
41
+ const group = getPageGroup(page);
42
+ if (!groups[group]) {
43
+ groups[group] = [];
44
+ }
45
+ groups[group].push(page);
46
+ }
47
+ const lines = ['# 项目文档导航', ''];
48
+ // 定义常见分组的优先级排序,未定义的排在后面
49
+ const groupOrder = [
50
+ '项目概述',
51
+ '架构设计',
52
+ '核心功能模块',
53
+ '前端应用架构',
54
+ '后端服务架构',
55
+ '数据库设计',
56
+ 'API 参考文档',
57
+ 'AI 集成与提示词设计',
58
+ '安全与认证',
59
+ '开发者指南',
60
+ '部署与运维',
61
+ '故障排除与常见问题',
62
+ '根目录',
63
+ ];
64
+ const sortedGroups = Object.keys(groups).sort((a, b) => {
65
+ const indexA = groupOrder.indexOf(a);
66
+ const indexB = groupOrder.indexOf(b);
67
+ if (indexA !== -1 && indexB !== -1)
68
+ return indexA - indexB;
69
+ if (indexA !== -1)
70
+ return -1;
71
+ if (indexB !== -1)
72
+ return 1;
73
+ return a.localeCompare(b);
74
+ });
75
+ for (const group of sortedGroups) {
76
+ const groupPages = groups[group];
77
+ if (group === '根目录') {
78
+ lines.push('### 其他文档');
79
+ }
80
+ else {
81
+ lines.push(`### ${group}`);
82
+ }
83
+ for (const page of groupPages) {
84
+ lines.push(`- ${formatWikiLink(page)}`);
85
+ }
86
+ lines.push('');
87
+ }
88
+ return lines.join('\n').trim() + '\n';
89
+ }
90
+ /**
91
+ * 生成 Home.md 内容,为 Wiki 主页提供项目概览及索引导航
92
+ */
93
+ export function generateHome(pages, projectProfile) {
94
+ const lines = [];
95
+ lines.push(`# 欢迎使用 ${projectProfile.name} 项目 Wiki`);
96
+ lines.push('');
97
+ lines.push('这是一个由 RepoWiki 自动生成的本地代码库知识库。');
98
+ lines.push('');
99
+ // 项目基本信息卡片
100
+ lines.push('## 项目概要');
101
+ lines.push('');
102
+ lines.push(`- **项目名称**: \`${projectProfile.name}\``);
103
+ lines.push(`- **主力语言**: ${projectProfile.languages.join(', ') || '未知'}`);
104
+ if (projectProfile.frameworks.length > 0) {
105
+ lines.push(`- **使用框架**: ${projectProfile.frameworks.join(', ')}`);
106
+ }
107
+ if (projectProfile.databases.length > 0) {
108
+ lines.push(`- **数据库**: ${projectProfile.databases.join(', ')}`);
109
+ }
110
+ lines.push('');
111
+ // 全量 Wiki 导航索引
112
+ lines.push('## 知识库目录索引');
113
+ lines.push('');
114
+ const sidebarContent = generateSidebar(pages);
115
+ // 移除侧边栏标题以融合到 Home.md 中
116
+ const bodyContent = sidebarContent.replace('# 项目文档导航\n\n', '');
117
+ lines.push(bodyContent);
118
+ return lines.join('\n').trim() + '\n';
119
+ }
120
+ //# sourceMappingURL=sidebar-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-generator.js","sourceRoot":"","sources":["../../src/generator/sidebar-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { AnalysisResult, WikiPage } from '../models/index.js';
2
+ import type { LLMClient } from '../llm/index.js';
3
+ export interface WikiGeneratorConfig {
4
+ outputDir: string;
5
+ concurrency?: number;
6
+ }
7
+ export interface PlannedPage {
8
+ title: string;
9
+ filename: string;
10
+ summary: string;
11
+ requiredModules: string[];
12
+ }
13
+ /**
14
+ * 核心 Wiki 生成器
15
+ */
16
+ export declare class WikiGenerator {
17
+ private config;
18
+ private llmClient;
19
+ constructor(llmClient: LLMClient | null, config: WikiGeneratorConfig);
20
+ /**
21
+ * 规划 Wiki 页面列表
22
+ */
23
+ planPages(analysisResult: AnalysisResult): Promise<PlannedPage[]>;
24
+ /**
25
+ * 默认的 Wiki 页面规划(无 LLM 或 LLM 规划失败时使用)
26
+ */
27
+ private getDefaultPagePlan;
28
+ /**
29
+ * 对文件列表进行摘要压缩(如文件太大,先使用 LLM 摘要以节省 Context 空间)
30
+ */
31
+ private prepareSourceSummaries;
32
+ /**
33
+ * 生成单个页面内容
34
+ */
35
+ generatePage(rootPath: string, page: PlannedPage, analysisResult: AnalysisResult, existingPagesSummary?: string): Promise<WikiPage>;
36
+ /**
37
+ * 无大模型回退页面生成逻辑
38
+ */
39
+ private assembleFallbackPage;
40
+ /**
41
+ * 保存 Wiki 页面文件到 docs/wiki 目录
42
+ */
43
+ savePage(page: WikiPage): Promise<string>;
44
+ }
45
+ //# sourceMappingURL=wiki-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-generator.d.ts","sourceRoot":"","sources":["../../src/generator/wiki-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAA8B,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAUjD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,SAAS,CAAmB;gBAExB,SAAS,EAAE,SAAS,GAAG,IAAI,EAAE,MAAM,EAAE,mBAAmB;IAQpE;;OAEG;IACU,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA+B9E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0C1B;;OAEG;YACW,sBAAsB;IAoDpC;;OAEG;IACU,YAAY,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,cAAc,EAC9B,oBAAoB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAAC,QAAQ,CAAC;IA8BpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqD5B;;OAEG;IACU,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;CASzD"}
@@ -0,0 +1,217 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { buildWikiPlanPrompt, buildWikiPagePrompt, buildSourceSummaryPrompt } from '../llm/index.js';
4
+ import { assembleWikiPage, formatTroubleshootingTable } from './markdown-generator.js';
5
+ import { generateArchitectureDiagram, generateERDiagram, generateDependencyDiagram, generateApiDiagram, } from './mermaid-generator.js';
6
+ /**
7
+ * 核心 Wiki 生成器
8
+ */
9
+ export class WikiGenerator {
10
+ config;
11
+ llmClient;
12
+ constructor(llmClient, config) {
13
+ this.llmClient = llmClient;
14
+ this.config = {
15
+ outputDir: config.outputDir,
16
+ concurrency: config.concurrency ?? 3,
17
+ };
18
+ }
19
+ /**
20
+ * 规划 Wiki 页面列表
21
+ */
22
+ async planPages(analysisResult) {
23
+ if (!this.llmClient) {
24
+ return this.getDefaultPagePlan(analysisResult);
25
+ }
26
+ try {
27
+ const modulesStr = JSON.stringify(analysisResult.modules.map((m) => ({
28
+ moduleName: m.moduleName,
29
+ directory: m.directory,
30
+ summary: m.summary,
31
+ filesCount: m.files.length,
32
+ })), null, 2);
33
+ const techStackStr = JSON.stringify(analysisResult.project, null, 2);
34
+ const prompt = buildWikiPlanPrompt(analysisResult.tree, techStackStr, modulesStr);
35
+ const planned = await this.llmClient.chatJSON(prompt);
36
+ if (Array.isArray(planned) && planned.length > 0) {
37
+ return planned;
38
+ }
39
+ }
40
+ catch {
41
+ // 回退到默认规划
42
+ }
43
+ return this.getDefaultPagePlan(analysisResult);
44
+ }
45
+ /**
46
+ * 默认的 Wiki 页面规划(无 LLM 或 LLM 规划失败时使用)
47
+ */
48
+ getDefaultPagePlan(analysisResult) {
49
+ const plan = [
50
+ {
51
+ title: '项目概述',
52
+ filename: '项目概述/项目概述.md',
53
+ summary: '项目概要介绍与基本结构',
54
+ requiredModules: ['.'],
55
+ },
56
+ ];
57
+ // 为每个主要逻辑模块分别规划一个文档页面
58
+ for (const mod of analysisResult.modules) {
59
+ if (mod.directory === '.')
60
+ continue;
61
+ plan.push({
62
+ title: `${mod.moduleName} 模块分析`,
63
+ filename: `核心功能模块/${mod.moduleName}.md`,
64
+ summary: `${mod.moduleName} 模块的设计与实现细节`,
65
+ requiredModules: [mod.directory],
66
+ });
67
+ }
68
+ if (analysisResult.databaseModels.length > 0) {
69
+ plan.push({
70
+ title: '数据库设计',
71
+ filename: '数据库设计/数据库设计.md',
72
+ summary: '项目数据库结构及实体模型定义',
73
+ requiredModules: [],
74
+ });
75
+ }
76
+ if (analysisResult.apiRoutes.length > 0) {
77
+ plan.push({
78
+ title: 'API 参考文档',
79
+ filename: 'API参考文档/API参考文档.md',
80
+ summary: '项目公开的 HTTP 接口路由规范',
81
+ requiredModules: [],
82
+ });
83
+ }
84
+ return plan;
85
+ }
86
+ /**
87
+ * 对文件列表进行摘要压缩(如文件太大,先使用 LLM 摘要以节省 Context 空间)
88
+ */
89
+ async prepareSourceSummaries(rootPath, plannedPage, analysisResult) {
90
+ const summaries = [];
91
+ // 收集所有关联模块内的文件
92
+ const relatedFiles = [];
93
+ for (const modDir of plannedPage.requiredModules) {
94
+ const mod = analysisResult.modules.find((m) => m.directory === modDir);
95
+ if (mod) {
96
+ relatedFiles.push(...mod.files);
97
+ }
98
+ }
99
+ // 如果没有关联模块,则提取根目录附近的重要源文件
100
+ if (relatedFiles.length === 0) {
101
+ relatedFiles.push(...analysisResult.modules
102
+ .filter((m) => m.directory !== '.')
103
+ .slice(0, 3)
104
+ .flatMap((m) => m.files.slice(0, 2)));
105
+ }
106
+ // 限制最多分析前 8 个文件,防止 Context 溢出
107
+ const targetFiles = relatedFiles.slice(0, 8);
108
+ for (const relPath of targetFiles) {
109
+ try {
110
+ const absPath = path.resolve(rootPath, relPath);
111
+ const content = await fs.readFile(absPath, 'utf-8');
112
+ // 超过 4KB 的文件进行 LLM 摘要,小文件直接使用首部几行
113
+ if (content.length > 4000 && this.llmClient) {
114
+ const prompt = buildSourceSummaryPrompt(relPath, content.slice(0, 20000));
115
+ const summaryResult = await this.llmClient.chat(prompt);
116
+ summaries.push(`### 文件: ${relPath} (代码摘要)\n${summaryResult.content}`);
117
+ }
118
+ else {
119
+ const lines = content.split('\n');
120
+ const truncated = lines.slice(0, 100).join('\n');
121
+ summaries.push(`### 文件: ${relPath}\n\`\`\`\n${truncated}\n\`\`\``);
122
+ }
123
+ }
124
+ catch {
125
+ // 忽略单个文件读取错误
126
+ }
127
+ }
128
+ return summaries.join('\n\n');
129
+ }
130
+ /**
131
+ * 生成单个页面内容
132
+ */
133
+ async generatePage(rootPath, page, analysisResult, existingPagesSummary) {
134
+ if (this.llmClient) {
135
+ try {
136
+ const sourceSummaries = await this.prepareSourceSummaries(rootPath, page, analysisResult);
137
+ const prompt = buildWikiPagePrompt(page.title, analysisResult.tree, sourceSummaries, existingPagesSummary);
138
+ const response = await this.llmClient.chat(prompt);
139
+ const content = response.content;
140
+ return {
141
+ title: page.title,
142
+ filename: page.filename,
143
+ summary: page.summary,
144
+ content,
145
+ sourceRefs: [], // 稍后在后置处理中补充或由 LLM 直接写在 Markdown 中
146
+ };
147
+ }
148
+ catch {
149
+ // LLM 生成失败时回退到模板组装
150
+ }
151
+ }
152
+ // 本地模板组装(免 LLM 回退逻辑)
153
+ return this.assembleFallbackPage(page, analysisResult);
154
+ }
155
+ /**
156
+ * 无大模型回退页面生成逻辑
157
+ */
158
+ assembleFallbackPage(page, analysisResult) {
159
+ // 构建默认的图表
160
+ let archDiagram;
161
+ let erDiagram;
162
+ let depDiagram;
163
+ let apiDiagram;
164
+ if (page.title.includes('架构') || page.title.includes('概述')) {
165
+ archDiagram = generateArchitectureDiagram(analysisResult.modules, analysisResult.dependencies.edges || []);
166
+ }
167
+ if (page.title.includes('数据') || page.title.includes('DB') || page.filename.includes('database')) {
168
+ erDiagram = generateERDiagram(analysisResult.databaseModels);
169
+ }
170
+ if (page.title.includes('依赖') || page.filename.includes('dependency')) {
171
+ depDiagram = generateDependencyDiagram(analysisResult.modules, analysisResult.dependencies.edges || []);
172
+ }
173
+ if (page.title.includes('API') || page.filename.includes('api')) {
174
+ apiDiagram = generateApiDiagram(analysisResult.apiRoutes);
175
+ }
176
+ const projectRoot = analysisResult.project.rootPath;
177
+ const content = assembleWikiPage({
178
+ title: page.title,
179
+ citeRefs: [],
180
+ projectRoot,
181
+ introduction: `该文档是针对 "${page.title}" 模块的自动生成概要文档。\n${page.summary}`,
182
+ projectStructure: '项目整体目录结构树状视图如下。',
183
+ projectStructureDiagram: 'flowchart TD\n Root["项目根目录"]', // 简易树
184
+ coreComponents: '以下是该页面对应模块的核心类与组件列表。',
185
+ architectureOverview: archDiagram ? '项目整体模块架构设计及数据交互图如下。' : undefined,
186
+ architectureDiagram: archDiagram,
187
+ detailedAnalysis: erDiagram ? '数据表关系 (ER) 设计图如下。' : undefined,
188
+ troubleshooting: formatTroubleshootingTable([
189
+ {
190
+ problem: '模块无法加载/包缺失',
191
+ cause: '依赖未正确安装',
192
+ resolution: '在根目录下运行 `pnpm install` 或对应的依赖安装指令。',
193
+ },
194
+ ]),
195
+ conclusion: '文档自动构建完毕,详细系统设计请参考内部核心组件代码。',
196
+ appendix: `技术栈详情: ${analysisResult.project.languages.join(', ')}`,
197
+ });
198
+ return {
199
+ title: page.title,
200
+ filename: page.filename,
201
+ summary: page.summary,
202
+ content,
203
+ sourceRefs: [],
204
+ };
205
+ }
206
+ /**
207
+ * 保存 Wiki 页面文件到 docs/wiki 目录
208
+ */
209
+ async savePage(page) {
210
+ const destPath = path.join(this.config.outputDir, page.filename);
211
+ const destDir = path.dirname(destPath);
212
+ await fs.mkdir(destDir, { recursive: true });
213
+ await fs.writeFile(destPath, page.content, 'utf-8');
214
+ return destPath;
215
+ }
216
+ }
217
+ //# sourceMappingURL=wiki-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-generator.js","sourceRoot":"","sources":["../../src/generator/wiki-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RepoWiki Core API
3
+ * 包含代码库扫描、技术栈检测、静态代码分析、LLM 集成及 Markdown Wiki 生成的完整流程。
4
+ */
5
+ export * from './models/index.js';
6
+ export * from './scanner/index.js';
7
+ export * from './detector/index.js';
8
+ export * from './analyzer/index.js';
9
+ export * from './llm/index.js';
10
+ export * from './generator/index.js';
11
+ export * from './pipeline.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RepoWiki Core API
3
+ * 包含代码库扫描、技术栈检测、静态代码分析、LLM 集成及 Markdown Wiki 生成的完整流程。
4
+ */
5
+ export * from './models/index.js';
6
+ export * from './scanner/index.js';
7
+ export * from './detector/index.js';
8
+ export * from './analyzer/index.js';
9
+ export * from './llm/index.js';
10
+ export * from './generator/index.js';
11
+ export * from './pipeline.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @module auth-manager
3
+ * @description 管理 LLM API 凭证,支持多来源优先级链解析配置。
4
+ *
5
+ * 优先级链(按优先级从高到低):
6
+ * 1. 环境变量: REPOWIKI_API_KEY, REPOWIKI_BASE_URL, REPOWIKI_MODEL
7
+ * 2. 环境变量 (OpenAI 兼容): OPENAI_API_KEY, OPENAI_BASE_URL
8
+ * 3. 全局配置文件: ~/.repowiki/config.json
9
+ * 4. 工作区 .env 文件(使用 dotenv 解析)
10
+ */
11
+ /** LLM 服务配置 */
12
+ export interface LLMConfig {
13
+ /** API 端点地址 */
14
+ apiEndpoint: string;
15
+ /** 模型名称 */
16
+ modelName: string;
17
+ /** API 密钥 */
18
+ apiKey: string;
19
+ }
20
+ /**
21
+ * 按优先级链加载 LLM 配置。
22
+ *
23
+ * 解析顺序:
24
+ * 1. 进程环境变量(REPOWIKI_* 优先,其次 OPENAI_*)
25
+ * 2. 全局配置文件 ~/.repowiki/config.json
26
+ * 3. 工作区 .env 文件
27
+ *
28
+ * 对于每个字段,取优先级最高的非空值;若全部为空则使用默认值或空字符串。
29
+ *
30
+ * @param workspacePath - 可选的工作区路径,用于读取 .env 文件
31
+ * @returns 解析后的 LLM 配置
32
+ */
33
+ export declare function loadLLMConfig(workspacePath?: string): Promise<LLMConfig>;
34
+ /**
35
+ * 将配置保存到全局配置文件 ~/.repowiki/config.json。
36
+ *
37
+ * 如果文件已存在,则与现有配置合并(新值覆盖旧值)。
38
+ * 如果目录不存在,则自动创建。
39
+ *
40
+ * @param config - 要保存的部分配置
41
+ */
42
+ export declare function saveGlobalConfig(config: Partial<LLMConfig>): Promise<void>;
43
+ /**
44
+ * 验证 LLM 配置的完整性。
45
+ *
46
+ * @param config - 待验证的配置
47
+ * @returns 错误消息数组。若为空数组,则配置有效。
48
+ */
49
+ export declare function validateConfig(config: LLMConfig): string[];
50
+ //# sourceMappingURL=auth-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/llm/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,eAAe;AACf,MAAM,WAAW,SAAS;IACtB,eAAe;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAClB;AA4ED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA6B9E;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAyB1D"}