bob-app-assistant 0.0.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.
- package/README.md +292 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +296 -0
- package/dist/cli.js.map +1 -0
- package/dist/database.d.ts +42 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +199 -0
- package/dist/database.js.map +1 -0
- package/dist/postinstall.d.ts +3 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +48 -0
- package/dist/postinstall.js.map +1 -0
- package/dist/routes/aiRoutes.d.ts +3 -0
- package/dist/routes/aiRoutes.d.ts.map +1 -0
- package/dist/routes/aiRoutes.js +1277 -0
- package/dist/routes/aiRoutes.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +120 -0
- package/dist/server.js.map +1 -0
- package/dist/services/apiTestingService.d.ts +90 -0
- package/dist/services/apiTestingService.d.ts.map +1 -0
- package/dist/services/apiTestingService.js +351 -0
- package/dist/services/apiTestingService.js.map +1 -0
- package/dist/services/backupService.d.ts +63 -0
- package/dist/services/backupService.d.ts.map +1 -0
- package/dist/services/backupService.js +235 -0
- package/dist/services/backupService.js.map +1 -0
- package/dist/services/bobShellService.d.ts +91 -0
- package/dist/services/bobShellService.d.ts.map +1 -0
- package/dist/services/bobShellService.js +534 -0
- package/dist/services/bobShellService.js.map +1 -0
- package/dist/services/codeQualityService.d.ts +105 -0
- package/dist/services/codeQualityService.d.ts.map +1 -0
- package/dist/services/codeQualityService.js +432 -0
- package/dist/services/codeQualityService.js.map +1 -0
- package/dist/services/dependencyService.d.ts +127 -0
- package/dist/services/dependencyService.d.ts.map +1 -0
- package/dist/services/dependencyService.js +499 -0
- package/dist/services/dependencyService.js.map +1 -0
- package/dist/services/diffService.d.ts +48 -0
- package/dist/services/diffService.d.ts.map +1 -0
- package/dist/services/diffService.js +175 -0
- package/dist/services/diffService.js.map +1 -0
- package/dist/services/documentationService.d.ts +124 -0
- package/dist/services/documentationService.d.ts.map +1 -0
- package/dist/services/documentationService.js +628 -0
- package/dist/services/documentationService.js.map +1 -0
- package/dist/services/promptEnhancerService.d.ts +92 -0
- package/dist/services/promptEnhancerService.d.ts.map +1 -0
- package/dist/services/promptEnhancerService.js +459 -0
- package/dist/services/promptEnhancerService.js.map +1 -0
- package/dist/services/securityService.d.ts +99 -0
- package/dist/services/securityService.d.ts.map +1 -0
- package/dist/services/securityService.js +467 -0
- package/dist/services/securityService.js.map +1 -0
- package/dist/websocket.d.ts +17 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +242 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +74 -0
- package/public/assistant-ui.html +211 -0
- package/public/dist/assets/index-BdGvFYpE.css +1 -0
- package/public/dist/assets/index-Dfe7xGmm.js +55 -0
- package/public/dist/index.html +13 -0
- package/public/inject.js +241 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.bobShellService = exports.BobShellService = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const util_1 = require("util");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
11
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
12
|
+
class BobShellService {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.previewCache = new Map();
|
|
15
|
+
this.bobShellPath = process.env.BOB_SHELL_PATH || 'bob';
|
|
16
|
+
// Use PROJECT_ROOT from environment (set by CLI) or fall back to process.cwd()
|
|
17
|
+
this.projectRoot = process.env.PROJECT_ROOT || process.cwd();
|
|
18
|
+
this.apiKey = process.env.BOB_API_KEY;
|
|
19
|
+
this.licenseAccepted = process.env.BOB_LICENSE_ACCEPTED === 'true';
|
|
20
|
+
console.log(`📁 Bob-Shell will operate in: ${this.projectRoot}`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build Bob-Shell command with API key and license acceptance
|
|
24
|
+
* SECURITY: Uses array-based command construction to prevent command injection
|
|
25
|
+
*/
|
|
26
|
+
buildBobCommand(prompt) {
|
|
27
|
+
const args = [this.bobShellPath];
|
|
28
|
+
// Add license acceptance flag if configured
|
|
29
|
+
if (this.licenseAccepted) {
|
|
30
|
+
args.push('--accept-license');
|
|
31
|
+
}
|
|
32
|
+
// Add approval mode to auto-approve file edits
|
|
33
|
+
// This allows Bob-Shell to actually write files without interactive prompts
|
|
34
|
+
args.push('--approval-mode', 'auto_edit');
|
|
35
|
+
// Add prompt as separate argument (no shell escaping needed)
|
|
36
|
+
// SECURITY: Passing as array element prevents command injection
|
|
37
|
+
args.push('-p', prompt);
|
|
38
|
+
return args;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build environment variables for Bob-Shell execution
|
|
42
|
+
*/
|
|
43
|
+
buildEnvironment() {
|
|
44
|
+
const env = { ...process.env };
|
|
45
|
+
// Add API key to environment if configured
|
|
46
|
+
if (this.apiKey) {
|
|
47
|
+
env.BOB_API_KEY = this.apiKey;
|
|
48
|
+
}
|
|
49
|
+
return env;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get list of tracked files that might be modified
|
|
53
|
+
*/
|
|
54
|
+
async getTrackedFiles() {
|
|
55
|
+
try {
|
|
56
|
+
const { stdout } = await execAsync('git ls-files', {
|
|
57
|
+
cwd: this.projectRoot,
|
|
58
|
+
});
|
|
59
|
+
return stdout.trim().split('\n').filter(f => f.length > 0);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.warn('Could not get tracked files:', error);
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Execute a Bob-Shell command with a prompt
|
|
68
|
+
* SECURITY: Uses spawn instead of exec to prevent command injection
|
|
69
|
+
*/
|
|
70
|
+
async executePrompt(prompt) {
|
|
71
|
+
try {
|
|
72
|
+
// SECURITY: Validate prompt length to prevent DoS
|
|
73
|
+
if (prompt.length > 10000) {
|
|
74
|
+
throw new Error('Prompt exceeds maximum length of 10000 characters');
|
|
75
|
+
}
|
|
76
|
+
// SECURITY: Sanitize prompt - remove null bytes and control characters
|
|
77
|
+
const sanitizedPrompt = prompt.replace(/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/g, '');
|
|
78
|
+
console.log('🤖 Executing Bob-Shell with sanitized prompt');
|
|
79
|
+
// Build command and environment
|
|
80
|
+
const args = this.buildBobCommand(sanitizedPrompt);
|
|
81
|
+
const env = this.buildEnvironment();
|
|
82
|
+
// SECURITY: Use spawn with array arguments instead of shell string
|
|
83
|
+
const { spawn } = require('child_process');
|
|
84
|
+
const [command, ...commandArgs] = args;
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
const process = spawn(command, commandArgs, {
|
|
87
|
+
cwd: this.projectRoot,
|
|
88
|
+
env,
|
|
89
|
+
shell: false, // SECURITY: Disable shell to prevent injection
|
|
90
|
+
timeout: 300000, // 5 minutes timeout
|
|
91
|
+
});
|
|
92
|
+
let stdout = '';
|
|
93
|
+
let stderr = '';
|
|
94
|
+
process.stdout.on('data', (data) => {
|
|
95
|
+
stdout += data.toString();
|
|
96
|
+
});
|
|
97
|
+
process.stderr.on('data', (data) => {
|
|
98
|
+
stderr += data.toString();
|
|
99
|
+
});
|
|
100
|
+
process.on('close', (code) => {
|
|
101
|
+
if (code === 0) {
|
|
102
|
+
console.log('✅ Bob-Shell execution completed');
|
|
103
|
+
// Parse the output to detect file changes
|
|
104
|
+
const filesModified = this.parseModifiedFiles(stdout);
|
|
105
|
+
resolve({
|
|
106
|
+
success: true,
|
|
107
|
+
output: stdout,
|
|
108
|
+
filesModified,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else if (code === null) {
|
|
112
|
+
console.error('❌ Bob-Shell execution timed out or was killed');
|
|
113
|
+
resolve({
|
|
114
|
+
success: false,
|
|
115
|
+
output: stdout,
|
|
116
|
+
error: 'Bob-Shell execution timed out after 5 minutes. Try a simpler prompt or use native mode.',
|
|
117
|
+
filesModified: [],
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.error('❌ Bob-Shell execution failed with code:', code);
|
|
122
|
+
resolve({
|
|
123
|
+
success: false,
|
|
124
|
+
output: stdout,
|
|
125
|
+
error: stderr || `Process exited with code ${code}`,
|
|
126
|
+
filesModified: [],
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
process.on('error', (error) => {
|
|
131
|
+
console.error('❌ Bob-Shell execution error:', error.message);
|
|
132
|
+
reject({
|
|
133
|
+
success: false,
|
|
134
|
+
output: stdout,
|
|
135
|
+
error: 'Failed to execute Bob-Shell',
|
|
136
|
+
filesModified: [],
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error('❌ Bob-Shell execution failed:', error.message);
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
output: '',
|
|
146
|
+
error: 'Failed to execute Bob-Shell',
|
|
147
|
+
filesModified: [],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Parse Bob-Shell output to detect modified files
|
|
153
|
+
*/
|
|
154
|
+
parseModifiedFiles(output) {
|
|
155
|
+
const files = [];
|
|
156
|
+
// Look for tool usage patterns in Bob-Shell output
|
|
157
|
+
// Bob-Shell shows file paths in tool usage like: [using tool apply_diff: applying diff to /full/path/to/file.tsx]
|
|
158
|
+
const toolPattern = /applying diff to ([^\s]+)/gi;
|
|
159
|
+
const matches = output.matchAll(toolPattern);
|
|
160
|
+
for (const match of matches) {
|
|
161
|
+
if (match[1]) {
|
|
162
|
+
let filePath = match[1].trim();
|
|
163
|
+
// Remove trailing bracket if present
|
|
164
|
+
filePath = filePath.replace(/\]$/, '');
|
|
165
|
+
// Convert absolute path to relative path
|
|
166
|
+
if (filePath.startsWith(this.projectRoot)) {
|
|
167
|
+
filePath = filePath.substring(this.projectRoot.length + 1);
|
|
168
|
+
}
|
|
169
|
+
// Only add if it's a valid file path (not containing ...)
|
|
170
|
+
if (!filePath.includes('...') && filePath.length > 0) {
|
|
171
|
+
files.push(filePath);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return [...new Set(files)]; // Remove duplicates
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the project root directory
|
|
179
|
+
*/
|
|
180
|
+
getProjectRoot() {
|
|
181
|
+
return this.projectRoot;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Read file content
|
|
185
|
+
*/
|
|
186
|
+
async readFile(filePath) {
|
|
187
|
+
const fullPath = path_1.default.resolve(this.projectRoot, filePath);
|
|
188
|
+
return await promises_1.default.readFile(fullPath, 'utf-8');
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Write file content
|
|
192
|
+
*/
|
|
193
|
+
async writeFile(filePath, content) {
|
|
194
|
+
const fullPath = path_1.default.resolve(this.projectRoot, filePath);
|
|
195
|
+
// Ensure directory exists
|
|
196
|
+
const dir = path_1.default.dirname(fullPath);
|
|
197
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
198
|
+
await promises_1.default.writeFile(fullPath, content, 'utf-8');
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if file exists
|
|
202
|
+
*/
|
|
203
|
+
async fileExists(filePath) {
|
|
204
|
+
try {
|
|
205
|
+
const fullPath = path_1.default.resolve(this.projectRoot, filePath);
|
|
206
|
+
await promises_1.default.access(fullPath);
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Preview changes from a Bob-Shell prompt by actually applying them,
|
|
215
|
+
* then generating a git diff. Changes can be reverted if user rejects.
|
|
216
|
+
* Uses `bob --yolo` to auto-approve changes, then git diff to show them.
|
|
217
|
+
*/
|
|
218
|
+
async previewPrompt(prompt) {
|
|
219
|
+
try {
|
|
220
|
+
// SECURITY: Validate prompt length
|
|
221
|
+
if (prompt.length > 10000) {
|
|
222
|
+
throw new Error('Prompt exceeds maximum length of 10000 characters');
|
|
223
|
+
}
|
|
224
|
+
// SECURITY: Sanitize prompt
|
|
225
|
+
const sanitizedPrompt = prompt.replace(/[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]/g, '');
|
|
226
|
+
console.log('👁️ Previewing Bob-Shell prompt (applying changes with --yolo)');
|
|
227
|
+
// Build command with --yolo to auto-approve changes
|
|
228
|
+
const args = [this.bobShellPath];
|
|
229
|
+
if (this.licenseAccepted) {
|
|
230
|
+
args.push('--accept-license');
|
|
231
|
+
}
|
|
232
|
+
// Use --yolo to auto-approve all changes
|
|
233
|
+
args.push('--yolo', '-p', sanitizedPrompt);
|
|
234
|
+
const env = this.buildEnvironment();
|
|
235
|
+
const { spawn } = require('child_process');
|
|
236
|
+
const [command, ...commandArgs] = args;
|
|
237
|
+
return new Promise((resolve) => {
|
|
238
|
+
const process = spawn(command, commandArgs, {
|
|
239
|
+
cwd: this.projectRoot,
|
|
240
|
+
env,
|
|
241
|
+
shell: false,
|
|
242
|
+
timeout: 300000, // 5 minutes
|
|
243
|
+
});
|
|
244
|
+
let stdout = '';
|
|
245
|
+
let stderr = '';
|
|
246
|
+
process.stdout.on('data', (data) => {
|
|
247
|
+
stdout += data.toString();
|
|
248
|
+
});
|
|
249
|
+
process.stderr.on('data', (data) => {
|
|
250
|
+
stderr += data.toString();
|
|
251
|
+
});
|
|
252
|
+
process.on('close', async (code) => {
|
|
253
|
+
if (code === 0) {
|
|
254
|
+
console.log('✅ Bob-Shell preview completed');
|
|
255
|
+
// Parse modified files from output
|
|
256
|
+
const filesModified = this.parseModifiedFiles(stdout);
|
|
257
|
+
// Generate git-style diffs for modified files ONLY
|
|
258
|
+
let gitDiff = '';
|
|
259
|
+
if (filesModified.length > 0) {
|
|
260
|
+
try {
|
|
261
|
+
gitDiff = await this.generateGitDiffs(filesModified);
|
|
262
|
+
console.log(`📊 Generated git diff for ${filesModified.length} file(s)`);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
console.error('Failed to generate git diffs:', error);
|
|
266
|
+
gitDiff = 'Error: Could not generate git diff. Files may not be tracked by git.';
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
gitDiff = 'No files were modified in this preview.';
|
|
271
|
+
}
|
|
272
|
+
// Generate unique preview ID
|
|
273
|
+
const previewId = `preview_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
274
|
+
// Cache the original output and modified files for later application/revert
|
|
275
|
+
this.previewCache.set(previewId, {
|
|
276
|
+
diff: stdout, // Store full output for application
|
|
277
|
+
timestamp: Date.now(),
|
|
278
|
+
filesModified
|
|
279
|
+
});
|
|
280
|
+
// Clean up old previews (older than 1 hour)
|
|
281
|
+
this.cleanupOldPreviews();
|
|
282
|
+
resolve({
|
|
283
|
+
success: true,
|
|
284
|
+
diff: gitDiff, // ONLY return git diff, no Bob-Shell output
|
|
285
|
+
filesModified,
|
|
286
|
+
previewId,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
console.error('❌ Bob-Shell preview failed with code:', code);
|
|
291
|
+
resolve({
|
|
292
|
+
success: false,
|
|
293
|
+
error: stderr || `Preview failed with code ${code}`,
|
|
294
|
+
filesModified: [],
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
process.on('error', (error) => {
|
|
299
|
+
console.error('❌ Bob-Shell preview error:', error.message);
|
|
300
|
+
resolve({
|
|
301
|
+
success: false,
|
|
302
|
+
error: 'Failed to execute Bob-Shell preview',
|
|
303
|
+
filesModified: [],
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
console.error('❌ Bob-Shell preview failed:', error.message);
|
|
310
|
+
return {
|
|
311
|
+
success: false,
|
|
312
|
+
output: '',
|
|
313
|
+
error: error.message || 'Failed to preview prompt',
|
|
314
|
+
filesModified: [],
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Accept preview changes (they're already applied, just clean up cache)
|
|
320
|
+
*/
|
|
321
|
+
async applyPreviewedDiff(previewId, diff) {
|
|
322
|
+
try {
|
|
323
|
+
console.log('✅ Accepting previewed changes:', previewId);
|
|
324
|
+
// Verify preview exists in cache
|
|
325
|
+
const cached = this.previewCache.get(previewId);
|
|
326
|
+
if (!cached) {
|
|
327
|
+
throw new Error('Preview not found or expired. Please generate a new preview.');
|
|
328
|
+
}
|
|
329
|
+
// Changes are already applied by bob --yolo, just clean up cache
|
|
330
|
+
this.previewCache.delete(previewId);
|
|
331
|
+
return {
|
|
332
|
+
success: true,
|
|
333
|
+
output: 'Preview changes accepted and kept',
|
|
334
|
+
filesModified: cached.filesModified || [],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
console.error('❌ Failed to accept preview:', error.message);
|
|
339
|
+
return {
|
|
340
|
+
success: false,
|
|
341
|
+
output: '',
|
|
342
|
+
error: error.message || 'Failed to accept preview',
|
|
343
|
+
filesModified: [],
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Reject preview changes by reverting them using git
|
|
349
|
+
*/
|
|
350
|
+
async rejectPreview(previewId) {
|
|
351
|
+
try {
|
|
352
|
+
console.log('❌ Rejecting previewed changes:', previewId);
|
|
353
|
+
// Verify preview exists in cache
|
|
354
|
+
const cached = this.previewCache.get(previewId);
|
|
355
|
+
if (!cached) {
|
|
356
|
+
throw new Error('Preview not found or expired.');
|
|
357
|
+
}
|
|
358
|
+
const filesModified = cached.filesModified || [];
|
|
359
|
+
if (filesModified.length === 0) {
|
|
360
|
+
this.previewCache.delete(previewId);
|
|
361
|
+
return {
|
|
362
|
+
success: true,
|
|
363
|
+
output: 'No files to revert',
|
|
364
|
+
filesModified: [],
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
// Revert each modified file using git checkout
|
|
368
|
+
console.log(`🔄 Reverting ${filesModified.length} file(s)...`);
|
|
369
|
+
for (const file of filesModified) {
|
|
370
|
+
try {
|
|
371
|
+
await execAsync(`git checkout HEAD -- "${file}"`, {
|
|
372
|
+
cwd: this.projectRoot
|
|
373
|
+
});
|
|
374
|
+
console.log(` ✓ Reverted: ${file}`);
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
377
|
+
console.error(` ✗ Failed to revert ${file}:`, error.message);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// Clean up cache
|
|
381
|
+
this.previewCache.delete(previewId);
|
|
382
|
+
return {
|
|
383
|
+
success: true,
|
|
384
|
+
output: `Reverted ${filesModified.length} file(s)`,
|
|
385
|
+
filesModified,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
console.error('❌ Failed to reject preview:', error.message);
|
|
390
|
+
return {
|
|
391
|
+
success: false,
|
|
392
|
+
output: '',
|
|
393
|
+
error: error.message || 'Failed to reject preview',
|
|
394
|
+
filesModified: [],
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Generate git-style diffs for modified files
|
|
400
|
+
*/
|
|
401
|
+
async generateGitDiffs(files) {
|
|
402
|
+
if (files.length === 0) {
|
|
403
|
+
return '';
|
|
404
|
+
}
|
|
405
|
+
const { exec } = require('child_process');
|
|
406
|
+
const { promisify } = require('util');
|
|
407
|
+
const execAsync = promisify(exec);
|
|
408
|
+
let combinedDiff = '';
|
|
409
|
+
for (const file of files) {
|
|
410
|
+
try {
|
|
411
|
+
// Get git diff for the file (shows unstaged changes)
|
|
412
|
+
const { stdout } = await execAsync(`git diff HEAD -- "${file}"`, {
|
|
413
|
+
cwd: this.projectRoot,
|
|
414
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
415
|
+
});
|
|
416
|
+
if (stdout) {
|
|
417
|
+
combinedDiff += stdout + '\n';
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
console.error(`Failed to get git diff for ${file}:`, error.message);
|
|
422
|
+
// Continue with other files
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return combinedDiff;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Extract diff content from Bob-Shell output
|
|
429
|
+
*/
|
|
430
|
+
extractDiffFromOutput(output) {
|
|
431
|
+
// Strategy 1: Look for explicit diff blocks in markdown format
|
|
432
|
+
const diffPattern = /```diff\n([\s\S]*?)\n```/g;
|
|
433
|
+
const diffMatches = [...output.matchAll(diffPattern)];
|
|
434
|
+
if (diffMatches.length > 0) {
|
|
435
|
+
return diffMatches.map(m => m[1]).join('\n\n');
|
|
436
|
+
}
|
|
437
|
+
// Strategy 2: Extract from tool usage (write_to_file, apply_diff, etc.)
|
|
438
|
+
const toolUsagePattern = /<(write_to_file|apply_diff|insert_content)>([\s\S]*?)<\/\1>/g;
|
|
439
|
+
const toolMatches = [...output.matchAll(toolUsagePattern)];
|
|
440
|
+
if (toolMatches.length > 0) {
|
|
441
|
+
let extractedDiff = '';
|
|
442
|
+
for (const match of toolMatches) {
|
|
443
|
+
const toolName = match[1];
|
|
444
|
+
const toolContent = match[2];
|
|
445
|
+
// Extract file path
|
|
446
|
+
const pathMatch = toolContent.match(/<path>(.*?)<\/path>/);
|
|
447
|
+
const path = pathMatch ? pathMatch[1] : 'unknown';
|
|
448
|
+
// Extract content
|
|
449
|
+
const contentMatch = toolContent.match(/<content>([\s\S]*?)<\/content>/);
|
|
450
|
+
const content = contentMatch ? contentMatch[1] : '';
|
|
451
|
+
// Extract diff for apply_diff
|
|
452
|
+
const diffMatch = toolContent.match(/<diff>([\s\S]*?)<\/diff>/);
|
|
453
|
+
const diff = diffMatch ? diffMatch[1] : '';
|
|
454
|
+
if (toolName === 'apply_diff' && diff) {
|
|
455
|
+
extractedDiff += `\n=== ${path} ===\n${diff}\n`;
|
|
456
|
+
}
|
|
457
|
+
else if (toolName === 'write_to_file' && content) {
|
|
458
|
+
extractedDiff += `\n=== ${path} (new/rewrite) ===\n${content}\n`;
|
|
459
|
+
}
|
|
460
|
+
else if (toolName === 'insert_content' && content) {
|
|
461
|
+
const lineMatch = toolContent.match(/<line>(\d+)<\/line>/);
|
|
462
|
+
const line = lineMatch ? lineMatch[1] : '?';
|
|
463
|
+
extractedDiff += `\n=== ${path} (insert at line ${line}) ===\n${content}\n`;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (extractedDiff) {
|
|
467
|
+
return extractedDiff;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// Strategy 3: Look for file modification indicators in output
|
|
471
|
+
const fileModPattern = /(?:Modified|Created|Updated):\s*([^\n]+)/gi;
|
|
472
|
+
const fileMatches = [...output.matchAll(fileModPattern)];
|
|
473
|
+
if (fileMatches.length > 0) {
|
|
474
|
+
let summary = '=== Files to be modified ===\n\n';
|
|
475
|
+
fileMatches.forEach(m => {
|
|
476
|
+
summary += `• ${m[1]}\n`;
|
|
477
|
+
});
|
|
478
|
+
summary += '\n' + output;
|
|
479
|
+
return summary;
|
|
480
|
+
}
|
|
481
|
+
// Fallback: Return full output with a note
|
|
482
|
+
return '=== Preview Output ===\n\nNote: Could not extract structured diff. Showing full Bob-Shell output:\n\n' + output;
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Apply diff to actual files
|
|
486
|
+
*/
|
|
487
|
+
async applyDiffToFiles(diff) {
|
|
488
|
+
const filesModified = [];
|
|
489
|
+
// Parse diff format and apply changes
|
|
490
|
+
// This is a simplified implementation - in production, use a proper diff parser
|
|
491
|
+
const fileBlocks = diff.split(/^diff --git /m).filter(b => b.trim());
|
|
492
|
+
for (const block of fileBlocks) {
|
|
493
|
+
try {
|
|
494
|
+
// Extract file path from diff header
|
|
495
|
+
const pathMatch = block.match(/^a\/(.+?) b\/(.+?)$/m);
|
|
496
|
+
if (!pathMatch)
|
|
497
|
+
continue;
|
|
498
|
+
const filePath = pathMatch[2];
|
|
499
|
+
const fullPath = path_1.default.resolve(this.projectRoot, filePath);
|
|
500
|
+
// Read current file content
|
|
501
|
+
let currentContent = '';
|
|
502
|
+
try {
|
|
503
|
+
currentContent = await promises_1.default.readFile(fullPath, 'utf-8');
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
// File doesn't exist, will be created
|
|
507
|
+
}
|
|
508
|
+
// Apply diff (simplified - in production use a proper diff library)
|
|
509
|
+
// For now, just track that the file was modified
|
|
510
|
+
filesModified.push(filePath);
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
console.error('Error applying diff to file:', error);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return filesModified;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Clean up old preview cache entries (older than 1 hour)
|
|
520
|
+
*/
|
|
521
|
+
cleanupOldPreviews() {
|
|
522
|
+
const oneHourAgo = Date.now() - (60 * 60 * 1000);
|
|
523
|
+
for (const [previewId, cached] of this.previewCache.entries()) {
|
|
524
|
+
if (cached.timestamp < oneHourAgo) {
|
|
525
|
+
this.previewCache.delete(previewId);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
exports.BobShellService = BobShellService;
|
|
531
|
+
// Singleton instance
|
|
532
|
+
exports.bobShellService = new BobShellService();
|
|
533
|
+
// Made with Bob
|
|
534
|
+
//# sourceMappingURL=bobShellService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bobShellService.js","sourceRoot":"","sources":["../../src/services/bobShellService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export interface QualityReport {
|
|
2
|
+
file: string;
|
|
3
|
+
score: number;
|
|
4
|
+
issues: Issue[];
|
|
5
|
+
metrics: QualityMetrics;
|
|
6
|
+
suggestions: Improvement[];
|
|
7
|
+
}
|
|
8
|
+
export interface Issue {
|
|
9
|
+
type: 'error' | 'warning' | 'info';
|
|
10
|
+
rule: string;
|
|
11
|
+
message: string;
|
|
12
|
+
line: number;
|
|
13
|
+
column: number;
|
|
14
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
15
|
+
fixable: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface QualityMetrics {
|
|
18
|
+
complexity: number;
|
|
19
|
+
maintainability: number;
|
|
20
|
+
testCoverage: number;
|
|
21
|
+
linesOfCode: number;
|
|
22
|
+
commentRatio: number;
|
|
23
|
+
}
|
|
24
|
+
export interface Improvement {
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
impact: 'high' | 'medium' | 'low';
|
|
28
|
+
effort: 'high' | 'medium' | 'low';
|
|
29
|
+
category: 'performance' | 'security' | 'maintainability' | 'style';
|
|
30
|
+
}
|
|
31
|
+
export interface LintResults {
|
|
32
|
+
success: boolean;
|
|
33
|
+
errorCount: number;
|
|
34
|
+
warningCount: number;
|
|
35
|
+
fixableErrorCount: number;
|
|
36
|
+
fixableWarningCount: number;
|
|
37
|
+
files: LintFileResult[];
|
|
38
|
+
}
|
|
39
|
+
export interface LintFileResult {
|
|
40
|
+
filePath: string;
|
|
41
|
+
messages: Issue[];
|
|
42
|
+
errorCount: number;
|
|
43
|
+
warningCount: number;
|
|
44
|
+
}
|
|
45
|
+
export interface TypeScriptError {
|
|
46
|
+
file: string;
|
|
47
|
+
line: number;
|
|
48
|
+
column: number;
|
|
49
|
+
message: string;
|
|
50
|
+
code: number;
|
|
51
|
+
}
|
|
52
|
+
export interface FixResult {
|
|
53
|
+
success: boolean;
|
|
54
|
+
filesFixed: string[];
|
|
55
|
+
issuesFixed: number;
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
export declare class CodeQualityService {
|
|
59
|
+
private projectRoot;
|
|
60
|
+
private hasESLint;
|
|
61
|
+
private hasTypeScript;
|
|
62
|
+
constructor(projectRoot: string);
|
|
63
|
+
/**
|
|
64
|
+
* Initialize and detect available tools
|
|
65
|
+
*/
|
|
66
|
+
initialize(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Analyze a file for code quality
|
|
69
|
+
*/
|
|
70
|
+
analyzeFile(filePath: string): Promise<QualityReport>;
|
|
71
|
+
/**
|
|
72
|
+
* Run ESLint on the project
|
|
73
|
+
*/
|
|
74
|
+
runLinter(pattern?: string): Promise<LintResults>;
|
|
75
|
+
/**
|
|
76
|
+
* Check TypeScript errors
|
|
77
|
+
*/
|
|
78
|
+
checkTypeScript(): Promise<TypeScriptError[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Suggest improvements for code
|
|
81
|
+
*/
|
|
82
|
+
suggestImprovements(code: string): Promise<Improvement[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Auto-fix issues
|
|
85
|
+
*/
|
|
86
|
+
autoFix(issues: Issue[]): Promise<FixResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Private helper methods
|
|
89
|
+
*/
|
|
90
|
+
private collectIssues;
|
|
91
|
+
private calculateMetrics;
|
|
92
|
+
private calculateComplexity;
|
|
93
|
+
private generateImprovements;
|
|
94
|
+
private calculateScore;
|
|
95
|
+
private parseESLintOutput;
|
|
96
|
+
private parseTypeScriptErrors;
|
|
97
|
+
private fileExists;
|
|
98
|
+
private hasLongFunctions;
|
|
99
|
+
private hasDuplicateCode;
|
|
100
|
+
private hasHardcodedValues;
|
|
101
|
+
private hasPoorErrorHandling;
|
|
102
|
+
private hasPerformanceIssues;
|
|
103
|
+
}
|
|
104
|
+
export declare const codeQualityService: CodeQualityService;
|
|
105
|
+
//# sourceMappingURL=codeQualityService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeQualityService.d.ts","sourceRoot":"","sources":["../../src/services/codeQualityService.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,aAAa,GAAG,UAAU,GAAG,iBAAiB,GAAG,OAAO,CAAC;CACpE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAqB3D;;OAEG;IACG,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAsBnD;;OAEG;IACG,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAyD/D;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAuClD;;OAEG;YACW,aAAa;IAuC3B,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,oBAAoB;IAuC5B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,iBAAiB;IAqDzB,OAAO,CAAC,qBAAqB;YAoBf,UAAU;IAUxB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,oBAAoB;CAM7B;AAGD,eAAO,MAAM,kBAAkB,oBAE9B,CAAC"}
|