@defai.digital/ax-cli 3.7.2 → 3.8.1

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 (213) hide show
  1. package/README.md +128 -56
  2. package/dist/agent/context-manager.d.ts +15 -1
  3. package/dist/agent/context-manager.js +50 -19
  4. package/dist/agent/context-manager.js.map +1 -1
  5. package/dist/agent/dependency-resolver.js +13 -7
  6. package/dist/agent/dependency-resolver.js.map +1 -1
  7. package/dist/agent/llm-agent.d.ts +35 -0
  8. package/dist/agent/llm-agent.js +137 -4
  9. package/dist/agent/llm-agent.js.map +1 -1
  10. package/dist/agent/status-reporter.d.ts +114 -0
  11. package/dist/agent/status-reporter.js +335 -0
  12. package/dist/agent/status-reporter.js.map +1 -0
  13. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +8 -2
  14. package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -1
  15. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +3 -1
  16. package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -1
  17. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +3 -1
  18. package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -1
  19. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +3 -1
  20. package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -1
  21. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +9 -3
  22. package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
  23. package/dist/analyzers/git/churn-calculator.d.ts +1 -0
  24. package/dist/analyzers/git/churn-calculator.js +25 -6
  25. package/dist/analyzers/git/churn-calculator.js.map +1 -1
  26. package/dist/analyzers/git/hotspot-detector.js +2 -2
  27. package/dist/analyzers/git/hotspot-detector.js.map +1 -1
  28. package/dist/analyzers/metrics/metrics-analyzer.js +1 -1
  29. package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -1
  30. package/dist/analyzers/security/security-analyzer.js +1 -1
  31. package/dist/analyzers/security/security-analyzer.js.map +1 -1
  32. package/dist/checkpoint/manager.d.ts +1 -0
  33. package/dist/checkpoint/manager.js +49 -9
  34. package/dist/checkpoint/manager.js.map +1 -1
  35. package/dist/checkpoint/storage.js +2 -2
  36. package/dist/checkpoint/storage.js.map +1 -1
  37. package/dist/commands/mcp-migrate.d.ts +9 -0
  38. package/dist/commands/mcp-migrate.js +172 -0
  39. package/dist/commands/mcp-migrate.js.map +1 -0
  40. package/dist/commands/status.d.ts +7 -0
  41. package/dist/commands/status.js +211 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/commands/vscode.d.ts +7 -0
  44. package/dist/commands/vscode.js +363 -0
  45. package/dist/commands/vscode.js.map +1 -0
  46. package/dist/index.js +79 -30
  47. package/dist/index.js.map +1 -1
  48. package/dist/llm/client.js +22 -4
  49. package/dist/llm/client.js.map +1 -1
  50. package/dist/mcp/automatosx-loader.d.ts +84 -0
  51. package/dist/mcp/automatosx-loader.js +238 -0
  52. package/dist/mcp/automatosx-loader.js.map +1 -0
  53. package/dist/mcp/client-mutex-patch.d.ts +36 -0
  54. package/dist/mcp/client-mutex-patch.js +75 -0
  55. package/dist/mcp/client-mutex-patch.js.map +1 -0
  56. package/dist/mcp/client-v2.d.ts +229 -0
  57. package/dist/mcp/client-v2.js +740 -0
  58. package/dist/mcp/client-v2.js.map +1 -0
  59. package/dist/mcp/client.d.ts +111 -13
  60. package/dist/mcp/client.js +168 -253
  61. package/dist/mcp/client.js.map +1 -1
  62. package/dist/mcp/config-detector-v2.d.ts +83 -0
  63. package/dist/mcp/config-detector-v2.js +328 -0
  64. package/dist/mcp/config-detector-v2.js.map +1 -0
  65. package/dist/mcp/config-detector.d.ts +90 -0
  66. package/dist/mcp/config-detector.js +242 -0
  67. package/dist/mcp/config-detector.js.map +1 -0
  68. package/dist/mcp/config-migrator-v2.d.ts +89 -0
  69. package/dist/mcp/config-migrator-v2.js +288 -0
  70. package/dist/mcp/config-migrator-v2.js.map +1 -0
  71. package/dist/mcp/config-migrator.d.ts +63 -0
  72. package/dist/mcp/config-migrator.js +269 -0
  73. package/dist/mcp/config-migrator.js.map +1 -0
  74. package/dist/mcp/config-v2.d.ts +106 -0
  75. package/dist/mcp/config-v2.js +417 -0
  76. package/dist/mcp/config-v2.js.map +1 -0
  77. package/dist/mcp/config.d.ts +12 -1
  78. package/dist/mcp/config.js +95 -10
  79. package/dist/mcp/config.js.map +1 -1
  80. package/dist/mcp/error-formatter.d.ts +46 -0
  81. package/dist/mcp/error-formatter.js +244 -0
  82. package/dist/mcp/error-formatter.js.map +1 -0
  83. package/dist/mcp/health.d.ts +5 -0
  84. package/dist/mcp/health.js +22 -2
  85. package/dist/mcp/health.js.map +1 -1
  86. package/dist/mcp/invariants.d.ts +141 -0
  87. package/dist/mcp/invariants.js +243 -0
  88. package/dist/mcp/invariants.js.map +1 -0
  89. package/dist/mcp/mutex-safe.d.ts +153 -0
  90. package/dist/mcp/mutex-safe.js +260 -0
  91. package/dist/mcp/mutex-safe.js.map +1 -0
  92. package/dist/mcp/mutex.d.ts +73 -0
  93. package/dist/mcp/mutex.js +130 -0
  94. package/dist/mcp/mutex.js.map +1 -0
  95. package/dist/mcp/reconnection.d.ts +4 -0
  96. package/dist/mcp/reconnection.js +15 -0
  97. package/dist/mcp/reconnection.js.map +1 -1
  98. package/dist/mcp/transports-v2.d.ts +152 -0
  99. package/dist/mcp/transports-v2.js +481 -0
  100. package/dist/mcp/transports-v2.js.map +1 -0
  101. package/dist/mcp/type-safety.d.ts +231 -0
  102. package/dist/mcp/type-safety.js +273 -0
  103. package/dist/mcp/type-safety.js.map +1 -0
  104. package/dist/planner/task-planner.js +13 -0
  105. package/dist/planner/task-planner.js.map +1 -1
  106. package/dist/planner/types.d.ts +6 -6
  107. package/dist/schemas/confirmation-schemas.d.ts +2 -2
  108. package/dist/schemas/settings-schemas.d.ts +196 -0
  109. package/dist/schemas/settings-schemas.js +146 -5
  110. package/dist/schemas/settings-schemas.js.map +1 -1
  111. package/dist/sdk/index.d.ts +118 -2
  112. package/dist/sdk/index.js +146 -4
  113. package/dist/sdk/index.js.map +1 -1
  114. package/dist/sdk/testing.d.ts +182 -0
  115. package/dist/sdk/testing.js +231 -0
  116. package/dist/sdk/testing.js.map +1 -1
  117. package/dist/sdk/version.d.ts +114 -15
  118. package/dist/sdk/version.js +137 -15
  119. package/dist/sdk/version.js.map +1 -1
  120. package/dist/tools/bash.js +54 -9
  121. package/dist/tools/bash.js.map +1 -1
  122. package/dist/tools/registry.d.ts +146 -0
  123. package/dist/tools/registry.js +170 -0
  124. package/dist/tools/registry.js.map +1 -0
  125. package/dist/tools/search.js +12 -2
  126. package/dist/tools/search.js.map +1 -1
  127. package/dist/tools/text-editor.js +84 -26
  128. package/dist/tools/text-editor.js.map +1 -1
  129. package/dist/ui/components/chat-history.js +6 -1
  130. package/dist/ui/components/chat-history.js.map +1 -1
  131. package/dist/ui/components/chat-input.d.ts +2 -1
  132. package/dist/ui/components/chat-input.js +5 -2
  133. package/dist/ui/components/chat-input.js.map +1 -1
  134. package/dist/ui/components/chat-interface.js +187 -5
  135. package/dist/ui/components/chat-interface.js.map +1 -1
  136. package/dist/ui/components/context-breakdown.d.ts +23 -0
  137. package/dist/ui/components/context-breakdown.js +124 -0
  138. package/dist/ui/components/context-breakdown.js.map +1 -0
  139. package/dist/ui/components/keyboard-help.d.ts +17 -0
  140. package/dist/ui/components/keyboard-help.js +116 -0
  141. package/dist/ui/components/keyboard-help.js.map +1 -0
  142. package/dist/ui/components/keyboard-hints.js +2 -2
  143. package/dist/ui/components/keyboard-hints.js.map +1 -1
  144. package/dist/ui/components/quick-actions.js +43 -7
  145. package/dist/ui/components/quick-actions.js.map +1 -1
  146. package/dist/ui/components/status-bar.d.ts +3 -0
  147. package/dist/ui/components/status-bar.js +25 -16
  148. package/dist/ui/components/status-bar.js.map +1 -1
  149. package/dist/ui/components/toast-notification.d.ts +42 -0
  150. package/dist/ui/components/toast-notification.js +30 -2
  151. package/dist/ui/components/toast-notification.js.map +1 -1
  152. package/dist/ui/components/tool-group-display.js +34 -4
  153. package/dist/ui/components/tool-group-display.js.map +1 -1
  154. package/dist/ui/components/welcome-panel.js +2 -2
  155. package/dist/ui/components/welcome-panel.js.map +1 -1
  156. package/dist/ui/hooks/use-enhanced-input.d.ts +9 -1
  157. package/dist/ui/hooks/use-enhanced-input.js +486 -41
  158. package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
  159. package/dist/ui/hooks/use-input-handler.d.ts +11 -1
  160. package/dist/ui/hooks/use-input-handler.js +67 -3
  161. package/dist/ui/hooks/use-input-handler.js.map +1 -1
  162. package/dist/ui/hooks/use-input-history.d.ts +1 -1
  163. package/dist/ui/hooks/use-input-history.js +50 -14
  164. package/dist/ui/hooks/use-input-history.js.map +1 -1
  165. package/dist/ui/utils/bracketed-paste-handler.d.ts +97 -0
  166. package/dist/ui/utils/bracketed-paste-handler.js +322 -0
  167. package/dist/ui/utils/bracketed-paste-handler.js.map +1 -0
  168. package/dist/ui/utils/change-summarizer.js +16 -6
  169. package/dist/ui/utils/change-summarizer.js.map +1 -1
  170. package/dist/ui/utils/tool-grouper.d.ts +10 -1
  171. package/dist/ui/utils/tool-grouper.js +143 -30
  172. package/dist/ui/utils/tool-grouper.js.map +1 -1
  173. package/dist/utils/auto-accept-logger.d.ts +173 -0
  174. package/dist/utils/auto-accept-logger.js +420 -0
  175. package/dist/utils/auto-accept-logger.js.map +1 -0
  176. package/dist/utils/background-task-manager.d.ts +11 -0
  177. package/dist/utils/background-task-manager.js +124 -38
  178. package/dist/utils/background-task-manager.js.map +1 -1
  179. package/dist/utils/confirmation-service.d.ts +1 -0
  180. package/dist/utils/confirmation-service.js +6 -1
  181. package/dist/utils/confirmation-service.js.map +1 -1
  182. package/dist/utils/encryption.d.ts +8 -0
  183. package/dist/utils/encryption.js +44 -27
  184. package/dist/utils/encryption.js.map +1 -1
  185. package/dist/utils/enhanced-error-messages.d.ts +33 -0
  186. package/dist/utils/enhanced-error-messages.js +420 -0
  187. package/dist/utils/enhanced-error-messages.js.map +1 -0
  188. package/dist/utils/error-handler.d.ts +13 -3
  189. package/dist/utils/error-handler.js +16 -4
  190. package/dist/utils/error-handler.js.map +1 -1
  191. package/dist/utils/external-editor.d.ts +47 -0
  192. package/dist/utils/external-editor.js +179 -0
  193. package/dist/utils/external-editor.js.map +1 -0
  194. package/dist/utils/history-migration.d.ts +9 -0
  195. package/dist/utils/history-migration.js +36 -0
  196. package/dist/utils/history-migration.js.map +1 -0
  197. package/dist/utils/paste-utils.js +12 -11
  198. package/dist/utils/paste-utils.js.map +1 -1
  199. package/dist/utils/rate-limiter.js +7 -0
  200. package/dist/utils/rate-limiter.js.map +1 -1
  201. package/dist/utils/safety-rules.d.ts +64 -0
  202. package/dist/utils/safety-rules.js +225 -0
  203. package/dist/utils/safety-rules.js.map +1 -0
  204. package/dist/utils/settings-manager.d.ts +89 -1
  205. package/dist/utils/settings-manager.js +359 -3
  206. package/dist/utils/settings-manager.js.map +1 -1
  207. package/dist/utils/token-counter.d.ts +2 -0
  208. package/dist/utils/token-counter.js +17 -4
  209. package/dist/utils/token-counter.js.map +1 -1
  210. package/dist/utils/version.d.ts +11 -2
  211. package/dist/utils/version.js +54 -21
  212. package/dist/utils/version.js.map +1 -1
  213. package/package.json +2 -1
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Status Reporter
3
+ *
4
+ * Generates context summaries and status reports for task execution
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { homedir } from 'os';
9
+ /**
10
+ * StatusReporter generates summaries and status reports
11
+ */
12
+ export class StatusReporter {
13
+ outputDir;
14
+ sessionStartTime;
15
+ constructor(outputDir) {
16
+ this.outputDir = outputDir || path.join(homedir(), 'automatosx', 'tmp');
17
+ this.sessionStartTime = new Date();
18
+ }
19
+ /**
20
+ * Generate a context summary from conversation history
21
+ */
22
+ async generateContextSummary(messages, chatHistory, reason, tokenCount) {
23
+ const summary = {
24
+ timestamp: new Date(),
25
+ reason,
26
+ messageCount: messages.length,
27
+ tokenCount,
28
+ shortSummary: this.extractShortSummary(chatHistory),
29
+ keyActions: this.extractKeyActions(chatHistory),
30
+ filesModified: this.extractFilesModified(chatHistory),
31
+ currentTask: this.extractCurrentTask(chatHistory),
32
+ nextSteps: this.extractNextSteps(chatHistory),
33
+ };
34
+ // Save to disk
35
+ summary.path = await this.saveSummary(summary);
36
+ return summary;
37
+ }
38
+ /**
39
+ * Generate a full status report
40
+ */
41
+ async generateStatusReport(context) {
42
+ const baseSummary = await this.generateContextSummary(context.messages, context.chatHistory, context.plan ? 'plan_completion' : 'user_request', context.tokenCount);
43
+ const report = {
44
+ ...baseSummary,
45
+ session: {
46
+ duration: Date.now() - this.sessionStartTime.getTime(),
47
+ messageCount: context.messages.length,
48
+ tokenUsage: context.tokenCount,
49
+ },
50
+ };
51
+ // Add plan info if available
52
+ if (context.plan) {
53
+ report.plan = {
54
+ id: context.plan.id,
55
+ name: context.plan.originalPrompt,
56
+ status: context.plan.status,
57
+ progress: {
58
+ completed: context.plan.phasesCompleted,
59
+ failed: context.plan.phasesFailed,
60
+ total: context.plan.phases.length,
61
+ percentage: (context.plan.phasesCompleted / context.plan.phases.length) * 100,
62
+ },
63
+ phases: context.plan.phases.map(phase => ({
64
+ name: phase.name,
65
+ status: phase.status,
66
+ duration: phase.duration,
67
+ tokensUsed: phase.tokensUsed,
68
+ filesModified: phase.filesModified || [],
69
+ })),
70
+ };
71
+ }
72
+ // Save report
73
+ const reportPath = await this.saveReport(report);
74
+ report.path = reportPath;
75
+ return report;
76
+ }
77
+ /**
78
+ * Extract short summary from recent assistant messages
79
+ */
80
+ extractShortSummary(chatHistory) {
81
+ // Get last 5 assistant messages
82
+ const recentAssistant = chatHistory
83
+ .filter(e => e.type === 'assistant')
84
+ .slice(-5)
85
+ .map(e => e.content)
86
+ .join(' ');
87
+ // Extract first 200 chars as summary
88
+ const summary = recentAssistant.slice(0, 200);
89
+ return summary + (recentAssistant.length > 200 ? '...' : '');
90
+ }
91
+ /**
92
+ * Extract key actions from tool results
93
+ */
94
+ extractKeyActions(chatHistory) {
95
+ const actions = [];
96
+ for (const entry of chatHistory) {
97
+ if (entry.type === 'tool_result' && entry.toolResult?.success && entry.toolCall) {
98
+ const toolName = entry.toolCall.function.name;
99
+ try {
100
+ const args = JSON.parse(entry.toolCall.function.arguments || '{}');
101
+ if (toolName === 'text_editor_20241022' || toolName === 'text_editor') {
102
+ if (args.command === 'create') {
103
+ actions.push(`Created ${args.path}`);
104
+ }
105
+ else if (args.command === 'str_replace') {
106
+ actions.push(`Modified ${args.path}`);
107
+ }
108
+ else if (args.command === 'view') {
109
+ // Don't log view operations (too noisy)
110
+ }
111
+ }
112
+ else if (toolName === 'bash') {
113
+ const cmd = args.command || '';
114
+ // Only log meaningful commands
115
+ if (!cmd.includes('cat') && !cmd.includes('ls') && cmd.length < 100) {
116
+ actions.push(`Ran: ${cmd}`);
117
+ }
118
+ }
119
+ else if (toolName === 'search') {
120
+ // Don't log search operations (too noisy)
121
+ }
122
+ }
123
+ catch {
124
+ // Ignore parse errors
125
+ }
126
+ }
127
+ }
128
+ return actions.slice(-10); // Last 10 actions
129
+ }
130
+ /**
131
+ * Extract modified files from tool results
132
+ */
133
+ extractFilesModified(chatHistory) {
134
+ const files = new Map();
135
+ for (const entry of chatHistory) {
136
+ if (entry.type === 'tool_result' && entry.toolResult?.success && entry.toolCall) {
137
+ const toolName = entry.toolCall.function.name;
138
+ try {
139
+ const args = JSON.parse(entry.toolCall.function.arguments || '{}');
140
+ if (toolName === 'text_editor_20241022' || toolName === 'text_editor') {
141
+ const filePath = args.path;
142
+ const command = args.command;
143
+ if (command === 'create') {
144
+ files.set(filePath, 'created');
145
+ }
146
+ else if (command === 'str_replace') {
147
+ if (!files.has(filePath)) {
148
+ files.set(filePath, 'modified');
149
+ }
150
+ }
151
+ }
152
+ }
153
+ catch {
154
+ // Ignore parse errors
155
+ }
156
+ }
157
+ }
158
+ return Array.from(files.entries()).map(([path, type]) => ({ path, type }));
159
+ }
160
+ /**
161
+ * Extract current task from last user message
162
+ */
163
+ extractCurrentTask(chatHistory) {
164
+ // Get last user message
165
+ const lastUser = chatHistory
166
+ .filter(e => e.type === 'user')
167
+ .slice(-1)[0];
168
+ return lastUser?.content || 'Unknown';
169
+ }
170
+ /**
171
+ * Extract next steps from recent assistant messages
172
+ */
173
+ extractNextSteps(chatHistory) {
174
+ // Get last 3 assistant messages
175
+ const lastAssistant = chatHistory
176
+ .filter(e => e.type === 'assistant')
177
+ .slice(-3)
178
+ .map(e => e.content)
179
+ .join(' ');
180
+ const steps = [];
181
+ const sentences = lastAssistant.split(/[.!?]/).filter(s => s.trim());
182
+ for (const sentence of sentences) {
183
+ // Look for sentences mentioning future actions
184
+ if (/\b(next|will|going to|then|after|now|should)\b/i.test(sentence)) {
185
+ const cleaned = sentence.trim();
186
+ if (cleaned.length > 10 && cleaned.length < 200) {
187
+ steps.push(cleaned);
188
+ }
189
+ }
190
+ }
191
+ return steps.slice(0, 3); // Top 3 next steps
192
+ }
193
+ /**
194
+ * Save summary to disk
195
+ */
196
+ async saveSummary(summary) {
197
+ // Ensure output directory exists
198
+ await fs.mkdir(this.outputDir, { recursive: true });
199
+ const timestamp = summary.timestamp.toISOString().replace(/[:.]/g, '-');
200
+ const filename = `summary-${timestamp}.md`;
201
+ const filepath = path.join(this.outputDir, filename);
202
+ const markdown = this.formatSummaryAsMarkdown(summary);
203
+ await fs.writeFile(filepath, markdown, 'utf-8');
204
+ return filepath;
205
+ }
206
+ /**
207
+ * Save status report to disk
208
+ */
209
+ async saveReport(report) {
210
+ // Ensure output directory exists
211
+ await fs.mkdir(this.outputDir, { recursive: true });
212
+ const timestamp = report.timestamp.toISOString().replace(/[:.]/g, '-');
213
+ const filename = `status-${timestamp}.md`;
214
+ const filepath = path.join(this.outputDir, filename);
215
+ const markdown = this.formatReportAsMarkdown(report);
216
+ await fs.writeFile(filepath, markdown, 'utf-8');
217
+ return filepath;
218
+ }
219
+ /**
220
+ * Format summary as markdown
221
+ */
222
+ formatSummaryAsMarkdown(summary) {
223
+ let md = `# Context Summary\n\n`;
224
+ md += `**Generated**: ${summary.timestamp.toISOString()}\n`;
225
+ md += `**Reason**: ${summary.reason.replace(/_/g, ' ')}\n`;
226
+ md += `**Messages**: ${summary.messageCount}\n`;
227
+ md += `**Tokens**: ${summary.tokenCount.toLocaleString()}\n\n`;
228
+ md += `## Short Summary\n\n${summary.shortSummary}\n\n`;
229
+ if (summary.keyActions.length > 0) {
230
+ md += `## Key Actions\n\n`;
231
+ summary.keyActions.forEach(action => {
232
+ md += `- ${action}\n`;
233
+ });
234
+ md += '\n';
235
+ }
236
+ if (summary.filesModified.length > 0) {
237
+ md += `## Files Modified\n\n`;
238
+ summary.filesModified.forEach(file => {
239
+ md += `- ${file.path} (${file.type})\n`;
240
+ });
241
+ md += '\n';
242
+ }
243
+ md += `## Current Task\n\n${summary.currentTask}\n\n`;
244
+ if (summary.nextSteps.length > 0) {
245
+ md += `## Next Steps\n\n`;
246
+ summary.nextSteps.forEach((step, i) => {
247
+ md += `${i + 1}. ${step}\n`;
248
+ });
249
+ }
250
+ return md;
251
+ }
252
+ /**
253
+ * Format status report as markdown
254
+ */
255
+ formatReportAsMarkdown(report) {
256
+ let md = `# Status Report\n\n`;
257
+ md += `**Generated**: ${report.timestamp.toISOString()}\n`;
258
+ md += `**Session Duration**: ${Math.ceil(report.session.duration / 60000)} minutes\n\n`;
259
+ md += `## Session Info\n\n`;
260
+ md += `- **Messages**: ${report.session.messageCount}\n`;
261
+ md += `- **Token Usage**: ${report.session.tokenUsage.toLocaleString()} tokens\n`;
262
+ md += `- **Files Modified**: ${report.filesModified.length} files\n\n`;
263
+ if (report.plan) {
264
+ md += `## Plan Progress\n\n`;
265
+ md += `**Plan**: ${report.plan.name.slice(0, 100)}${report.plan.name.length > 100 ? '...' : ''}\n`;
266
+ md += `**Status**: ${report.plan.status}\n`;
267
+ md += `**Progress**: ${report.plan.progress.percentage.toFixed(0)}% (${report.plan.progress.completed}/${report.plan.progress.total} phases completed)\n\n`;
268
+ md += `### Phases\n\n`;
269
+ for (const phase of report.plan.phases) {
270
+ const icon = this.getPhaseIcon(phase.status);
271
+ md += `${icon} **${phase.name}**`;
272
+ if (phase.duration) {
273
+ md += ` (${(phase.duration / 1000).toFixed(1)}s)`;
274
+ }
275
+ md += '\n';
276
+ if (phase.filesModified.length > 0) {
277
+ md += ` - Files: ${phase.filesModified.join(', ')}\n`;
278
+ }
279
+ }
280
+ md += '\n';
281
+ }
282
+ if (report.keyActions.length > 0) {
283
+ md += `## Actions Taken\n\n`;
284
+ report.keyActions.forEach(action => {
285
+ md += `- ${action}\n`;
286
+ });
287
+ md += '\n';
288
+ }
289
+ if (report.filesModified.length > 0) {
290
+ md += `## Files Modified\n\n`;
291
+ report.filesModified.forEach(file => {
292
+ md += `- ${file.path} (${file.type})\n`;
293
+ });
294
+ md += '\n';
295
+ }
296
+ md += `## Current Task\n\n${report.currentTask}\n\n`;
297
+ if (report.nextSteps.length > 0) {
298
+ md += `## Next Steps\n\n`;
299
+ report.nextSteps.forEach((step, i) => {
300
+ md += `${i + 1}. ${step}\n`;
301
+ });
302
+ }
303
+ return md;
304
+ }
305
+ /**
306
+ * Get phase status icon
307
+ */
308
+ getPhaseIcon(status) {
309
+ const icons = {
310
+ pending: '⏳',
311
+ executing: '▶️',
312
+ completed: '✅',
313
+ failed: '❌',
314
+ skipped: '⏭️',
315
+ };
316
+ return icons[status] || '❓';
317
+ }
318
+ }
319
+ /**
320
+ * Get or create singleton StatusReporter instance
321
+ */
322
+ let reporterInstance = null;
323
+ export function getStatusReporter() {
324
+ if (!reporterInstance) {
325
+ reporterInstance = new StatusReporter();
326
+ }
327
+ return reporterInstance;
328
+ }
329
+ /**
330
+ * Reset reporter instance (for testing)
331
+ */
332
+ export function resetStatusReporter() {
333
+ reporterInstance = null;
334
+ }
335
+ //# sourceMappingURL=status-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-reporter.js","sourceRoot":"","sources":["../../src/agent/status-reporter.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,17 @@ export class NoMagicNumbersRule extends BaseValidationRule {
13
13
  autoFixable = false;
14
14
  async check(filePath, content) {
15
15
  const violations = [];
16
- // Pattern: numeric literals (excluding 0, 1, -1 which are common)
17
- const magicNumberPattern = /(?<!\w)(?:[2-9]|[1-9]\d+)(?!\w|:)/g;
16
+ // REDOS FIX: Use simpler pattern without complex lookahead/lookbehind to prevent catastrophic backtracking
17
+ // Pattern: word boundary + numeric literals (excluding 0, 1, -1 which are common)
18
+ const magicNumberPattern = /\b(?:[2-9]|[1-9]\d+)\b/g;
18
19
  let match;
19
20
  while ((match = magicNumberPattern.exec(content)) !== null) {
20
21
  const number = match[0];
22
+ // REDOS FIX: Check context in code instead of using complex lookahead
23
+ const afterMatch = content.substring(match.index + number.length, match.index + number.length + 1);
24
+ if (afterMatch === ':') {
25
+ continue; // Skip numbers followed by colon (e.g., object literals, switch cases)
26
+ }
21
27
  // Skip if it's part of a const declaration
22
28
  const beforeMatch = content.substring(Math.max(0, match.index - 50), match.index);
23
29
  if (/const\s+\w+\s*=\s*$/.test(beforeMatch)) {
@@ -1 +1 @@
1
- {"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAC/C,EAAE,GAAG,kBAAkB,CAAC;IACxB,IAAI,GAAG,kBAAkB,CAAC;IAC1B,WAAW,GAAG,8CAA8C,CAAC;IAC7D,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,gBAAgB,CAAC;IAC1C,WAAW,GAAG,KAAK,CAAC;IAE7B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,kEAAkE;QAClE,MAAM,kBAAkB,GAAG,oCAAoC,CAAC;QAEhE,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,2CAA2C;YAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAClF,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5C,SAAS,CAAC,iCAAiC;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,iBAAiB,MAAM,wCAAwC,EAC/D,2BAA2B,MAAM,GAAG,CACrC,CACF,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/no-magic-numbers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAC/C,EAAE,GAAG,kBAAkB,CAAC;IACxB,IAAI,GAAG,kBAAkB,CAAC;IAC1B,WAAW,GAAG,8CAA8C,CAAC;IAC7D,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,gBAAgB,CAAC;IAC1C,WAAW,GAAG,KAAK,CAAC;IAE7B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,2GAA2G;QAC3G,kFAAkF;QAClF,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;QAErD,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,sEAAsE;YACtE,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnG,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvB,SAAS,CAAC,uEAAuE;YACnF,CAAC;YAED,2CAA2C;YAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAClF,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5C,SAAS,CAAC,iCAAiC;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,iBAAiB,MAAM,wCAAwC,EAC/D,2BAA2B,MAAM,GAAG,CACrC,CACF,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -22,7 +22,9 @@ export class NoUnusedVarsRule extends BaseValidationRule {
22
22
  if (varName.startsWith('_'))
23
23
  continue; // Intentionally unused
24
24
  // Count occurrences of the variable name
25
- const usagePattern = new RegExp(`\\b${varName}\\b`, 'g');
25
+ // Escape special regex characters in variable name
26
+ const escapedVarName = varName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
27
+ const usagePattern = new RegExp(`\\b${escapedVarName}\\b`, 'g');
26
28
  const usages = content.match(usagePattern);
27
29
  // If only appears once (the declaration), it's unused
28
30
  if (usages && usages.length === 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"no-unused-vars.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/no-unused-vars.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAC7C,EAAE,GAAG,gBAAgB,CAAC;IACtB,IAAI,GAAG,qBAAqB,CAAC;IAC7B,WAAW,GAAG,4CAA4C,CAAC;IAC3D,QAAQ,GAAa,QAAQ,CAAC;IAC9B,QAAQ,GAAiB,cAAc,CAAC;IACxC,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,6EAA6E;QAC7E,MAAM,UAAU,GAAG,gCAAgC,CAAC;QAEpD,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,8BAA8B;YAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,uBAAuB;YAE9D,yCAAyC;YACzC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE3C,sDAAsD;YACtD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,OAAO,+BAA+B,EACnD,uEAAuE,CACxE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"no-unused-vars.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/no-unused-vars.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAC7C,EAAE,GAAG,gBAAgB,CAAC;IACtB,IAAI,GAAG,qBAAqB,CAAC;IAC7B,WAAW,GAAG,4CAA4C,CAAC;IAC3D,QAAQ,GAAa,QAAQ,CAAC;IAC9B,QAAQ,GAAiB,cAAc,CAAC;IACxC,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,6EAA6E;QAC7E,MAAM,UAAU,GAAG,gCAAgC,CAAC;QAEpD,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzB,8BAA8B;YAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,uBAAuB;YAE9D,yCAAyC;YACzC,mDAAmD;YACnD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YACtE,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,cAAc,KAAK,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE3C,sDAAsD;YACtD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,OAAO,+BAA+B,EACnD,uEAAuE,CACxE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -20,7 +20,9 @@ export class PreferConstRule extends BaseValidationRule {
20
20
  const variableName = match[1];
21
21
  const pos = this.getPosition(content, match.index);
22
22
  // Check if variable is reassigned later (simple check)
23
- const reassignmentPattern = new RegExp(`\\b${variableName}\\s*=`, 'g');
23
+ // Escape special regex characters in variable name
24
+ const escapedVarName = variableName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
25
+ const reassignmentPattern = new RegExp(`\\b${escapedVarName}\\s*=`, 'g');
24
26
  const reassignments = content.match(reassignmentPattern);
25
27
  // If only one assignment (the declaration), suggest const
26
28
  if (reassignments && reassignments.length === 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"prefer-const.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/prefer-const.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IAC5C,EAAE,GAAG,cAAc,CAAC;IACpB,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,gEAAgE,CAAC;IAC/E,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,gBAAgB,CAAC;IAC1C,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,gDAAgD;QAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC;QAExC,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,uDAAuD;YACvD,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,MAAM,YAAY,OAAO,EAAE,GAAG,CAAC,CAAC;YACvE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEzD,0DAA0D;YAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,YAAY,sDAAsD,EAC/E,eAAe,YAAY,eAAe,YAAY,GAAG,CAC1D,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"prefer-const.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/prefer-const.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IAC5C,EAAE,GAAG,cAAc,CAAC;IACpB,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,gEAAgE,CAAC;IAC/E,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,gBAAgB,CAAC;IAC1C,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,gDAAgD;QAChD,MAAM,UAAU,GAAG,oBAAoB,CAAC;QAExC,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnD,uDAAuD;YACvD,mDAAmD;YACnD,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC3E,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,MAAM,cAAc,OAAO,EAAE,GAAG,CAAC,CAAC;YACzE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEzD,0DAA0D;YAC1D,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,YAAY,sDAAsD,EAC/E,eAAe,YAAY,eAAe,YAAY,GAAG,CAC1D,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -20,7 +20,9 @@ export class PreferReadonlyRule extends BaseValidationRule {
20
20
  const visibility = match[1];
21
21
  const propertyName = match[2];
22
22
  // Check if property is assigned after constructor (simple heuristic)
23
- const assignmentPattern = new RegExp(`this\\.${propertyName}\\s*=`, 'g');
23
+ // Escape special regex characters in property name
24
+ const escapedPropName = propertyName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
25
+ const assignmentPattern = new RegExp(`this\\.${escapedPropName}\\s*=`, 'g');
24
26
  const assignments = content.match(assignmentPattern);
25
27
  // If only assigned once (likely in constructor), suggest readonly
26
28
  if (assignments && assignments.length === 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"prefer-readonly.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/prefer-readonly.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAC/C,EAAE,GAAG,iBAAiB,CAAC;IACvB,IAAI,GAAG,iBAAiB,CAAC;IACzB,WAAW,GAAG,wEAAwE,CAAC;IACvF,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,aAAa,CAAC;IACvC,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,6CAA6C;QAC7C,MAAM,eAAe,GAAG,uDAAuD,CAAC;QAEhF,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE9B,qEAAqE;YACrE,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,UAAU,YAAY,OAAO,EAAE,GAAG,CAAC,CAAC;YACzE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAErD,kEAAkE;YAClE,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,YAAY,mDAAmD,EAC5E,GAAG,UAAU,aAAa,YAAY,GAAG,CAC1C,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"prefer-readonly.js","sourceRoot":"","sources":["../../../../../src/analyzers/best-practices/rules/typescript/prefer-readonly.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAC/C,EAAE,GAAG,iBAAiB,CAAC;IACvB,IAAI,GAAG,iBAAiB,CAAC;IACzB,WAAW,GAAG,wEAAwE,CAAC;IACvF,QAAQ,GAAa,KAAK,CAAC;IAC3B,QAAQ,GAAiB,aAAa,CAAC;IACvC,WAAW,GAAG,IAAI,CAAC;IAE5B,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAe;QAC3C,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,6CAA6C;QAC7C,MAAM,eAAe,GAAG,uDAAuD,CAAC;QAEhF,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE9B,qEAAqE;YACrE,mDAAmD;YACnD,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC5E,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,UAAU,eAAe,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAErD,kEAAkE;YAClE,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEnD,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,eAAe,CAClB,QAAQ,EACR,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,MAAM,EACV,aAAa,YAAY,mDAAmD,EAC5E,GAAG,UAAU,aAAa,YAAY,GAAG,CAC1C,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -45,10 +45,16 @@ export class DuplicateCodeDetector extends BaseSmellDetector {
45
45
  // Report duplicate methods (only once per signature)
46
46
  for (const [key, occurrences] of methodMap.entries()) {
47
47
  if (occurrences.length > 1) {
48
- // Split on last underscore to handle method names with underscores
48
+ // EDGE CASE FIX: Split on last underscore to extract method name and param count
49
+ // Handle edge case where underscore might be at position 0 (e.g., "_3" for anonymous function)
49
50
  const lastUnderscoreIndex = key.lastIndexOf('_');
50
- const methodName = lastUnderscoreIndex > 0 ? key.substring(0, lastUnderscoreIndex) : key;
51
- const paramCount = lastUnderscoreIndex > 0 ? key.substring(lastUnderscoreIndex + 1) : '0';
51
+ if (lastUnderscoreIndex === -1) {
52
+ // No underscore found - shouldn't happen with our format, but handle defensively
53
+ console.warn(`Invalid method signature format: ${key}`);
54
+ continue;
55
+ }
56
+ const methodName = key.substring(0, lastUnderscoreIndex);
57
+ const paramCount = key.substring(lastUnderscoreIndex + 1);
52
58
  const firstOccurrence = occurrences[0];
53
59
  smells.push(this.createSmell(filePath, firstOccurrence.line, firstOccurrence.endLine, `Potential code duplication: Method '${methodName}' with ${paramCount} parameters appears in ${occurrences.length} classes`, `Consider extracting common logic into a shared utility function or base class.`, SmellSeverity.MEDIUM, { methodName, occurrences: occurrences.length, classes: occurrences.map(o => o.className) }));
54
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate-code-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/duplicate-code-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duplicate-code-detector.js","sourceRoot":"","sources":["../../../../src/analyzers/code-smells/detectors/duplicate-code-detector.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export declare class ChurnCalculator {
17
17
  calculateContributorStats(options?: GitAnalysisOptions): Promise<ContributorStats[]>;
18
18
  /**
19
19
  * Get git log with file stats
20
+ * SECURITY FIX: Prevent command injection by validating inputs and using array-based execution
20
21
  */
21
22
  private getGitLog;
22
23
  /**
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Calculates file churn metrics from git history
5
5
  */
6
- import { execSync } from 'child_process';
7
6
  export class ChurnCalculator {
8
7
  repositoryPath;
9
8
  constructor(repositoryPath) {
@@ -110,27 +109,47 @@ export class ChurnCalculator {
110
109
  }
111
110
  /**
112
111
  * Get git log with file stats
112
+ * SECURITY FIX: Prevent command injection by validating inputs and using array-based execution
113
113
  */
114
114
  getGitLog(options) {
115
115
  const args = ['log', '--numstat', '--pretty=format:%H|%an|%ad|%s'];
116
+ // SECURITY FIX: Validate and sanitize inputs to prevent command injection
116
117
  if (options.since) {
117
- args.push(`--since="${options.since}"`);
118
+ // Validate date format: only allow alphanumeric, spaces, hyphens, colons, and slashes
119
+ if (!/^[\w\s\-:\/]+$/.test(options.since)) {
120
+ throw new Error(`Invalid since parameter: contains unsafe characters`);
121
+ }
122
+ args.push('--since', options.since); // Pass as separate argument to prevent injection
118
123
  }
119
124
  if (options.until) {
120
- args.push(`--until="${options.until}"`);
125
+ // Validate date format
126
+ if (!/^[\w\s\-:\/]+$/.test(options.until)) {
127
+ throw new Error(`Invalid until parameter: contains unsafe characters`);
128
+ }
129
+ args.push('--until', options.until);
121
130
  }
122
131
  if (options.branch) {
132
+ // Validate branch name: only allow alphanumeric, hyphens, slashes, underscores, and dots
133
+ if (!/^[\w\-\/\.]+$/.test(options.branch)) {
134
+ throw new Error(`Invalid branch name: contains unsafe characters`);
135
+ }
123
136
  args.push(options.branch);
124
137
  }
125
138
  try {
126
- return execSync(`git ${args.join(' ')}`, {
139
+ // SECURITY FIX: Use spawnSync with array args instead of string interpolation
140
+ // This prevents shell injection by not invoking a shell
141
+ const result = require('child_process').spawnSync('git', args, {
127
142
  cwd: this.repositoryPath,
128
143
  encoding: 'utf-8',
129
144
  maxBuffer: 10 * 1024 * 1024, // 10MB buffer
130
- stdio: ['pipe', 'pipe', 'ignore'], // Ignore stderr to suppress shell warnings
145
+ stdio: ['pipe', 'pipe', 'ignore'], // Ignore stderr to suppress warnings
131
146
  });
147
+ if (result.error) {
148
+ return '';
149
+ }
150
+ return result.stdout || '';
132
151
  }
133
- catch (error) {
152
+ catch (_error) {
134
153
  // If git command fails, return empty string
135
154
  return '';
136
155
  }
@@ -1 +1 @@
1
- {"version":3,"file":"churn-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/git/churn-calculator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,MAAM,OAAO,eAAe;IAClB,cAAc,CAAS;IAE/B,YAAY,cAAsB;QAChC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,UAA8B,EAAE;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAMxB,CAAC;QAEL,uBAAuB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;oBAAE,SAAS;gBAE1D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;wBAC1B,OAAO,EAAE,CAAC;wBACV,SAAS,EAAE,CAAC;wBACZ,SAAS,EAAE,CAAC;wBACZ,YAAY,EAAE,MAAM,CAAC,IAAI;wBACzB,OAAO,EAAE,IAAI,GAAG,EAAE;qBACnB,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;gBAC3C,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;gBAClC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;gBAClC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEjC,4BAA4B;gBAC5B,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;oBACrC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM,CAAC;gBACZ,QAAQ;gBACR,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;gBAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACjD,CAAC,CACH,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,yBAAyB,CAAC,UAA8B,EAAE;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE/C,MAAM,cAAc,GAAG,IAAI,GAAG,EAO1B,CAAC;QAEL,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;oBAChC,OAAO,EAAE,CAAC;oBACV,KAAK,EAAE,IAAI,GAAG,EAAE;oBAChB,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,CAAC;oBACV,WAAW,EAAE,MAAM,CAAC,IAAI;oBACxB,UAAU,EAAE,MAAM,CAAC,IAAI;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC;YACjD,KAAK,CAAC,OAAO,EAAE,CAAC;YAEhB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC/C,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3B,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC;oBAC9B,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACpC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;YAClC,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YACjC,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,MAAM,CAAC;gBACZ,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBAC7B,UAAU,EAAE,IAAI,CAAC,KAAK;gBACtB,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC,CACH,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,OAA2B;QAC3C,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,+BAA+B,CAAC,CAAC;QAEnE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;gBACvC,GAAG,EAAE,IAAI,CAAC,cAAc;gBACxB,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,cAAc;gBAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,2CAA2C;aAC/E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,MAAc;QAOhC,MAAM,OAAO,GAMR,EAAE,CAAC;QAER,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,aAAa,GAAQ,IAAI,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAE3B,wCAAwC;YACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACtB,uBAAuB;oBACvB,IAAI,aAAa,EAAE,CAAC;wBAClB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC9B,CAAC;oBAED,mBAAmB;oBACnB,aAAa,GAAG;wBACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;wBACd,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;wBAChB,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACxB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBACjB,KAAK,EAAE,EAAE;qBACV,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,aAAa,EAAE,CAAC;gBACzB,+CAA+C;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAEtB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAgB,EAAE,OAA2B;QACrE,yBAAyB;QACzB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;oBACzC,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC9C,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;oBACzC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB,EAAE,OAAe;QACpD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;CACF"}
1
+ {"version":3,"file":"churn-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/git/churn-calculator.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ export class HotspotDetector {
55
55
  }));
56
56
  }
57
57
  }
58
- catch (error) {
58
+ catch (_error) {
59
59
  // Skip files that can't be analyzed
60
60
  continue;
61
61
  }
@@ -87,7 +87,7 @@ export class HotspotDetector {
87
87
  const max = Math.max(...complexities);
88
88
  return { average, max };
89
89
  }
90
- catch (error) {
90
+ catch (_error) {
91
91
  return null;
92
92
  }
93
93
  }