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,252 @@
1
+ /**
2
+ * 模块聚类分析器
3
+ * 将扫描到的文件按目录结构聚类为逻辑模块,并可选通过 LLM 生成模块描述。
4
+ */
5
+ import * as path from 'node:path';
6
+ import { buildModuleAnalysisPrompt } from '../llm/index.js';
7
+ // ============================================================================
8
+ // 目录 → 分类标签映射
9
+ // ============================================================================
10
+ /** 目录名关键词到分类标签的映射规则 */
11
+ const CATEGORY_RULES = [
12
+ { keywords: ['agent'], category: 'agents' },
13
+ { keywords: ['model', 'entity', 'schema'], category: 'models' },
14
+ { keywords: ['route', 'router', 'controller', 'endpoint'], category: 'api' },
15
+ { keywords: ['test', '__tests__', 'spec'], category: 'tests' },
16
+ { keywords: ['component', 'components'], category: 'components' },
17
+ { keywords: ['view', 'views', 'page', 'pages'], category: 'views' },
18
+ { keywords: ['hook', 'hooks'], category: 'hooks' },
19
+ { keywords: ['util', 'utils', 'helper', 'helpers', 'lib'], category: 'utilities' },
20
+ { keywords: ['service', 'services'], category: 'services' },
21
+ { keywords: ['middleware', 'middlewares'], category: 'middleware' },
22
+ { keywords: ['config', 'configuration'], category: 'config' },
23
+ { keywords: ['store', 'stores', 'state'], category: 'state' },
24
+ { keywords: ['workflow', 'workflows', 'pipeline'], category: 'workflows' },
25
+ { keywords: ['migration', 'migrations'], category: 'migrations' },
26
+ { keywords: ['static', 'public', 'assets'], category: 'assets' },
27
+ { keywords: ['type', 'types', 'interface', 'interfaces'], category: 'types' },
28
+ { keywords: ['llm', 'ai', 'prompt', 'prompts'], category: 'ai' },
29
+ { keywords: ['auth', 'authentication', 'authorization'], category: 'auth' },
30
+ { keywords: ['doc', 'docs', 'documentation'], category: 'docs' },
31
+ { keywords: ['script', 'scripts', 'tool', 'tools'], category: 'tooling' },
32
+ ];
33
+ /**
34
+ * 根据目录路径推断分类标签
35
+ * @param dirPath - 目录的相对路径
36
+ * @returns 匹配的分类标签,无匹配时返回 'general'
37
+ */
38
+ function inferCategory(dirPath) {
39
+ const normalizedPath = dirPath.replace(/\\/g, '/').toLowerCase();
40
+ const segments = normalizedPath.split('/');
41
+ for (const rule of CATEGORY_RULES) {
42
+ for (const segment of segments) {
43
+ if (rule.keywords.some((kw) => segment.includes(kw))) {
44
+ return rule.category;
45
+ }
46
+ }
47
+ }
48
+ return 'general';
49
+ }
50
+ /**
51
+ * 从目录路径推导模块名称
52
+ * 取路径中最后一级有意义的目录名,如 'apps/api' → 'api','src/components' → 'components'
53
+ *
54
+ * @param dirPath - 目录的相对路径
55
+ * @returns 模块名称
56
+ */
57
+ function deriveModuleName(dirPath) {
58
+ const segments = dirPath
59
+ .replace(/\\/g, '/')
60
+ .split('/')
61
+ .filter((s) => s.length > 0);
62
+ // 跳过仅作命名空间的顶级目录(如 src)
63
+ const skipSegments = new Set(['src', 'source', 'lib', 'app']);
64
+ const meaningfulSegments = segments.filter((s) => !skipSegments.has(s.toLowerCase()));
65
+ if (meaningfulSegments.length > 0) {
66
+ return meaningfulSegments[meaningfulSegments.length - 1];
67
+ }
68
+ return segments[segments.length - 1] || 'root';
69
+ }
70
+ /**
71
+ * 提取文件的分组键:取前两级目录路径
72
+ * 例如 'apps/api/routers/user.py' → 'apps/api'
73
+ * 'src/components/Header.tsx' → 'src/components'
74
+ * 'main.py' → '.'
75
+ *
76
+ * @param relativePath - 文件相对路径
77
+ * @returns 分组键
78
+ */
79
+ function getGroupKey(relativePath) {
80
+ const normalized = relativePath.replace(/\\/g, '/');
81
+ const parts = normalized.split('/');
82
+ if (parts.length <= 1) {
83
+ // 根目录下的文件
84
+ return '.';
85
+ }
86
+ if (parts.length === 2) {
87
+ // 只有一级目录
88
+ return parts[0];
89
+ }
90
+ // 取前两级目录
91
+ return `${parts[0]}/${parts[1]}`;
92
+ }
93
+ /**
94
+ * 基于文件名和结构生成基本模块描述(无 LLM 时的回退逻辑)
95
+ *
96
+ * @param moduleName - 模块名称
97
+ * @param directory - 目录路径
98
+ * @param files - 文件列表
99
+ * @param category - 分类标签
100
+ * @returns 模块描述文本
101
+ */
102
+ function generateBasicSummary(moduleName, directory, files, category) {
103
+ const extCounts = new Map();
104
+ for (const f of files) {
105
+ const ext = path.extname(f).toLowerCase();
106
+ if (ext) {
107
+ extCounts.set(ext, (extCounts.get(ext) || 0) + 1);
108
+ }
109
+ }
110
+ const extSummary = Array.from(extCounts.entries())
111
+ .sort((a, b) => b[1] - a[1])
112
+ .map(([ext, count]) => `${ext}(${count})`)
113
+ .join(', ');
114
+ const categoryDescriptions = {
115
+ agents: 'Agent 智能体相关逻辑',
116
+ models: '数据模型定义',
117
+ api: 'API 路由与控制器',
118
+ tests: '测试代码',
119
+ components: 'UI 组件',
120
+ views: '视图/页面',
121
+ hooks: 'React Hooks',
122
+ utilities: '工具函数与辅助库',
123
+ services: '业务服务层',
124
+ middleware: '中间件',
125
+ config: '配置管理',
126
+ state: '状态管理',
127
+ workflows: '工作流/流水线编排',
128
+ migrations: '数据库迁移脚本',
129
+ assets: '静态资源',
130
+ types: '类型定义',
131
+ ai: 'AI/LLM 集成',
132
+ auth: '认证与授权',
133
+ docs: '文档',
134
+ tooling: '脚本与工具',
135
+ general: '通用模块',
136
+ };
137
+ const categoryDesc = categoryDescriptions[category] || '通用模块';
138
+ return `${moduleName} 模块位于 ${directory},包含 ${files.length} 个文件(${extSummary}),主要负责${categoryDesc}。`;
139
+ }
140
+ /**
141
+ * 基于文件列表推断核心组件(无 LLM 时的回退逻辑)
142
+ *
143
+ * @param files - 文件列表
144
+ * @returns 推断的核心组件列表
145
+ */
146
+ function inferCoreComponents(files) {
147
+ const components = [];
148
+ const seen = new Set();
149
+ for (const filePath of files) {
150
+ const basename = path.basename(filePath, path.extname(filePath));
151
+ // 跳过 index 文件和常见工具文件
152
+ if (['index', 'types', 'constants', 'utils'].includes(basename.toLowerCase())) {
153
+ continue;
154
+ }
155
+ // 跳过测试文件
156
+ if (/\.(test|spec|e2e)$/i.test(basename)) {
157
+ continue;
158
+ }
159
+ if (seen.has(basename))
160
+ continue;
161
+ seen.add(basename);
162
+ components.push({
163
+ name: basename,
164
+ description: `定义于 ${filePath}`,
165
+ });
166
+ // 最多保留 10 个核心组件
167
+ if (components.length >= 10)
168
+ break;
169
+ }
170
+ return components;
171
+ }
172
+ /**
173
+ * 将文件聚类为逻辑模块并生成描述
174
+ *
175
+ * 将扫描到的全部文件按顶级和次级目录分组,每个分组视为一个逻辑模块。
176
+ * 若提供 LLM 客户端,则通过 LLM 为每个模块生成专业描述;
177
+ * 否则基于文件结构启发式推断。
178
+ *
179
+ * @param rootPath - 项目根目录的绝对路径
180
+ * @param files - 扫描到的 FileNode 列表
181
+ * @param llmClient - 可选的 LLM 客户端实例
182
+ * @returns 分析得到的 ModuleInfo 数组
183
+ */
184
+ export async function analyzeModules(rootPath, files, llmClient) {
185
+ // ------------------------------------------------------------------
186
+ // 第一步:按目录分组
187
+ // ------------------------------------------------------------------
188
+ const groups = new Map();
189
+ for (const file of files) {
190
+ if (file.nodeType !== 'file')
191
+ continue;
192
+ const key = getGroupKey(file.relativePath);
193
+ if (!groups.has(key)) {
194
+ groups.set(key, []);
195
+ }
196
+ groups.get(key).push(file.relativePath);
197
+ }
198
+ // ------------------------------------------------------------------
199
+ // 第二步:为每个分组构建 ModuleInfo
200
+ // ------------------------------------------------------------------
201
+ const modules = [];
202
+ for (const [directory, moduleFiles] of groups) {
203
+ const moduleName = deriveModuleName(directory);
204
+ const category = inferCategory(directory);
205
+ const moduleInfo = {
206
+ moduleName,
207
+ directory,
208
+ files: moduleFiles.sort(),
209
+ summary: '',
210
+ category,
211
+ coreComponents: [],
212
+ };
213
+ modules.push(moduleInfo);
214
+ }
215
+ // ------------------------------------------------------------------
216
+ // 第三步:生成描述(LLM 或回退)
217
+ // ------------------------------------------------------------------
218
+ if (llmClient) {
219
+ // 使用 LLM 逐模块生成描述,串行调用以避免速率限制
220
+ for (const mod of modules) {
221
+ try {
222
+ const prompt = buildModuleAnalysisPrompt(mod.directory, mod.files.join('\n'), '');
223
+ const result = await llmClient.chatJSON(prompt);
224
+ if (result && typeof result.summary === 'string') {
225
+ mod.summary = result.summary;
226
+ }
227
+ if (result && Array.isArray(result.core_components)) {
228
+ mod.coreComponents = result.core_components.map((c) => ({
229
+ name: String(c.name || ''),
230
+ description: String(c.description || ''),
231
+ }));
232
+ }
233
+ }
234
+ catch {
235
+ // LLM 调用失败时使用回退逻辑
236
+ mod.summary = generateBasicSummary(mod.moduleName, mod.directory, mod.files, mod.category);
237
+ mod.coreComponents = inferCoreComponents(mod.files);
238
+ }
239
+ }
240
+ }
241
+ else {
242
+ // 无 LLM,使用基于结构的启发式描述
243
+ for (const mod of modules) {
244
+ mod.summary = generateBasicSummary(mod.moduleName, mod.directory, mod.files, mod.category);
245
+ mod.coreComponents = inferCoreComponents(mod.files);
246
+ }
247
+ }
248
+ // 按目录路径排序输出
249
+ modules.sort((a, b) => a.directory.localeCompare(b.directory));
250
+ return modules;
251
+ }
252
+ //# sourceMappingURL=module-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/module-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FileNode } from '../models/index.js';
2
+ export interface WorkflowInfo {
3
+ name: string;
4
+ type: 'langchain' | 'langgraph' | 'custom-agent' | 'celery' | 'temporal' | 'custom-workflow';
5
+ filePath: string;
6
+ description: string;
7
+ steps: string[];
8
+ }
9
+ /**
10
+ * 分析项目中的智能体(Agent)和工作流(Workflow)设计模式
11
+ *
12
+ * 识别 LangGraph, LangChain, Celery, Temporal 以及自定义 Agent 结构,
13
+ * 提取工作流节点与流转步骤。
14
+ *
15
+ * @param rootPath - 项目根目录
16
+ * @param files - 扫描的文件节点
17
+ */
18
+ export declare function analyzeWorkflows(rootPath: string, files: FileNode[]): Promise<WorkflowInfo[]>;
19
+ //# sourceMappingURL=workflow-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/workflow-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,iBAAiB,CAAC;IAC7F,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAsID;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoCnG"}
@@ -0,0 +1,165 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ /**
4
+ * 根据导入和内容模式识别工作流/智能体类型
5
+ */
6
+ function detectWorkflowType(content, relativePath) {
7
+ const lowerContent = content.toLowerCase();
8
+ const normalizedPath = relativePath.replace(/\\/g, '/').toLowerCase();
9
+ if (lowerContent.includes('langgraph') || lowerContent.includes('stategraph')) {
10
+ return 'langgraph';
11
+ }
12
+ if (lowerContent.includes('langchain') || lowerContent.includes('agentexecutor') || lowerContent.includes('create_react_agent')) {
13
+ return 'langchain';
14
+ }
15
+ if (lowerContent.includes('celery') || lowerContent.includes('@shared_task') || lowerContent.includes('@app.task')) {
16
+ return 'celery';
17
+ }
18
+ if (lowerContent.includes('temporalio') || lowerContent.includes('@workflow.defn') || lowerContent.includes('workflow.run')) {
19
+ return 'temporal';
20
+ }
21
+ // 启发式路径规则
22
+ if (normalizedPath.includes('/agent/') || normalizedPath.includes('/agents/') || normalizedPath.includes('agent.py') || normalizedPath.includes('agent.ts')) {
23
+ return 'custom-agent';
24
+ }
25
+ if (normalizedPath.includes('/workflow/') || normalizedPath.includes('/workflows/') || normalizedPath.includes('/pipeline/') || normalizedPath.includes('/pipelines/')) {
26
+ return 'custom-workflow';
27
+ }
28
+ return null;
29
+ }
30
+ /**
31
+ * 提取工作流步骤或节点
32
+ */
33
+ function extractSteps(content, type) {
34
+ const steps = [];
35
+ switch (type) {
36
+ case 'langgraph': {
37
+ // 匹配 .add_node("name", ...) 或 .add_node('name', ...)
38
+ const nodePattern = /\.add_node\(\s*['"]([^'"]+)['"]/g;
39
+ let match;
40
+ while ((match = nodePattern.exec(content)) !== null) {
41
+ steps.push(match[1]);
42
+ }
43
+ // 也可能匹配 .add_edge("nodeA", "nodeB")
44
+ const edgePattern = /\.add_edge\(\s*['"]([^'"]+)['"]\s*,\s*['"]([^'"]+)['"]/g;
45
+ while ((match = edgePattern.exec(content)) !== null) {
46
+ const edgeStr = `${match[1]} -> ${match[2]}`;
47
+ if (!steps.includes(edgeStr)) {
48
+ steps.push(edgeStr);
49
+ }
50
+ }
51
+ break;
52
+ }
53
+ case 'langchain': {
54
+ // 匹配 Tool 定义或 Agent 步骤
55
+ const toolPattern = /@tool\b|Tool\.from_function|class\s+(\w+Tool)\b/g;
56
+ let match;
57
+ while ((match = toolPattern.exec(content)) !== null) {
58
+ steps.push(match[1] || 'Registered Tool');
59
+ }
60
+ break;
61
+ }
62
+ case 'celery': {
63
+ // 匹配任务函数
64
+ const taskPattern = /@(?:app|shared)_task\s*(?:\([^)]*\))?\s*\n\s*(?:async\s+)?def\s+(\w+)/g;
65
+ let match;
66
+ while ((match = taskPattern.exec(content)) !== null) {
67
+ steps.push(match[1]);
68
+ }
69
+ break;
70
+ }
71
+ case 'temporal': {
72
+ // 匹配活动或工作流定义
73
+ const temporalPattern = /@workflow\.run\b\s*\n\s*(?:async\s+)?def\s+(\w+)|@activity\.defn\b\s*\n\s*(?:async\s+)?def\s+(\w+)/g;
74
+ let match;
75
+ while ((match = temporalPattern.exec(content)) !== null) {
76
+ steps.push(match[1] || match[2]);
77
+ }
78
+ break;
79
+ }
80
+ case 'custom-agent':
81
+ case 'custom-workflow': {
82
+ // 匹配类中的主要方法名,如 run, execute, process, invoke, step
83
+ const methodPattern = /(?:async\s+)?def\s+(run|execute|process|invoke|step|start|next_step)\s*\(/g;
84
+ let match;
85
+ while ((match = methodPattern.exec(content)) !== null) {
86
+ steps.push(match[1]);
87
+ }
88
+ break;
89
+ }
90
+ }
91
+ return Array.from(new Set(steps));
92
+ }
93
+ /**
94
+ * 猜测工作流名称
95
+ */
96
+ function deriveWorkflowName(content, filePath) {
97
+ const basename = path.basename(filePath, path.extname(filePath));
98
+ // 尝试寻找类名定义,如 class Agent, class WritingWorkflow
99
+ const classMatch = /class\s+(\w+(?:Agent|Workflow|Graph|Pipeline|Chain))\b/.exec(content);
100
+ if (classMatch) {
101
+ return classMatch[1];
102
+ }
103
+ return basename.replace(/^./, (c) => c.toUpperCase());
104
+ }
105
+ /**
106
+ * 生成工作流简要描述
107
+ */
108
+ function generateDescription(name, type, steps) {
109
+ const typeNames = {
110
+ langgraph: 'LangGraph 状态图智能体工作流',
111
+ langchain: 'LangChain 链式/智能体代理执行器',
112
+ celery: 'Celery 分布式异步任务队列',
113
+ temporal: 'Temporal 强一致性持久工作流',
114
+ 'custom-agent': '自定义 Agent 智能体逻辑',
115
+ 'custom-workflow': '自定义业务流程/工作流',
116
+ };
117
+ const typeDesc = typeNames[type] || '业务工作流';
118
+ if (steps.length > 0) {
119
+ return `${name} 是一个基于 ${typeDesc},定义了包含 [${steps.join(', ')}] 等关键节点或步骤。`;
120
+ }
121
+ return `${name} 定义了项目中的 ${typeDesc} 流程。`;
122
+ }
123
+ /**
124
+ * 分析项目中的智能体(Agent)和工作流(Workflow)设计模式
125
+ *
126
+ * 识别 LangGraph, LangChain, Celery, Temporal 以及自定义 Agent 结构,
127
+ * 提取工作流节点与流转步骤。
128
+ *
129
+ * @param rootPath - 项目根目录
130
+ * @param files - 扫描的文件节点
131
+ */
132
+ export async function analyzeWorkflows(rootPath, files) {
133
+ const workflows = [];
134
+ for (const file of files) {
135
+ if (file.nodeType !== 'file')
136
+ continue;
137
+ // 仅对文本源文件分析
138
+ const ext = path.extname(file.relativePath).toLowerCase();
139
+ if (!['.py', '.ts', '.js', '.tsx', '.jsx'].includes(ext)) {
140
+ continue;
141
+ }
142
+ try {
143
+ const absolutePath = path.resolve(rootPath, file.relativePath);
144
+ const content = await fs.readFile(absolutePath, 'utf-8');
145
+ const type = detectWorkflowType(content, file.relativePath);
146
+ if (!type)
147
+ continue;
148
+ const name = deriveWorkflowName(content, file.relativePath);
149
+ const steps = extractSteps(content, type);
150
+ const description = generateDescription(name, type, steps);
151
+ workflows.push({
152
+ name,
153
+ type,
154
+ filePath: file.relativePath,
155
+ description,
156
+ steps,
157
+ });
158
+ }
159
+ catch {
160
+ // 忽略读取错误
161
+ }
162
+ }
163
+ return workflows.sort((a, b) => a.filePath.localeCompare(b.filePath));
164
+ }
165
+ //# sourceMappingURL=workflow-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-analyzer.js","sourceRoot":"","sources":["../../src/analyzer/workflow-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAWlC;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,YAAoB;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtE,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5E,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC9H,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACjH,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1H,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,UAAU;IACV,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1J,OAAO,cAAc,CAAC;IAC1B,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACrK,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,qDAAqD;YACrD,MAAM,WAAW,GAAG,kCAAkC,CAAC;YACvD,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,oCAAoC;YACpC,MAAM,WAAW,GAAG,yDAAyD,CAAC;YAC9E,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YACD,MAAM;QACV,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,uBAAuB;YACvB,MAAM,WAAW,GAAG,kDAAkD,CAAC;YACvE,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM;QACV,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,SAAS;YACT,MAAM,WAAW,GAAG,wEAAwE,CAAC;YAC7F,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,MAAM;QACV,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YACd,aAAa;YACb,MAAM,eAAe,GAAG,qGAAqG,CAAC;YAC9H,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,MAAM;QACV,CAAC;QACD,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACrB,mDAAmD;YACnD,MAAM,aAAa,GAAG,4EAA4E,CAAC;YACnG,IAAI,KAA6B,CAAC;YAClC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,MAAM;QACV,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjE,gDAAgD;IAChD,MAAM,UAAU,GAAG,wDAAwD,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1F,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAY,EAAE,KAAe;IACpE,MAAM,SAAS,GAA2B;QACtC,SAAS,EAAE,qBAAqB;QAChC,SAAS,EAAE,uBAAuB;QAClC,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,iBAAiB;QACjC,iBAAiB,EAAE,aAAa;KACnC,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,UAAU,QAAQ,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,IAAI,YAAY,QAAQ,MAAM,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,KAAiB;IACtE,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;YAAE,SAAS;QAEvC,YAAY;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,SAAS;QACb,CAAC;QAED,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAEzD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAE3D,SAAS,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,YAAY;gBAC3B,WAAW;gBACX,KAAK;aACR,CAAC,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @module detector/dependency-detector
3
+ * 依赖关系探测器
4
+ *
5
+ * 通过正则表达式解析源文件中的 import / require 语句,
6
+ * 构建项目内部模块间的依赖图以及外部包引用列表。
7
+ *
8
+ * 为避免性能问题,仅处理前 500 个源文件。
9
+ */
10
+ import type { FileNode } from '../models/index.js';
11
+ /** 依赖边,表示一个文件对另一个模块的引用 */
12
+ export interface DependencyEdge {
13
+ /** 源文件的相对路径 */
14
+ source: string;
15
+ /** 引用目标的相对路径(内部模块)或包名(外部依赖) */
16
+ target: string;
17
+ /** 是否为外部依赖 */
18
+ isExternal: boolean;
19
+ }
20
+ /** 完整的依赖关系图 */
21
+ export interface DependencyGraph {
22
+ /** 所有依赖边 */
23
+ edges: DependencyEdge[];
24
+ /** 参与图中的内部模块路径列表 */
25
+ internalModules: string[];
26
+ /** 引用到的外部包名列表 */
27
+ externalPackages: string[];
28
+ }
29
+ /**
30
+ * 构建项目依赖关系图。
31
+ *
32
+ * 扫描源文件(.ts, .tsx, .js, .jsx, .py)中的 import/require 语句,
33
+ * 将导入分类为内部模块引用和外部包引用,尝试解析内部导入的实际文件路径,
34
+ * 并汇总为完整的依赖图。
35
+ *
36
+ * 为避免性能问题,最多处理前 {@link MAX_SOURCE_FILES} 个源文件。
37
+ *
38
+ * @param rootPath 项目根目录的绝对路径
39
+ * @param files FileScanner 输出的文件节点列表
40
+ * @returns 完整的依赖关系图
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * const graph = await buildDependencyGraph('/path/to/project', files);
45
+ * console.log(graph.externalPackages); // ['react', 'express', ...]
46
+ * console.log(graph.edges.length); // 依赖边数量
47
+ * ```
48
+ */
49
+ export declare function buildDependencyGraph(rootPath: string, files: FileNode[]): Promise<DependencyGraph>;
50
+ //# sourceMappingURL=dependency-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-detector.d.ts","sourceRoot":"","sources":["../../src/detector/dependency-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD,0BAA0B;AAC1B,MAAM,WAAW,cAAc;IAC3B,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,eAAe;AACf,MAAM,WAAW,eAAe;IAC5B,YAAY;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,oBAAoB;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB;IACjB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC9B;AA6OD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,oBAAoB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EAAE,GAClB,OAAO,CAAC,eAAe,CAAC,CA6F1B"}