@defai.digital/ax-cli 3.7.2 → 3.8.2
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.
- package/README.md +148 -53
- package/dist/agent/context-manager.d.ts +15 -1
- package/dist/agent/context-manager.js +50 -19
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/dependency-resolver.js +13 -7
- package/dist/agent/dependency-resolver.js.map +1 -1
- package/dist/agent/llm-agent.d.ts +37 -0
- package/dist/agent/llm-agent.js +318 -98
- package/dist/agent/llm-agent.js.map +1 -1
- package/dist/agent/status-reporter.d.ts +114 -0
- package/dist/agent/status-reporter.js +335 -0
- package/dist/agent/status-reporter.js.map +1 -0
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js +8 -2
- package/dist/analyzers/best-practices/rules/typescript/no-magic-numbers.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/no-unused-vars.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-const.js.map +1 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js +3 -1
- package/dist/analyzers/best-practices/rules/typescript/prefer-readonly.js.map +1 -1
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js +9 -3
- package/dist/analyzers/code-smells/detectors/duplicate-code-detector.js.map +1 -1
- package/dist/analyzers/git/churn-calculator.d.ts +2 -0
- package/dist/analyzers/git/churn-calculator.js +42 -8
- package/dist/analyzers/git/churn-calculator.js.map +1 -1
- package/dist/analyzers/git/hotspot-detector.js +2 -2
- package/dist/analyzers/git/hotspot-detector.js.map +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js +1 -1
- package/dist/analyzers/metrics/metrics-analyzer.js.map +1 -1
- package/dist/analyzers/security/security-analyzer.js +1 -1
- package/dist/analyzers/security/security-analyzer.js.map +1 -1
- package/dist/checkpoint/manager.d.ts +1 -0
- package/dist/checkpoint/manager.js +49 -9
- package/dist/checkpoint/manager.js.map +1 -1
- package/dist/checkpoint/storage.js +2 -2
- package/dist/checkpoint/storage.js.map +1 -1
- package/dist/commands/mcp-migrate.d.ts +9 -0
- package/dist/commands/mcp-migrate.js +172 -0
- package/dist/commands/mcp-migrate.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +211 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/vscode.d.ts +7 -0
- package/dist/commands/vscode.js +363 -0
- package/dist/commands/vscode.js.map +1 -0
- package/dist/index.js +79 -30
- package/dist/index.js.map +1 -1
- package/dist/llm/client.js +33 -4
- package/dist/llm/client.js.map +1 -1
- package/dist/mcp/automatosx-loader.d.ts +84 -0
- package/dist/mcp/automatosx-loader.js +238 -0
- package/dist/mcp/automatosx-loader.js.map +1 -0
- package/dist/mcp/client-mutex-patch.d.ts +36 -0
- package/dist/mcp/client-mutex-patch.js +75 -0
- package/dist/mcp/client-mutex-patch.js.map +1 -0
- package/dist/mcp/client-v2.d.ts +229 -0
- package/dist/mcp/client-v2.js +740 -0
- package/dist/mcp/client-v2.js.map +1 -0
- package/dist/mcp/client.d.ts +111 -13
- package/dist/mcp/client.js +168 -253
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/config-detector-v2.d.ts +83 -0
- package/dist/mcp/config-detector-v2.js +328 -0
- package/dist/mcp/config-detector-v2.js.map +1 -0
- package/dist/mcp/config-detector.d.ts +90 -0
- package/dist/mcp/config-detector.js +242 -0
- package/dist/mcp/config-detector.js.map +1 -0
- package/dist/mcp/config-migrator-v2.d.ts +89 -0
- package/dist/mcp/config-migrator-v2.js +288 -0
- package/dist/mcp/config-migrator-v2.js.map +1 -0
- package/dist/mcp/config-migrator.d.ts +63 -0
- package/dist/mcp/config-migrator.js +269 -0
- package/dist/mcp/config-migrator.js.map +1 -0
- package/dist/mcp/config-v2.d.ts +106 -0
- package/dist/mcp/config-v2.js +417 -0
- package/dist/mcp/config-v2.js.map +1 -0
- package/dist/mcp/config.d.ts +12 -1
- package/dist/mcp/config.js +95 -10
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/error-formatter.d.ts +46 -0
- package/dist/mcp/error-formatter.js +244 -0
- package/dist/mcp/error-formatter.js.map +1 -0
- package/dist/mcp/health.d.ts +5 -0
- package/dist/mcp/health.js +22 -2
- package/dist/mcp/health.js.map +1 -1
- package/dist/mcp/invariants.d.ts +141 -0
- package/dist/mcp/invariants.js +243 -0
- package/dist/mcp/invariants.js.map +1 -0
- package/dist/mcp/mutex-safe.d.ts +153 -0
- package/dist/mcp/mutex-safe.js +260 -0
- package/dist/mcp/mutex-safe.js.map +1 -0
- package/dist/mcp/mutex.d.ts +73 -0
- package/dist/mcp/mutex.js +137 -0
- package/dist/mcp/mutex.js.map +1 -0
- package/dist/mcp/reconnection.d.ts +4 -0
- package/dist/mcp/reconnection.js +25 -1
- package/dist/mcp/reconnection.js.map +1 -1
- package/dist/mcp/transports-v2.d.ts +152 -0
- package/dist/mcp/transports-v2.js +481 -0
- package/dist/mcp/transports-v2.js.map +1 -0
- package/dist/mcp/type-safety.d.ts +231 -0
- package/dist/mcp/type-safety.js +273 -0
- package/dist/mcp/type-safety.js.map +1 -0
- package/dist/planner/task-planner.js +13 -0
- package/dist/planner/task-planner.js.map +1 -1
- package/dist/planner/types.d.ts +6 -6
- package/dist/schemas/confirmation-schemas.d.ts +2 -2
- package/dist/schemas/settings-schemas.d.ts +196 -0
- package/dist/schemas/settings-schemas.js +146 -5
- package/dist/schemas/settings-schemas.js.map +1 -1
- package/dist/sdk/index.d.ts +118 -2
- package/dist/sdk/index.js +146 -4
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +182 -0
- package/dist/sdk/testing.js +231 -0
- package/dist/sdk/testing.js.map +1 -1
- package/dist/sdk/version.d.ts +114 -15
- package/dist/sdk/version.js +137 -15
- package/dist/sdk/version.js.map +1 -1
- package/dist/tools/bash.js +54 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/registry.d.ts +146 -0
- package/dist/tools/registry.js +170 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.js +12 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/text-editor.js +84 -26
- package/dist/tools/text-editor.js.map +1 -1
- package/dist/ui/components/chat-history.js +6 -1
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.d.ts +2 -1
- package/dist/ui/components/chat-input.js +5 -2
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.js +187 -5
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/context-breakdown.d.ts +23 -0
- package/dist/ui/components/context-breakdown.js +124 -0
- package/dist/ui/components/context-breakdown.js.map +1 -0
- package/dist/ui/components/keyboard-help.d.ts +17 -0
- package/dist/ui/components/keyboard-help.js +116 -0
- package/dist/ui/components/keyboard-help.js.map +1 -0
- package/dist/ui/components/keyboard-hints.js +2 -2
- package/dist/ui/components/keyboard-hints.js.map +1 -1
- package/dist/ui/components/quick-actions.js +43 -7
- package/dist/ui/components/quick-actions.js.map +1 -1
- package/dist/ui/components/status-bar.d.ts +3 -0
- package/dist/ui/components/status-bar.js +25 -16
- package/dist/ui/components/status-bar.js.map +1 -1
- package/dist/ui/components/toast-notification.d.ts +42 -0
- package/dist/ui/components/toast-notification.js +30 -2
- package/dist/ui/components/toast-notification.js.map +1 -1
- package/dist/ui/components/tool-group-display.js +34 -4
- package/dist/ui/components/tool-group-display.js.map +1 -1
- package/dist/ui/components/welcome-panel.js +2 -2
- package/dist/ui/components/welcome-panel.js.map +1 -1
- package/dist/ui/hooks/use-enhanced-input.d.ts +9 -1
- package/dist/ui/hooks/use-enhanced-input.js +901 -90
- package/dist/ui/hooks/use-enhanced-input.js.map +1 -1
- package/dist/ui/hooks/use-input-handler.d.ts +11 -1
- package/dist/ui/hooks/use-input-handler.js +67 -3
- package/dist/ui/hooks/use-input-handler.js.map +1 -1
- package/dist/ui/hooks/use-input-history.d.ts +1 -1
- package/dist/ui/hooks/use-input-history.js +50 -14
- package/dist/ui/hooks/use-input-history.js.map +1 -1
- package/dist/ui/utils/bracketed-paste-handler.d.ts +97 -0
- package/dist/ui/utils/bracketed-paste-handler.js +322 -0
- package/dist/ui/utils/bracketed-paste-handler.js.map +1 -0
- package/dist/ui/utils/change-summarizer.js +16 -6
- package/dist/ui/utils/change-summarizer.js.map +1 -1
- package/dist/ui/utils/tool-grouper.d.ts +10 -1
- package/dist/ui/utils/tool-grouper.js +143 -30
- package/dist/ui/utils/tool-grouper.js.map +1 -1
- package/dist/utils/auto-accept-logger.d.ts +173 -0
- package/dist/utils/auto-accept-logger.js +420 -0
- package/dist/utils/auto-accept-logger.js.map +1 -0
- package/dist/utils/background-task-manager.d.ts +11 -0
- package/dist/utils/background-task-manager.js +124 -38
- package/dist/utils/background-task-manager.js.map +1 -1
- package/dist/utils/confirmation-service.d.ts +1 -0
- package/dist/utils/confirmation-service.js +6 -1
- package/dist/utils/confirmation-service.js.map +1 -1
- package/dist/utils/encryption.d.ts +8 -0
- package/dist/utils/encryption.js +44 -27
- package/dist/utils/encryption.js.map +1 -1
- package/dist/utils/enhanced-error-messages.d.ts +33 -0
- package/dist/utils/enhanced-error-messages.js +420 -0
- package/dist/utils/enhanced-error-messages.js.map +1 -0
- package/dist/utils/error-handler.d.ts +13 -3
- package/dist/utils/error-handler.js +16 -4
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/external-editor.d.ts +47 -0
- package/dist/utils/external-editor.js +179 -0
- package/dist/utils/external-editor.js.map +1 -0
- package/dist/utils/history-migration.d.ts +9 -0
- package/dist/utils/history-migration.js +36 -0
- package/dist/utils/history-migration.js.map +1 -0
- package/dist/utils/paste-utils.js +12 -11
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/rate-limiter.js +20 -1
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/safety-rules.d.ts +64 -0
- package/dist/utils/safety-rules.js +225 -0
- package/dist/utils/safety-rules.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +89 -1
- package/dist/utils/settings-manager.js +359 -3
- package/dist/utils/settings-manager.js.map +1 -1
- package/dist/utils/token-counter.d.ts +2 -0
- package/dist/utils/token-counter.js +32 -9
- package/dist/utils/token-counter.js.map +1 -1
- package/dist/utils/version.d.ts +11 -2
- package/dist/utils/version.js +54 -21
- package/dist/utils/version.js.map +1 -1
- 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
|
-
//
|
|
17
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
51
|
-
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAuC,MAAM,aAAa,CAAC;AAE5F,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAC1D,YAAY,SAAyB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;QACjF,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE/C,gGAAgG;YAChG,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAiE,CAAC;YAEpG,8BAA8B;YAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC3D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBACH,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;YAED,gEAAgE;YAChE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuE,CAAC;YACjG,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC9B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;oBACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,MAAM,CAAC,SAAS;wBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,SAAS,EAAE,GAAG,CAAC,IAAI;qBACpB,CAAC,CAAC;oBACH,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,qDAAqD;YACrD,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;gBACrD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,
|
|
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
|
/**
|
|
@@ -29,6 +30,7 @@ export declare class ChurnCalculator {
|
|
|
29
30
|
private shouldIncludeFile;
|
|
30
31
|
/**
|
|
31
32
|
* Simple pattern matching (supports * wildcard)
|
|
33
|
+
* SECURITY FIX: Prevent ReDoS by using non-greedy matching and proper escaping
|
|
32
34
|
*/
|
|
33
35
|
private matchPattern;
|
|
34
36
|
}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
152
|
+
catch (_error) {
|
|
134
153
|
// If git command fails, return empty string
|
|
135
154
|
return '';
|
|
136
155
|
}
|
|
@@ -205,10 +224,25 @@ export class ChurnCalculator {
|
|
|
205
224
|
}
|
|
206
225
|
/**
|
|
207
226
|
* Simple pattern matching (supports * wildcard)
|
|
227
|
+
* SECURITY FIX: Prevent ReDoS by using non-greedy matching and proper escaping
|
|
208
228
|
*/
|
|
209
229
|
matchPattern(filePath, pattern) {
|
|
210
|
-
|
|
211
|
-
|
|
230
|
+
// CRITICAL FIX: Escape special regex characters EXCEPT * to prevent injection
|
|
231
|
+
// Must escape: . + ? ^ $ { } ( ) | [ ] \
|
|
232
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
233
|
+
// CRITICAL FIX: Replace * with [^/]* (non-greedy, doesn't cross directories)
|
|
234
|
+
// This prevents catastrophic backtracking from nested wildcards like "a*b*c*d*"
|
|
235
|
+
// Old: .* (greedy, can cause ReDoS)
|
|
236
|
+
// New: [^/]* (matches anything except /, prevents exponential backtracking)
|
|
237
|
+
const regexPattern = '^' + escaped.replace(/\*/g, '[^/]*') + '$';
|
|
238
|
+
try {
|
|
239
|
+
const regex = new RegExp(regexPattern);
|
|
240
|
+
return regex.test(filePath);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// If regex construction fails, return false
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
212
246
|
}
|
|
213
247
|
}
|
|
214
248
|
//# sourceMappingURL=churn-calculator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churn-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/git/churn-calculator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"churn-calculator.js","sourceRoot":"","sources":["../../../src/analyzers/git/churn-calculator.ts"],"names":[],"mappings":"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"}
|