codexia 0.2.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 (224) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/LICENSE +663 -0
  3. package/README.md +392 -0
  4. package/dist/adapters/github/index.d.ts +66 -0
  5. package/dist/adapters/github/index.d.ts.map +1 -0
  6. package/dist/adapters/github/index.js +84 -0
  7. package/dist/adapters/github/index.js.map +1 -0
  8. package/dist/adapters/index.d.ts +5 -0
  9. package/dist/adapters/index.d.ts.map +1 -0
  10. package/dist/adapters/index.js +5 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/cli/commands/changelog.d.ts +3 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +221 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/check.d.ts +3 -0
  17. package/dist/cli/commands/check.d.ts.map +1 -0
  18. package/dist/cli/commands/check.js +35 -0
  19. package/dist/cli/commands/check.js.map +1 -0
  20. package/dist/cli/commands/complexity.d.ts +3 -0
  21. package/dist/cli/commands/complexity.d.ts.map +1 -0
  22. package/dist/cli/commands/complexity.js +103 -0
  23. package/dist/cli/commands/complexity.js.map +1 -0
  24. package/dist/cli/commands/graph.d.ts +3 -0
  25. package/dist/cli/commands/graph.d.ts.map +1 -0
  26. package/dist/cli/commands/graph.js +46 -0
  27. package/dist/cli/commands/graph.js.map +1 -0
  28. package/dist/cli/commands/history.d.ts +3 -0
  29. package/dist/cli/commands/history.d.ts.map +1 -0
  30. package/dist/cli/commands/history.js +127 -0
  31. package/dist/cli/commands/history.js.map +1 -0
  32. package/dist/cli/commands/hotpaths.d.ts +3 -0
  33. package/dist/cli/commands/hotpaths.d.ts.map +1 -0
  34. package/dist/cli/commands/hotpaths.js +153 -0
  35. package/dist/cli/commands/hotpaths.js.map +1 -0
  36. package/dist/cli/commands/impact.d.ts +3 -0
  37. package/dist/cli/commands/impact.d.ts.map +1 -0
  38. package/dist/cli/commands/impact.js +37 -0
  39. package/dist/cli/commands/impact.js.map +1 -0
  40. package/dist/cli/commands/init.d.ts +3 -0
  41. package/dist/cli/commands/init.d.ts.map +1 -0
  42. package/dist/cli/commands/init.js +167 -0
  43. package/dist/cli/commands/init.js.map +1 -0
  44. package/dist/cli/commands/invariants.d.ts +3 -0
  45. package/dist/cli/commands/invariants.d.ts.map +1 -0
  46. package/dist/cli/commands/invariants.js +176 -0
  47. package/dist/cli/commands/invariants.js.map +1 -0
  48. package/dist/cli/commands/mcp-server.d.ts +3 -0
  49. package/dist/cli/commands/mcp-server.d.ts.map +1 -0
  50. package/dist/cli/commands/mcp-server.js +64 -0
  51. package/dist/cli/commands/mcp-server.js.map +1 -0
  52. package/dist/cli/commands/monorepo.d.ts +3 -0
  53. package/dist/cli/commands/monorepo.d.ts.map +1 -0
  54. package/dist/cli/commands/monorepo.js +156 -0
  55. package/dist/cli/commands/monorepo.js.map +1 -0
  56. package/dist/cli/commands/pr-report.d.ts +3 -0
  57. package/dist/cli/commands/pr-report.d.ts.map +1 -0
  58. package/dist/cli/commands/pr-report.js +32 -0
  59. package/dist/cli/commands/pr-report.js.map +1 -0
  60. package/dist/cli/commands/scan.d.ts +3 -0
  61. package/dist/cli/commands/scan.d.ts.map +1 -0
  62. package/dist/cli/commands/scan.js +25 -0
  63. package/dist/cli/commands/scan.js.map +1 -0
  64. package/dist/cli/commands/signals.d.ts +3 -0
  65. package/dist/cli/commands/signals.d.ts.map +1 -0
  66. package/dist/cli/commands/signals.js +34 -0
  67. package/dist/cli/commands/signals.js.map +1 -0
  68. package/dist/cli/commands/tests.d.ts +3 -0
  69. package/dist/cli/commands/tests.d.ts.map +1 -0
  70. package/dist/cli/commands/tests.js +30 -0
  71. package/dist/cli/commands/tests.js.map +1 -0
  72. package/dist/cli/commands/watch.d.ts +3 -0
  73. package/dist/cli/commands/watch.d.ts.map +1 -0
  74. package/dist/cli/commands/watch.js +131 -0
  75. package/dist/cli/commands/watch.js.map +1 -0
  76. package/dist/cli/engine.d.ts +162 -0
  77. package/dist/cli/engine.d.ts.map +1 -0
  78. package/dist/cli/engine.js +564 -0
  79. package/dist/cli/engine.js.map +1 -0
  80. package/dist/cli/formatter.d.ts +39 -0
  81. package/dist/cli/formatter.d.ts.map +1 -0
  82. package/dist/cli/formatter.js +444 -0
  83. package/dist/cli/formatter.js.map +1 -0
  84. package/dist/cli/index.d.ts +2 -0
  85. package/dist/cli/index.d.ts.map +1 -0
  86. package/dist/cli/index.js +63 -0
  87. package/dist/cli/index.js.map +1 -0
  88. package/dist/cli/interactive.d.ts +7 -0
  89. package/dist/cli/interactive.d.ts.map +1 -0
  90. package/dist/cli/interactive.js +644 -0
  91. package/dist/cli/interactive.js.map +1 -0
  92. package/dist/core/dependency-graph.d.ts +54 -0
  93. package/dist/core/dependency-graph.d.ts.map +1 -0
  94. package/dist/core/dependency-graph.js +190 -0
  95. package/dist/core/dependency-graph.js.map +1 -0
  96. package/dist/core/dependency-graph.test.d.ts +2 -0
  97. package/dist/core/dependency-graph.test.d.ts.map +1 -0
  98. package/dist/core/dependency-graph.test.js +106 -0
  99. package/dist/core/dependency-graph.test.js.map +1 -0
  100. package/dist/core/git-analyzer.d.ts +52 -0
  101. package/dist/core/git-analyzer.d.ts.map +1 -0
  102. package/dist/core/git-analyzer.js +250 -0
  103. package/dist/core/git-analyzer.js.map +1 -0
  104. package/dist/core/git-analyzer.test.d.ts +2 -0
  105. package/dist/core/git-analyzer.test.d.ts.map +1 -0
  106. package/dist/core/git-analyzer.test.js +71 -0
  107. package/dist/core/git-analyzer.test.js.map +1 -0
  108. package/dist/core/index.d.ts +7 -0
  109. package/dist/core/index.d.ts.map +1 -0
  110. package/dist/core/index.js +7 -0
  111. package/dist/core/index.js.map +1 -0
  112. package/dist/core/repo-indexer.d.ts +57 -0
  113. package/dist/core/repo-indexer.d.ts.map +1 -0
  114. package/dist/core/repo-indexer.js +356 -0
  115. package/dist/core/repo-indexer.js.map +1 -0
  116. package/dist/core/repo-indexer.test.d.ts +2 -0
  117. package/dist/core/repo-indexer.test.d.ts.map +1 -0
  118. package/dist/core/repo-indexer.test.js +89 -0
  119. package/dist/core/repo-indexer.test.js.map +1 -0
  120. package/dist/core/signals-engine.d.ts +38 -0
  121. package/dist/core/signals-engine.d.ts.map +1 -0
  122. package/dist/core/signals-engine.js +142 -0
  123. package/dist/core/signals-engine.js.map +1 -0
  124. package/dist/core/signals-engine.test.d.ts +2 -0
  125. package/dist/core/signals-engine.test.d.ts.map +1 -0
  126. package/dist/core/signals-engine.test.js +129 -0
  127. package/dist/core/signals-engine.test.js.map +1 -0
  128. package/dist/core/symbol-map.d.ts +45 -0
  129. package/dist/core/symbol-map.d.ts.map +1 -0
  130. package/dist/core/symbol-map.js +187 -0
  131. package/dist/core/symbol-map.js.map +1 -0
  132. package/dist/core/types.d.ts +514 -0
  133. package/dist/core/types.d.ts.map +1 -0
  134. package/dist/core/types.js +5 -0
  135. package/dist/core/types.js.map +1 -0
  136. package/dist/core/types.test.d.ts +2 -0
  137. package/dist/core/types.test.d.ts.map +1 -0
  138. package/dist/core/types.test.js +20 -0
  139. package/dist/core/types.test.js.map +1 -0
  140. package/dist/index.d.ts +5 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +9 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/mcp/index.d.ts +3 -0
  145. package/dist/mcp/index.d.ts.map +1 -0
  146. package/dist/mcp/index.js +2 -0
  147. package/dist/mcp/index.js.map +1 -0
  148. package/dist/mcp/server.d.ts +89 -0
  149. package/dist/mcp/server.d.ts.map +1 -0
  150. package/dist/mcp/server.js +549 -0
  151. package/dist/mcp/server.js.map +1 -0
  152. package/dist/modules/changelog-generator.d.ts +82 -0
  153. package/dist/modules/changelog-generator.d.ts.map +1 -0
  154. package/dist/modules/changelog-generator.js +350 -0
  155. package/dist/modules/changelog-generator.js.map +1 -0
  156. package/dist/modules/complexity-engine.d.ts +86 -0
  157. package/dist/modules/complexity-engine.d.ts.map +1 -0
  158. package/dist/modules/complexity-engine.js +355 -0
  159. package/dist/modules/complexity-engine.js.map +1 -0
  160. package/dist/modules/convention-checker.d.ts +24 -0
  161. package/dist/modules/convention-checker.d.ts.map +1 -0
  162. package/dist/modules/convention-checker.js +181 -0
  163. package/dist/modules/convention-checker.js.map +1 -0
  164. package/dist/modules/graph-utils.d.ts +38 -0
  165. package/dist/modules/graph-utils.d.ts.map +1 -0
  166. package/dist/modules/graph-utils.js +40 -0
  167. package/dist/modules/graph-utils.js.map +1 -0
  168. package/dist/modules/hot-path-detector.d.ts +105 -0
  169. package/dist/modules/hot-path-detector.d.ts.map +1 -0
  170. package/dist/modules/hot-path-detector.js +332 -0
  171. package/dist/modules/hot-path-detector.js.map +1 -0
  172. package/dist/modules/impact-analyzer.d.ts +40 -0
  173. package/dist/modules/impact-analyzer.d.ts.map +1 -0
  174. package/dist/modules/impact-analyzer.js +218 -0
  175. package/dist/modules/impact-analyzer.js.map +1 -0
  176. package/dist/modules/impact-analyzer.test.d.ts +2 -0
  177. package/dist/modules/impact-analyzer.test.d.ts.map +1 -0
  178. package/dist/modules/impact-analyzer.test.js +308 -0
  179. package/dist/modules/impact-analyzer.test.js.map +1 -0
  180. package/dist/modules/index.d.ts +14 -0
  181. package/dist/modules/index.d.ts.map +1 -0
  182. package/dist/modules/index.js +20 -0
  183. package/dist/modules/index.js.map +1 -0
  184. package/dist/modules/invariant-engine.d.ts +119 -0
  185. package/dist/modules/invariant-engine.d.ts.map +1 -0
  186. package/dist/modules/invariant-engine.js +457 -0
  187. package/dist/modules/invariant-engine.js.map +1 -0
  188. package/dist/modules/memory-loader.d.ts +34 -0
  189. package/dist/modules/memory-loader.d.ts.map +1 -0
  190. package/dist/modules/memory-loader.js +313 -0
  191. package/dist/modules/memory-loader.js.map +1 -0
  192. package/dist/modules/memory-loader.test.d.ts +2 -0
  193. package/dist/modules/memory-loader.test.d.ts.map +1 -0
  194. package/dist/modules/memory-loader.test.js +120 -0
  195. package/dist/modules/memory-loader.test.js.map +1 -0
  196. package/dist/modules/monorepo-analyzer.d.ts +141 -0
  197. package/dist/modules/monorepo-analyzer.d.ts.map +1 -0
  198. package/dist/modules/monorepo-analyzer.js +453 -0
  199. package/dist/modules/monorepo-analyzer.js.map +1 -0
  200. package/dist/modules/plugin-system.d.ts +144 -0
  201. package/dist/modules/plugin-system.d.ts.map +1 -0
  202. package/dist/modules/plugin-system.js +428 -0
  203. package/dist/modules/plugin-system.js.map +1 -0
  204. package/dist/modules/smart-test-prioritizer.d.ts +95 -0
  205. package/dist/modules/smart-test-prioritizer.d.ts.map +1 -0
  206. package/dist/modules/smart-test-prioritizer.js +328 -0
  207. package/dist/modules/smart-test-prioritizer.js.map +1 -0
  208. package/dist/modules/temporal-analyzer.d.ts +71 -0
  209. package/dist/modules/temporal-analyzer.d.ts.map +1 -0
  210. package/dist/modules/temporal-analyzer.js +301 -0
  211. package/dist/modules/temporal-analyzer.js.map +1 -0
  212. package/dist/modules/test-suggester.d.ts +22 -0
  213. package/dist/modules/test-suggester.d.ts.map +1 -0
  214. package/dist/modules/test-suggester.js +145 -0
  215. package/dist/modules/test-suggester.js.map +1 -0
  216. package/dist/modules/visualizer.d.ts +49 -0
  217. package/dist/modules/visualizer.d.ts.map +1 -0
  218. package/dist/modules/visualizer.js +302 -0
  219. package/dist/modules/visualizer.js.map +1 -0
  220. package/dist/modules/watcher.d.ts +82 -0
  221. package/dist/modules/watcher.d.ts.map +1 -0
  222. package/dist/modules/watcher.js +298 -0
  223. package/dist/modules/watcher.js.map +1 -0
  224. package/package.json +70 -0
@@ -0,0 +1,356 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { glob } from 'glob';
4
+ const CACHE_VERSION = '1.0.0';
5
+ const CACHE_DIR = '.codexia';
6
+ const CACHE_FILE = 'index-cache.json';
7
+ const CACHE_STALENESS_MS = parseInt(process.env.CODEXIA_CACHE_STALENESS_MS || '3600000', 10); // Default: 1 hour
8
+ export class RepoIndexer {
9
+ repoRoot;
10
+ files = new Map();
11
+ indexed = false;
12
+ constructor(repoRoot) {
13
+ this.repoRoot = repoRoot;
14
+ }
15
+ /**
16
+ * Index the repository (with optional caching)
17
+ */
18
+ async index(options = {}) {
19
+ const { useCache = true } = options;
20
+ if (useCache) {
21
+ const cached = await this.loadCache();
22
+ if (cached) {
23
+ // Extract FileInfo from CachedFileInfo
24
+ const filesMap = new Map();
25
+ for (const [key, cachedFile] of Object.entries(cached.files)) {
26
+ filesMap.set(key, cachedFile.info);
27
+ }
28
+ this.files = filesMap;
29
+ this.indexed = true;
30
+ return;
31
+ }
32
+ }
33
+ await this.performIndex();
34
+ if (useCache) {
35
+ await this.saveCache();
36
+ }
37
+ }
38
+ /**
39
+ * Force re-index without using cache
40
+ */
41
+ async reindex() {
42
+ await this.performIndex();
43
+ await this.saveCache();
44
+ }
45
+ /**
46
+ * Clear the index cache
47
+ */
48
+ async clearCache() {
49
+ const cachePath = path.join(this.repoRoot, CACHE_DIR, CACHE_FILE);
50
+ try {
51
+ await fs.unlink(cachePath);
52
+ }
53
+ catch {
54
+ // Cache file doesn't exist, nothing to clear
55
+ }
56
+ }
57
+ async performIndex() {
58
+ this.files.clear();
59
+ const patterns = [
60
+ '**/*.ts',
61
+ '**/*.tsx',
62
+ '**/*.js',
63
+ '**/*.jsx',
64
+ '**/*.mjs',
65
+ '**/*.cjs',
66
+ ];
67
+ const ignorePatterns = [
68
+ '**/node_modules/**',
69
+ '**/dist/**',
70
+ '**/build/**',
71
+ '**/.git/**',
72
+ '**/coverage/**',
73
+ ];
74
+ const filePaths = await glob(patterns, {
75
+ cwd: this.repoRoot,
76
+ ignore: ignorePatterns,
77
+ absolute: false,
78
+ });
79
+ for (const relativePath of filePaths) {
80
+ const absolutePath = path.join(this.repoRoot, relativePath);
81
+ try {
82
+ const content = await fs.readFile(absolutePath, 'utf-8');
83
+ const fileInfo = this.analyzeFile(relativePath, content);
84
+ this.files.set(relativePath, fileInfo);
85
+ }
86
+ catch {
87
+ // Skip files that can't be read
88
+ }
89
+ }
90
+ this.indexed = true;
91
+ }
92
+ /**
93
+ * Load index from cache file
94
+ */
95
+ async loadCache() {
96
+ const cachePath = path.join(this.repoRoot, CACHE_DIR, CACHE_FILE);
97
+ try {
98
+ const content = await fs.readFile(cachePath, 'utf-8');
99
+ const cache = JSON.parse(content);
100
+ // Validate cache version
101
+ if (cache.metadata.version !== CACHE_VERSION) {
102
+ return null;
103
+ }
104
+ // Check if cache is stale (default: 1 hour, configurable via CODEXIA_CACHE_STALENESS_MS)
105
+ if (Date.now() - cache.metadata.timestamp > CACHE_STALENESS_MS) {
106
+ return null;
107
+ }
108
+ // Validate that cached files still exist and haven't been modified
109
+ for (const [relativePath, cachedFile] of Object.entries(cache.files)) {
110
+ const absolutePath = path.join(this.repoRoot, relativePath);
111
+ try {
112
+ const stats = await fs.stat(absolutePath);
113
+ // If file has been modified since caching, invalidate entire cache
114
+ if (stats.mtimeMs > cachedFile.mtime) {
115
+ return null;
116
+ }
117
+ }
118
+ catch {
119
+ // File no longer exists, invalidate cache
120
+ return null;
121
+ }
122
+ }
123
+ return cache;
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ /**
130
+ * Save index to cache file (only if .codexia directory exists)
131
+ */
132
+ async saveCache() {
133
+ const cacheDir = path.join(this.repoRoot, CACHE_DIR);
134
+ const cachePath = path.join(cacheDir, CACHE_FILE);
135
+ try {
136
+ // Only save cache if .codexia directory already exists
137
+ // (i.e., user has run `codexia init`)
138
+ await fs.access(cacheDir);
139
+ }
140
+ catch {
141
+ // .codexia directory doesn't exist, skip caching
142
+ return;
143
+ }
144
+ try {
145
+ const filesObj = {};
146
+ for (const [key, value] of this.files) {
147
+ const absolutePath = path.join(this.repoRoot, key);
148
+ try {
149
+ const stats = await fs.stat(absolutePath);
150
+ filesObj[key] = {
151
+ info: value,
152
+ mtime: stats.mtimeMs,
153
+ };
154
+ }
155
+ catch {
156
+ // Skip files that can't be accessed
157
+ }
158
+ }
159
+ const cache = {
160
+ metadata: {
161
+ version: CACHE_VERSION,
162
+ timestamp: Date.now(),
163
+ fileCount: this.files.size,
164
+ },
165
+ files: filesObj,
166
+ };
167
+ await fs.writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
168
+ }
169
+ catch {
170
+ // Silently fail if we can't write cache
171
+ }
172
+ }
173
+ /**
174
+ * Get all indexed files
175
+ */
176
+ getFiles() {
177
+ return this.files;
178
+ }
179
+ /**
180
+ * Get file info by path
181
+ */
182
+ getFile(filePath) {
183
+ return this.files.get(filePath);
184
+ }
185
+ /**
186
+ * Check if repository has been indexed
187
+ */
188
+ isIndexed() {
189
+ return this.indexed;
190
+ }
191
+ /**
192
+ * Get statistics about the indexed repository
193
+ */
194
+ getStats() {
195
+ let totalSymbols = 0;
196
+ let totalExports = 0;
197
+ let totalImports = 0;
198
+ for (const file of this.files.values()) {
199
+ totalSymbols += file.symbols.length;
200
+ totalExports += file.exports.length;
201
+ totalImports += file.imports.length;
202
+ }
203
+ const avgFanOut = this.files.size > 0 ? totalImports / this.files.size : 0;
204
+ return {
205
+ files: this.files.size,
206
+ symbols: totalSymbols,
207
+ exports: totalExports,
208
+ avgFanOut: Math.round(avgFanOut * 10) / 10,
209
+ };
210
+ }
211
+ analyzeFile(relativePath, content) {
212
+ const lines = content.split('\n');
213
+ const language = this.getLanguage(relativePath);
214
+ const imports = this.extractImports(content);
215
+ const exports = this.extractExports(content);
216
+ const symbols = this.extractSymbols(content, relativePath);
217
+ return {
218
+ path: path.join(this.repoRoot, relativePath),
219
+ relativePath,
220
+ language,
221
+ size: content.length,
222
+ lines: lines.length,
223
+ symbols,
224
+ imports,
225
+ exports,
226
+ };
227
+ }
228
+ getLanguage(filePath) {
229
+ const ext = path.extname(filePath);
230
+ const langMap = {
231
+ '.ts': 'typescript',
232
+ '.tsx': 'typescript',
233
+ '.js': 'javascript',
234
+ '.jsx': 'javascript',
235
+ '.mjs': 'javascript',
236
+ '.cjs': 'javascript',
237
+ };
238
+ return langMap[ext] || 'unknown';
239
+ }
240
+ extractImports(content) {
241
+ const imports = [];
242
+ const lines = content.split('\n');
243
+ const importRegex = /^import\s+(?:(?:(\{[^}]+\})|(\*\s+as\s+\w+)|(\w+))(?:\s*,\s*)?)*\s*from\s*['"]([^'"]+)['"]/;
244
+ const defaultImportRegex = /^import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/;
245
+ lines.forEach((line, index) => {
246
+ const trimmed = line.trim();
247
+ const match = trimmed.match(importRegex);
248
+ if (match) {
249
+ const specifiers = [];
250
+ let isDefault = false;
251
+ let isNamespace = false;
252
+ if (match[1]) {
253
+ // Named imports: { a, b, c }
254
+ const named = match[1].replace(/[{}]/g, '').split(',').map(s => s.trim());
255
+ specifiers.push(...named);
256
+ }
257
+ if (match[2]) {
258
+ // Namespace import: * as name
259
+ isNamespace = true;
260
+ specifiers.push(match[2].replace('* as ', '').trim());
261
+ }
262
+ if (match[3]) {
263
+ // Default import
264
+ isDefault = true;
265
+ specifiers.push(match[3]);
266
+ }
267
+ imports.push({
268
+ source: match[4],
269
+ specifiers,
270
+ isDefault,
271
+ isNamespace,
272
+ line: index + 1,
273
+ });
274
+ return;
275
+ }
276
+ const defaultMatch = trimmed.match(defaultImportRegex);
277
+ if (defaultMatch) {
278
+ imports.push({
279
+ source: defaultMatch[2],
280
+ specifiers: [defaultMatch[1]],
281
+ isDefault: true,
282
+ isNamespace: false,
283
+ line: index + 1,
284
+ });
285
+ }
286
+ });
287
+ return imports;
288
+ }
289
+ extractExports(content) {
290
+ const exports = [];
291
+ const lines = content.split('\n');
292
+ const patterns = [
293
+ { regex: /^export\s+default\s+class\s+(\w+)/, kind: 'class', isDefault: true },
294
+ { regex: /^export\s+default\s+function\s+(\w+)/, kind: 'function', isDefault: true },
295
+ { regex: /^export\s+class\s+(\w+)/, kind: 'class', isDefault: false },
296
+ { regex: /^export\s+interface\s+(\w+)/, kind: 'interface', isDefault: false },
297
+ { regex: /^export\s+type\s+(\w+)/, kind: 'type', isDefault: false },
298
+ { regex: /^export\s+function\s+(\w+)/, kind: 'function', isDefault: false },
299
+ { regex: /^export\s+const\s+(\w+)/, kind: 'variable', isDefault: false },
300
+ { regex: /^export\s+let\s+(\w+)/, kind: 'variable', isDefault: false },
301
+ { regex: /^export\s+enum\s+(\w+)/, kind: 'enum', isDefault: false },
302
+ ];
303
+ lines.forEach((line, index) => {
304
+ const trimmed = line.trim();
305
+ for (const { regex, kind, isDefault } of patterns) {
306
+ const match = trimmed.match(regex);
307
+ if (match) {
308
+ exports.push({
309
+ name: match[1],
310
+ kind,
311
+ isDefault,
312
+ line: index + 1,
313
+ });
314
+ break;
315
+ }
316
+ }
317
+ });
318
+ return exports;
319
+ }
320
+ extractSymbols(content, filePath) {
321
+ const symbols = [];
322
+ const lines = content.split('\n');
323
+ const patterns = [
324
+ { regex: /^(?:export\s+)?class\s+(\w+)/, kind: 'class' },
325
+ { regex: /^(?:export\s+)?interface\s+(\w+)/, kind: 'interface' },
326
+ { regex: /^(?:export\s+)?type\s+(\w+)\s*=/, kind: 'type' },
327
+ { regex: /^(?:export\s+)?function\s+(\w+)/, kind: 'function' },
328
+ { regex: /^(?:export\s+)?const\s+(\w+)\s*=\s*(?:async\s+)?(?:\([^)]*\)|[^=])*=>/, kind: 'function' },
329
+ { regex: /^(?:export\s+)?const\s+(\w+)/, kind: 'variable' },
330
+ { regex: /^(?:export\s+)?let\s+(\w+)/, kind: 'variable' },
331
+ { regex: /^(?:export\s+)?enum\s+(\w+)/, kind: 'enum' },
332
+ { regex: /^\s+(?:public\s+|private\s+|protected\s+)?(?:static\s+)?(?:async\s+)?(\w+)\s*\([^)]*\)\s*(?::\s*[^{]+)?\s*\{/, kind: 'method' },
333
+ ];
334
+ lines.forEach((line, index) => {
335
+ const trimmed = line.trim();
336
+ for (const { regex, kind } of patterns) {
337
+ const match = trimmed.match(regex);
338
+ if (match && match[1] && !match[1].startsWith('_')) {
339
+ const isExported = trimmed.startsWith('export');
340
+ symbols.push({
341
+ name: match[1],
342
+ kind,
343
+ filePath,
344
+ line: index + 1,
345
+ column: line.indexOf(match[1]) + 1,
346
+ exported: isExported,
347
+ references: [],
348
+ });
349
+ break;
350
+ }
351
+ }
352
+ });
353
+ return symbols;
354
+ }
355
+ }
356
+ //# sourceMappingURL=repo-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-indexer.js","sourceRoot":"","sources":["../../src/core/repo-indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repo-indexer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-indexer.test.d.ts","sourceRoot":"","sources":["../../src/core/repo-indexer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { RepoIndexer } from './repo-indexer.js';
3
+ describe('RepoIndexer', () => {
4
+ let indexer;
5
+ beforeEach(() => {
6
+ indexer = new RepoIndexer(process.cwd());
7
+ });
8
+ it('should create an indexer instance', () => {
9
+ expect(indexer).toBeDefined();
10
+ });
11
+ it('should not be indexed initially', () => {
12
+ expect(indexer.isIndexed()).toBe(false);
13
+ });
14
+ it('should index the repository', async () => {
15
+ await indexer.index();
16
+ expect(indexer.isIndexed()).toBe(true);
17
+ });
18
+ it('should find files after indexing', async () => {
19
+ await indexer.index();
20
+ const files = indexer.getFiles();
21
+ expect(files.size).toBeGreaterThan(0);
22
+ });
23
+ it('should return stats after indexing', async () => {
24
+ await indexer.index();
25
+ const stats = indexer.getStats();
26
+ expect(stats.files).toBeGreaterThan(0);
27
+ expect(stats.symbols).toBeGreaterThanOrEqual(0);
28
+ expect(stats.exports).toBeGreaterThanOrEqual(0);
29
+ expect(typeof stats.avgFanOut).toBe('number');
30
+ });
31
+ describe('caching', () => {
32
+ it('should index without cache when useCache is false', async () => {
33
+ await indexer.index({ useCache: false });
34
+ expect(indexer.isIndexed()).toBe(true);
35
+ const files = indexer.getFiles();
36
+ expect(files.size).toBeGreaterThan(0);
37
+ });
38
+ it('should reindex and clear cache', async () => {
39
+ // First index
40
+ await indexer.index();
41
+ const firstCount = indexer.getFiles().size;
42
+ // Clear cache
43
+ await indexer.clearCache();
44
+ // Reindex should work
45
+ await indexer.reindex();
46
+ const secondCount = indexer.getFiles().size;
47
+ expect(secondCount).toBe(firstCount);
48
+ });
49
+ it('should use cache on subsequent indexes if available', async () => {
50
+ // First index without cache
51
+ await indexer.index({ useCache: false });
52
+ // Create a new indexer instance
53
+ const indexer2 = new RepoIndexer(process.cwd());
54
+ // Second index should use cache if .codexia directory exists
55
+ await indexer2.index({ useCache: true });
56
+ const secondFiles = indexer2.getFiles();
57
+ // Should have same number of files (or close, accounting for file changes)
58
+ // We can't guarantee exact match due to potential file changes, but check it indexed
59
+ expect(secondFiles.size).toBeGreaterThan(0);
60
+ expect(indexer2.isIndexed()).toBe(true);
61
+ });
62
+ it('should validate cache version', async () => {
63
+ // Index once to create cache
64
+ await indexer.index({ useCache: true });
65
+ // Clear cache to force re-index with version check
66
+ await indexer.clearCache();
67
+ // New indexer should work even with no cache
68
+ const indexer2 = new RepoIndexer(process.cwd());
69
+ await indexer2.index({ useCache: true });
70
+ expect(indexer2.isIndexed()).toBe(true);
71
+ });
72
+ it('should handle cache staleness', async () => {
73
+ // This test verifies the staleness logic exists
74
+ // Actual staleness checking requires time manipulation or mocking
75
+ // which is complex, so we just verify the index works
76
+ await indexer.index({ useCache: true });
77
+ expect(indexer.isIndexed()).toBe(true);
78
+ });
79
+ it('should handle file modification time validation', async () => {
80
+ // This test verifies that file modification validation logic exists
81
+ // The actual validation happens during cache load
82
+ // We just verify that indexing works correctly
83
+ await indexer.index({ useCache: true });
84
+ const files = indexer.getFiles();
85
+ expect(files.size).toBeGreaterThan(0);
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=repo-indexer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-indexer.test.js","sourceRoot":"","sources":["../../src/core/repo-indexer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEjC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,cAAc;YACd,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;YAE3C,cAAc;YACd,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAE3B,sBAAsB;YACtB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;YAE5C,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,4BAA4B;YAC5B,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAEzC,gCAAgC;YAChC,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAEhD,6DAA6D;YAC7D,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAExC,2EAA2E;YAC3E,qFAAqF;YACrF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,6BAA6B;YAC7B,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAExC,mDAAmD;YACnD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAE3B,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAChD,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,gDAAgD;YAChD,kEAAkE;YAClE,sDAAsD;YACtD,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,oEAAoE;YACpE,kDAAkD;YAClD,+CAA+C;YAC/C,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Signal, FileHistory, Symbol } from './types.js';
2
+ export interface SignalConfig {
3
+ highChurnThreshold: number;
4
+ godClassThreshold: number;
5
+ maxComplexity: number;
6
+ }
7
+ export declare class SignalsEngine {
8
+ private config;
9
+ constructor(config?: Partial<SignalConfig>);
10
+ /**
11
+ * Analyze file history for high churn
12
+ */
13
+ detectHighChurn(history: FileHistory): Signal | null;
14
+ /**
15
+ * Detect god classes (large files with many symbols)
16
+ */
17
+ detectGodClass(filePath: string, lineCount: number, symbolCount: number): Signal | null;
18
+ /**
19
+ * Detect circular dependencies
20
+ */
21
+ detectCircularDependency(cycle: string[]): Signal;
22
+ /**
23
+ * Detect orphan code (exported but never imported)
24
+ */
25
+ detectOrphanCode(symbol: Symbol, importCount: number): Signal | null;
26
+ /**
27
+ * Detect missing tests
28
+ */
29
+ detectMissingTests(filePath: string, hasTests: boolean): Signal | null;
30
+ /**
31
+ * Analyze and return all signals for a codebase
32
+ */
33
+ analyzeAll(files: Map<string, {
34
+ lines: number;
35
+ symbols: Symbol[];
36
+ }>, _history: Map<string, FileHistory>, cycles: string[][]): Signal[];
37
+ }
38
+ //# sourceMappingURL=signals-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals-engine.d.ts","sourceRoot":"","sources":["../../src/core/signals-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAI9C;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAwBpD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwBvF;;OAEG;IACH,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAejD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoBpE;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAmBtE;;OAEG;IACH,UAAU,CACR,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EACxD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClC,MAAM,EAAE,MAAM,EAAE,EAAE,GACjB,MAAM,EAAE;CAsBZ"}
@@ -0,0 +1,142 @@
1
+ const DEFAULT_CONFIG = {
2
+ highChurnThreshold: 10, // commits in last 30 days
3
+ godClassThreshold: 500, // lines
4
+ maxComplexity: 20,
5
+ };
6
+ export class SignalsEngine {
7
+ config;
8
+ constructor(config = {}) {
9
+ this.config = { ...DEFAULT_CONFIG, ...config };
10
+ }
11
+ /**
12
+ * Analyze file history for high churn
13
+ */
14
+ detectHighChurn(history) {
15
+ if (history.changeFrequency > this.config.highChurnThreshold / 30) {
16
+ return {
17
+ type: 'high-churn',
18
+ severity: 'warning',
19
+ message: `File ${history.path} has high change frequency (${history.commits.length} commits)`,
20
+ filePath: history.path,
21
+ evidence: [
22
+ {
23
+ type: 'metric',
24
+ description: `${history.commits.length} commits by ${history.authors.length} authors`,
25
+ source: 'git log',
26
+ },
27
+ {
28
+ type: 'commit',
29
+ description: `Recent commits: ${history.commits.slice(0, 3).map(c => c.message).join(', ')}`,
30
+ source: 'git log',
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Detect god classes (large files with many symbols)
39
+ */
40
+ detectGodClass(filePath, lineCount, symbolCount) {
41
+ if (lineCount > this.config.godClassThreshold) {
42
+ return {
43
+ type: 'god-class',
44
+ severity: 'warning',
45
+ message: `File ${filePath} is very large (${lineCount} lines, ${symbolCount} symbols)`,
46
+ filePath,
47
+ evidence: [
48
+ {
49
+ type: 'metric',
50
+ description: `${lineCount} lines of code`,
51
+ source: 'static analysis',
52
+ },
53
+ {
54
+ type: 'metric',
55
+ description: `${symbolCount} symbols defined`,
56
+ source: 'static analysis',
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Detect circular dependencies
65
+ */
66
+ detectCircularDependency(cycle) {
67
+ return {
68
+ type: 'circular-dependency',
69
+ severity: 'error',
70
+ message: `Circular dependency detected: ${cycle.join(' → ')}`,
71
+ evidence: [
72
+ {
73
+ type: 'code',
74
+ description: `Import cycle: ${cycle.join(' → ')}`,
75
+ source: 'dependency analysis',
76
+ },
77
+ ],
78
+ };
79
+ }
80
+ /**
81
+ * Detect orphan code (exported but never imported)
82
+ */
83
+ detectOrphanCode(symbol, importCount) {
84
+ if (symbol.exported && importCount === 0) {
85
+ return {
86
+ type: 'orphan-code',
87
+ severity: 'info',
88
+ message: `Exported symbol '${symbol.name}' is never imported`,
89
+ filePath: symbol.filePath,
90
+ line: symbol.line,
91
+ evidence: [
92
+ {
93
+ type: 'code',
94
+ description: `${symbol.kind} '${symbol.name}' is exported but has no importers`,
95
+ source: 'dependency analysis',
96
+ },
97
+ ],
98
+ };
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Detect missing tests
104
+ */
105
+ detectMissingTests(filePath, hasTests) {
106
+ if (!hasTests && !filePath.includes('.test.') && !filePath.includes('.spec.')) {
107
+ return {
108
+ type: 'missing-tests',
109
+ severity: 'info',
110
+ message: `File ${filePath} has no associated test file`,
111
+ filePath,
112
+ evidence: [
113
+ {
114
+ type: 'code',
115
+ description: 'No test file found matching common patterns (.test.ts, .spec.ts)',
116
+ source: 'file analysis',
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ return null;
122
+ }
123
+ /**
124
+ * Analyze and return all signals for a codebase
125
+ */
126
+ analyzeAll(files, _history, cycles) {
127
+ const signals = [];
128
+ // Check for god classes
129
+ for (const [filePath, fileInfo] of files) {
130
+ const godClassSignal = this.detectGodClass(filePath, fileInfo.lines, fileInfo.symbols.length);
131
+ if (godClassSignal) {
132
+ signals.push(godClassSignal);
133
+ }
134
+ }
135
+ // Check for circular dependencies
136
+ for (const cycle of cycles) {
137
+ signals.push(this.detectCircularDependency(cycle));
138
+ }
139
+ return signals;
140
+ }
141
+ }
142
+ //# sourceMappingURL=signals-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals-engine.js","sourceRoot":"","sources":["../../src/core/signals-engine.ts"],"names":[],"mappings":"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"}