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 @@
1
+ {"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/file-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AA4E5D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iCAAiC;IACjC,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAaD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwErB"}
@@ -0,0 +1,149 @@
1
+ import fg from 'fast-glob';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { createIgnoreFilter } from './ignore-rules.js';
5
+ // ---------------------------------------------------------------------------
6
+ // 语言映射表
7
+ // ---------------------------------------------------------------------------
8
+ /**
9
+ * 文件扩展名 → 语言标识的映射。
10
+ * 键为小写扩展名 (不含前导点)。
11
+ */
12
+ const LANGUAGE_MAP = {
13
+ ts: 'typescript',
14
+ tsx: 'typescriptreact',
15
+ js: 'javascript',
16
+ jsx: 'javascriptreact',
17
+ py: 'python',
18
+ go: 'go',
19
+ rs: 'rust',
20
+ java: 'java',
21
+ rb: 'ruby',
22
+ css: 'css',
23
+ html: 'html',
24
+ md: 'markdown',
25
+ json: 'json',
26
+ yaml: 'yaml',
27
+ yml: 'yaml',
28
+ toml: 'toml',
29
+ sql: 'sql',
30
+ prisma: 'prisma',
31
+ vue: 'vue',
32
+ svelte: 'svelte',
33
+ };
34
+ /**
35
+ * 根据文件扩展名推断编程语言。
36
+ *
37
+ * @param filePath - 文件路径 (仅使用扩展名部分)
38
+ * @returns 语言标识字符串,无法识别时返回 `undefined`
39
+ */
40
+ function detectLanguage(filePath) {
41
+ const ext = path.extname(filePath).slice(1).toLowerCase();
42
+ return LANGUAGE_MAP[ext];
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // 行数统计
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * 统计文件中非空行数。
49
+ * 对大于 2 MB 的文件跳过行数统计以避免内存压力。
50
+ */
51
+ async function countNonEmptyLines(filePath, sizeBytes) {
52
+ // 跳过过大的文件
53
+ const MAX_SIZE_FOR_LINE_COUNT = 2 * 1024 * 1024; // 2 MB
54
+ if (sizeBytes > MAX_SIZE_FOR_LINE_COUNT) {
55
+ return undefined;
56
+ }
57
+ try {
58
+ const content = await readFile(filePath, 'utf-8');
59
+ return content.split(/\r?\n/).filter((line) => line.trim().length > 0).length;
60
+ }
61
+ catch {
62
+ // 二进制文件或无法读取 —— 静默跳过
63
+ return undefined;
64
+ }
65
+ }
66
+ /** 默认配置 */
67
+ const DEFAULT_CONFIG = {
68
+ maxDepth: 5,
69
+ ignorePatterns: [],
70
+ includeExtensions: [],
71
+ };
72
+ // ---------------------------------------------------------------------------
73
+ // 核心扫描函数
74
+ // ---------------------------------------------------------------------------
75
+ /**
76
+ * 递归扫描项目目录,返回扁平的 {@link FileNode} 列表。
77
+ *
78
+ * @param rootPath - 项目根目录的绝对路径
79
+ * @param config - 可选配置,覆盖默认值
80
+ * @returns 排序后的 FileNode 列表 (按相对路径字母序)
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const files = await scanDirectory('/path/to/project');
85
+ * console.log(files.length);
86
+ * ```
87
+ */
88
+ export async function scanDirectory(rootPath, config) {
89
+ const cfg = { ...DEFAULT_CONFIG, ...config };
90
+ // 将 rootPath 规范化为 posix 风格以兼容 fast-glob
91
+ const normalizedRoot = rootPath.replace(/\\/g, '/');
92
+ // 构建忽略过滤器
93
+ const shouldIgnore = await createIgnoreFilter(rootPath);
94
+ // 构建 glob 模式
95
+ const pattern = `${normalizedRoot}/**/*`;
96
+ // fast-glob 选项
97
+ const entries = await fg(pattern, {
98
+ dot: false,
99
+ onlyFiles: true,
100
+ deep: cfg.maxDepth,
101
+ ignore: cfg.ignorePatterns,
102
+ absolute: true,
103
+ stats: false,
104
+ });
105
+ const nodes = [];
106
+ for (const absPath of entries) {
107
+ // 计算相对路径 (posix 风格)
108
+ const relativePath = path
109
+ .relative(rootPath, absPath)
110
+ .replace(/\\/g, '/');
111
+ // 应用 ignore 过滤器
112
+ if (shouldIgnore(relativePath)) {
113
+ continue;
114
+ }
115
+ // 扩展名过滤
116
+ if (cfg.includeExtensions.length > 0) {
117
+ const ext = path.extname(absPath).slice(1).toLowerCase();
118
+ if (!cfg.includeExtensions.includes(ext)) {
119
+ continue;
120
+ }
121
+ }
122
+ // 获取文件信息
123
+ let fileStat;
124
+ try {
125
+ fileStat = await stat(absPath);
126
+ }
127
+ catch {
128
+ // 文件在扫描期间被删除等异常情况 —— 静默跳过
129
+ continue;
130
+ }
131
+ const sizeBytes = fileStat.size;
132
+ const language = detectLanguage(absPath);
133
+ const lineCount = language
134
+ ? await countNonEmptyLines(absPath, sizeBytes)
135
+ : undefined;
136
+ nodes.push({
137
+ path: absPath,
138
+ relativePath,
139
+ nodeType: 'file',
140
+ sizeBytes,
141
+ language,
142
+ lineCount,
143
+ });
144
+ }
145
+ // 按相对路径排序
146
+ nodes.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
147
+ return nodes;
148
+ }
149
+ //# sourceMappingURL=file-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/scanner/file-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 默认忽略的目录 / 文件 glob 模式。
3
+ * 这些模式在任何项目中都应被忽略 (构建产物、依赖、缓存等)。
4
+ */
5
+ export declare const DEFAULT_IGNORE_PATTERNS: readonly string[];
6
+ /**
7
+ * 敏感文件强制忽略模式。
8
+ * 为避免将密钥 / 凭据意外写入 Wiki,这些文件始终被排除。
9
+ */
10
+ export declare const SENSITIVE_FILE_PATTERNS: readonly string[];
11
+ /**
12
+ * 创建一个用于判断文件路径是否应被忽略的过滤函数。
13
+ *
14
+ * 合并以下三类规则:
15
+ * 1. 项目根目录下的 `.gitignore`
16
+ * 2. {@link DEFAULT_IGNORE_PATTERNS}
17
+ * 3. {@link SENSITIVE_FILE_PATTERNS}
18
+ *
19
+ * @param projectRoot - 项目根目录的绝对路径
20
+ * @returns 一个判定函数。传入**相对路径**,返回 `true` 代表该路径应被忽略。
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const shouldIgnore = await createIgnoreFilter('/path/to/project');
25
+ * if (shouldIgnore('node_modules/foo/index.js')) {
26
+ * // 跳过
27
+ * }
28
+ * ```
29
+ */
30
+ export declare function createIgnoreFilter(projectRoot: string): Promise<(relativePath: string) => boolean>;
31
+ //# sourceMappingURL=ignore-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-rules.d.ts","sourceRoot":"","sources":["../../src/scanner/ignore-rules.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAgBpD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAUpD,CAAC;AA8BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,CAgB5C"}
@@ -0,0 +1,98 @@
1
+ import ignore from 'ignore';
2
+ import { readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ // ---------------------------------------------------------------------------
5
+ // 默认忽略规则
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * 默认忽略的目录 / 文件 glob 模式。
9
+ * 这些模式在任何项目中都应被忽略 (构建产物、依赖、缓存等)。
10
+ */
11
+ export const DEFAULT_IGNORE_PATTERNS = [
12
+ '.git/',
13
+ 'node_modules/',
14
+ 'dist/',
15
+ 'build/',
16
+ '.next/',
17
+ 'venv/',
18
+ '.venv/',
19
+ '__pycache__/',
20
+ '.pytest_cache/',
21
+ 'coverage/',
22
+ '.cache/',
23
+ '.DS_Store',
24
+ '*.lock',
25
+ '*.min.js',
26
+ '*.map',
27
+ ];
28
+ /**
29
+ * 敏感文件强制忽略模式。
30
+ * 为避免将密钥 / 凭据意外写入 Wiki,这些文件始终被排除。
31
+ */
32
+ export const SENSITIVE_FILE_PATTERNS = [
33
+ '.env',
34
+ '.env.local',
35
+ '.env.production',
36
+ '*.pem',
37
+ '*.key',
38
+ 'id_rsa',
39
+ 'id_ed25519',
40
+ 'secrets.yaml',
41
+ 'credentials.json',
42
+ ];
43
+ // ---------------------------------------------------------------------------
44
+ // 辅助函数
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * 尝试读取项目根目录下的 `.gitignore` 文件,并返回其内容行。
48
+ * 如果文件不存在或读取失败,返回空数组。
49
+ */
50
+ async function loadGitignoreLines(projectRoot) {
51
+ try {
52
+ const content = await readFile(path.join(projectRoot, '.gitignore'), 'utf-8');
53
+ return content
54
+ .split(/\r?\n/)
55
+ .map((line) => line.trim())
56
+ .filter((line) => line.length > 0 && !line.startsWith('#'));
57
+ }
58
+ catch {
59
+ // .gitignore 不存在或不可读 —— 静默跳过
60
+ return [];
61
+ }
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // 核心 API
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * 创建一个用于判断文件路径是否应被忽略的过滤函数。
68
+ *
69
+ * 合并以下三类规则:
70
+ * 1. 项目根目录下的 `.gitignore`
71
+ * 2. {@link DEFAULT_IGNORE_PATTERNS}
72
+ * 3. {@link SENSITIVE_FILE_PATTERNS}
73
+ *
74
+ * @param projectRoot - 项目根目录的绝对路径
75
+ * @returns 一个判定函数。传入**相对路径**,返回 `true` 代表该路径应被忽略。
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const shouldIgnore = await createIgnoreFilter('/path/to/project');
80
+ * if (shouldIgnore('node_modules/foo/index.js')) {
81
+ * // 跳过
82
+ * }
83
+ * ```
84
+ */
85
+ export async function createIgnoreFilter(projectRoot) {
86
+ const ig = (ignore.default || ignore)();
87
+ // 1. 加载 .gitignore
88
+ const gitignoreLines = await loadGitignoreLines(projectRoot);
89
+ if (gitignoreLines.length > 0) {
90
+ ig.add(gitignoreLines);
91
+ }
92
+ // 2. 默认忽略模式
93
+ ig.add(DEFAULT_IGNORE_PATTERNS);
94
+ // 3. 敏感文件模式
95
+ ig.add(SENSITIVE_FILE_PATTERNS);
96
+ return (relativePath) => ig.ignores(relativePath);
97
+ }
98
+ //# sourceMappingURL=ignore-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-rules.js","sourceRoot":"","sources":["../../src/scanner/ignore-rules.ts"],"names":[],"mappings":"AAAA,OAAO,MAAuB,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACtD,OAAO;IACP,eAAe;IACf,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,cAAc;IACd,gBAAgB;IAChB,WAAW;IACX,SAAS;IACT,WAAW;IACX,QAAQ;IACR,UAAU;IACV,OAAO;CACV,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACtD,MAAM;IACN,YAAY;IACZ,iBAAiB;IACjB,OAAO;IACP,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,cAAc;IACd,kBAAkB;CACrB,CAAC;AAEF,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IACjD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EACpC,OAAO,CACV,CAAC;QACF,OAAO,OAAO;aACT,KAAK,CAAC,OAAO,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACL,6BAA6B;QAC7B,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,WAAmB;IAEnB,MAAM,EAAE,GAAY,CAAE,MAAc,CAAC,OAAO,IAAI,MAAM,CAAS,EAAE,CAAC;IAElE,mBAAmB;IACnB,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3B,CAAC;IAED,YAAY;IACZ,EAAE,CAAC,GAAG,CAAC,uBAAmC,CAAC,CAAC;IAE5C,YAAY;IACZ,EAAE,CAAC,GAAG,CAAC,uBAAmC,CAAC,CAAC;IAE5C,OAAO,CAAC,YAAoB,EAAW,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @module scanner
3
+ * 文件扫描器统一导出
4
+ */
5
+ export { DEFAULT_IGNORE_PATTERNS, SENSITIVE_FILE_PATTERNS, createIgnoreFilter, } from './ignore-rules.js';
6
+ export { type ScannerConfig, scanDirectory, } from './file-scanner.js';
7
+ export { buildTreeString, } from './tree-builder.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACH,KAAK,aAAa,EAClB,aAAa,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACH,eAAe,GAClB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @module scanner
3
+ * 文件扫描器统一导出
4
+ */
5
+ export { DEFAULT_IGNORE_PATTERNS, SENSITIVE_FILE_PATTERNS, createIgnoreFilter, } from './ignore-rules.js';
6
+ export { scanDirectory, } from './file-scanner.js';
7
+ export { buildTreeString, } from './tree-builder.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEH,aAAa,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACH,eAAe,GAClB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { FileNode } from '../models/file-reference.js';
2
+ /**
3
+ * 将扁平的 {@link FileNode} 列表渲染为可读的树形文本,类似 `tree` 命令输出。
4
+ *
5
+ * 使用 Unicode box-drawing 字符绘制分支 (├──, └──, │)。
6
+ * 输出末尾附带文件数 / 目录数汇总。
7
+ *
8
+ * @param files - 扁平的 FileNode 列表 (由 `scanDirectory` 返回)
9
+ * @param rootPath - 项目根目录的绝对路径
10
+ * @returns 多行字符串形式的目录树
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const files = await scanDirectory('/project');
15
+ * const tree = buildTreeString(files, '/project');
16
+ * console.log(tree);
17
+ * ```
18
+ */
19
+ export declare function buildTreeString(files: FileNode[], rootPath: string): string;
20
+ //# sourceMappingURL=tree-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-builder.d.ts","sourceRoot":"","sources":["../../src/scanner/tree-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAuH5D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiB3E"}
@@ -0,0 +1,118 @@
1
+ import path from 'node:path';
2
+ // ---------------------------------------------------------------------------
3
+ // 辅助函数
4
+ // ---------------------------------------------------------------------------
5
+ /**
6
+ * 将扁平文件列表构建为嵌套树结构。
7
+ */
8
+ function buildTree(files, rootPath) {
9
+ const root = {
10
+ name: path.basename(rootPath),
11
+ isDir: true,
12
+ children: new Map(),
13
+ };
14
+ for (const file of files) {
15
+ const segments = file.relativePath.split('/');
16
+ let current = root;
17
+ for (let i = 0; i < segments.length; i++) {
18
+ const seg = segments[i];
19
+ const isLast = i === segments.length - 1;
20
+ if (!current.children.has(seg)) {
21
+ current.children.set(seg, {
22
+ name: seg,
23
+ isDir: !isLast,
24
+ children: new Map(),
25
+ });
26
+ }
27
+ current = current.children.get(seg);
28
+ }
29
+ }
30
+ return root;
31
+ }
32
+ /**
33
+ * 统计树中所有叶子文件数量。
34
+ */
35
+ function countFiles(node) {
36
+ if (!node.isDir || node.children.size === 0) {
37
+ return node.isDir ? 0 : 1;
38
+ }
39
+ let count = 0;
40
+ for (const child of node.children.values()) {
41
+ count += countFiles(child);
42
+ }
43
+ return count;
44
+ }
45
+ /**
46
+ * 统计树中所有目录数量 (不含根节点自身)。
47
+ */
48
+ function countDirectories(node) {
49
+ let count = 0;
50
+ for (const child of node.children.values()) {
51
+ if (child.isDir) {
52
+ count += 1 + countDirectories(child);
53
+ }
54
+ }
55
+ return count;
56
+ }
57
+ /**
58
+ * 递归渲染树字符串。
59
+ *
60
+ * @param node - 当前节点
61
+ * @param prefix - 当前行前缀 (用于缩进)
62
+ * @param lines - 输出行收集器
63
+ */
64
+ function renderNode(node, prefix, lines) {
65
+ // 对子节点排序: 目录在前,同类按名称排序
66
+ const sorted = [...node.children.entries()].sort(([, a], [, b]) => {
67
+ if (a.isDir !== b.isDir) {
68
+ return a.isDir ? -1 : 1;
69
+ }
70
+ return a.name.localeCompare(b.name);
71
+ });
72
+ for (let i = 0; i < sorted.length; i++) {
73
+ const [, child] = sorted[i];
74
+ const isLast = i === sorted.length - 1;
75
+ const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';
76
+ const childPrefix = isLast ? ' ' : '\u2502 ';
77
+ const displayName = child.isDir ? `${child.name}/` : child.name;
78
+ lines.push(`${prefix}${connector}${displayName}`);
79
+ if (child.isDir && child.children.size > 0) {
80
+ renderNode(child, prefix + childPrefix, lines);
81
+ }
82
+ }
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // 核心 API
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * 将扁平的 {@link FileNode} 列表渲染为可读的树形文本,类似 `tree` 命令输出。
89
+ *
90
+ * 使用 Unicode box-drawing 字符绘制分支 (├──, └──, │)。
91
+ * 输出末尾附带文件数 / 目录数汇总。
92
+ *
93
+ * @param files - 扁平的 FileNode 列表 (由 `scanDirectory` 返回)
94
+ * @param rootPath - 项目根目录的绝对路径
95
+ * @returns 多行字符串形式的目录树
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * const files = await scanDirectory('/project');
100
+ * const tree = buildTreeString(files, '/project');
101
+ * console.log(tree);
102
+ * ```
103
+ */
104
+ export function buildTreeString(files, rootPath) {
105
+ if (files.length === 0) {
106
+ const rootName = path.basename(rootPath);
107
+ return `${rootName}/\n\n0 directories, 0 files`;
108
+ }
109
+ const root = buildTree(files, rootPath);
110
+ const lines = [`${root.name}/`];
111
+ renderNode(root, '', lines);
112
+ const dirCount = countDirectories(root);
113
+ const fileCount = countFiles(root);
114
+ lines.push('');
115
+ lines.push(`${dirCount} directories, ${fileCount} files`);
116
+ return lines.join('\n');
117
+ }
118
+ //# sourceMappingURL=tree-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-builder.js","sourceRoot":"","sources":["../../src/scanner/tree-builder.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "repowiki-core",
3
+ "version": "0.1.0",
4
+ "description": "RepoWiki 核心分析引擎",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "zod": "^3.23.0",
16
+ "fast-glob": "^3.3.0",
17
+ "ignore": "^5.3.0",
18
+ "handlebars": "^4.7.8",
19
+ "dotenv": "^16.4.0"
20
+ },
21
+ "devDependencies": {
22
+ "typescript": "^5.5.0",
23
+ "vitest": "^2.0.0",
24
+ "rimraf": "^5.0.0",
25
+ "@types/node": "^20.0.0"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "dev": "tsc --watch",
30
+ "typecheck": "tsc --noEmit",
31
+ "clean": "rimraf dist",
32
+ "test": "vitest run"
33
+ }
34
+ }