bobs-workshop 0.3.3 ā 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +199 -210
- package/bin/bobs-workshop.js +109 -0
- package/config/agents.json +27 -0
- package/dist/plugins/bobs-workshop.js +34 -0
- package/dist/tools/background-agent/cancel.d.ts +3 -0
- package/dist/tools/background-agent/cancel.d.ts.map +1 -0
- package/dist/tools/background-agent/cancel.js +52 -0
- package/dist/tools/background-agent/concurrency.d.ts +15 -0
- package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
- package/dist/tools/background-agent/concurrency.js +61 -0
- package/dist/tools/background-agent/index.d.ts +8 -0
- package/dist/tools/background-agent/index.d.ts.map +1 -0
- package/dist/tools/background-agent/index.js +7 -0
- package/dist/tools/background-agent/launch.d.ts +6 -0
- package/dist/tools/background-agent/launch.d.ts.map +1 -0
- package/dist/tools/background-agent/launch.js +33 -0
- package/dist/tools/background-agent/list.d.ts +7 -0
- package/dist/tools/background-agent/list.d.ts.map +1 -0
- package/dist/tools/background-agent/list.js +40 -0
- package/dist/tools/background-agent/manager.d.ts +29 -0
- package/dist/tools/background-agent/manager.d.ts.map +1 -0
- package/dist/tools/background-agent/manager.js +377 -0
- package/dist/tools/background-agent/output.d.ts +3 -0
- package/dist/tools/background-agent/output.d.ts.map +1 -0
- package/dist/tools/background-agent/output.js +41 -0
- package/dist/tools/background-agent/types.d.ts +46 -0
- package/dist/tools/background-agent/types.d.ts.map +1 -0
- package/dist/tools/background-agent/types.js +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/manual/index.d.ts +3 -0
- package/dist/tools/manual/index.d.ts.map +1 -0
- package/dist/tools/manual/index.js +2 -0
- package/dist/tools/manual/manual-update.d.ts +4 -0
- package/dist/tools/manual/manual-update.d.ts.map +1 -0
- package/dist/tools/manual/manual-update.js +190 -0
- package/dist/tools/manual/verify-manual.d.ts +4 -0
- package/dist/tools/manual/verify-manual.d.ts.map +1 -0
- package/dist/tools/manual/verify-manual.js +46 -0
- package/package.json +34 -66
- package/postinstall.js +190 -0
- package/src/agents/alice.md +466 -0
- package/src/agents/bob-rev.md +493 -0
- package/src/agents/bob-send.md +277 -0
- package/src/agents/bob.md +442 -0
- package/src/agents/trace.md +451 -0
- package/src/plugins/bobs-workshop.ts +45 -0
- package/src/skills/api-patterns/SKILL.md +376 -0
- package/src/skills/architecture/SKILL.md +271 -0
- package/src/skills/bobs-workshop/performance/icon.svg +3 -0
- package/src/skills/brainstorming/SKILL.md +210 -0
- package/src/skills/clean-code/SKILL.md +151 -0
- package/src/skills/code-review-checklist/SKILL.md +220 -0
- package/src/skills/database-design/SKILL.md +271 -0
- package/src/skills/exploration/SKILL.md +257 -0
- package/src/skills/frontend-ui-ux/SKILL.md +78 -0
- package/src/skills/git-master/SKILL.md +1105 -0
- package/src/skills/performance/SKILL.md +144 -0
- package/src/skills/performance/icon.svg +3 -0
- package/src/skills/plan-writing/SKILL.md +225 -0
- package/src/skills/security/SKILL.md +410 -0
- package/src/skills/simplification/SKILL.md +238 -0
- package/src/skills/systematic-debugging/SKILL.md +175 -0
- package/src/skills/testing-patterns/SKILL.md +305 -0
- package/src/skills/verification/SKILL.md +286 -0
- package/src/tools/background-agent/cancel.ts +67 -0
- package/src/tools/background-agent/concurrency.ts +71 -0
- package/src/tools/background-agent/index.ts +7 -0
- package/src/tools/background-agent/launch.ts +39 -0
- package/src/tools/background-agent/list.ts +50 -0
- package/src/tools/background-agent/manager.ts +455 -0
- package/src/tools/background-agent/output.ts +57 -0
- package/src/tools/background-agent/types.ts +55 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/manual/index.ts +2 -0
- package/src/tools/manual/manual-update.ts +197 -0
- package/src/tools/manual/verify-manual.ts +55 -0
- package/uninstall.js +64 -0
- package/Claude.md +0 -162
- package/bin/bobs-mcp-server.js +0 -11
- package/bin/bobs-mcp.js +0 -130
- package/dist/api/taskLogger.js +0 -106
- package/dist/api/taskLogger.js.map +0 -1
- package/dist/cli/checker.js +0 -401
- package/dist/cli/checker.js.map +0 -1
- package/dist/cli/cleanup.js +0 -131
- package/dist/cli/cleanup.js.map +0 -1
- package/dist/cli/debug.js +0 -157
- package/dist/cli/debug.js.map +0 -1
- package/dist/cli/health.js +0 -97
- package/dist/cli/health.js.map +0 -1
- package/dist/cli/setup.js +0 -81
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/workshop.js +0 -42
- package/dist/cli/workshop.js.map +0 -1
- package/dist/dashboard/server.js +0 -1203
- package/dist/dashboard/server.js.map +0 -1
- package/dist/index.js +0 -960
- package/dist/index.js.map +0 -1
- package/dist/prompts/architect.js +0 -221
- package/dist/prompts/architect.js.map +0 -1
- package/dist/prompts/debugger.js +0 -257
- package/dist/prompts/debugger.js.map +0 -1
- package/dist/prompts/engineer.js +0 -249
- package/dist/prompts/engineer.js.map +0 -1
- package/dist/prompts/orchestrator.js +0 -304
- package/dist/prompts/orchestrator.js.map +0 -1
- package/dist/prompts/reviewer.js +0 -289
- package/dist/prompts/reviewer.js.map +0 -1
- package/dist/services/activitySummarizer.js +0 -388
- package/dist/services/activitySummarizer.js.map +0 -1
- package/dist/services/changeValidator.js +0 -396
- package/dist/services/changeValidator.js.map +0 -1
- package/dist/services/claudeOrchestrator.js +0 -343
- package/dist/services/claudeOrchestrator.js.map +0 -1
- package/dist/services/fileMonitor.js +0 -250
- package/dist/services/fileMonitor.js.map +0 -1
- package/dist/services/implementationSummarizer.js +0 -306
- package/dist/services/implementationSummarizer.js.map +0 -1
- package/dist/services/liveMonitor.js +0 -315
- package/dist/services/liveMonitor.js.map +0 -1
- package/dist/services/mcpAuditLogger.js +0 -104
- package/dist/services/mcpAuditLogger.js.map +0 -1
- package/dist/services/mcpLogger.js +0 -223
- package/dist/services/mcpLogger.js.map +0 -1
- package/dist/services/tmuxManager.js +0 -541
- package/dist/services/tmuxManager.js.map +0 -1
- package/dist/tools/approvalTools.js +0 -244
- package/dist/tools/approvalTools.js.map +0 -1
- package/dist/tools/autoDebugger.js +0 -147
- package/dist/tools/autoDebugger.js.map +0 -1
- package/dist/tools/cleanupService.js +0 -221
- package/dist/tools/cleanupService.js.map +0 -1
- package/dist/tools/dashboardTools.js +0 -342
- package/dist/tools/dashboardTools.js.map +0 -1
- package/dist/tools/developmentNudges.js +0 -336
- package/dist/tools/developmentNudges.js.map +0 -1
- package/dist/tools/gitTools.js +0 -741
- package/dist/tools/gitTools.js.map +0 -1
- package/dist/tools/orchestratorTools.js +0 -832
- package/dist/tools/orchestratorTools.js.map +0 -1
- package/dist/tools/searchCache.js +0 -64
- package/dist/tools/searchCache.js.map +0 -1
- package/dist/tools/searchTools.js +0 -1107
- package/dist/tools/searchTools.js.map +0 -1
- package/dist/tools/semgrep-patterns.js +0 -296
- package/dist/tools/semgrep-patterns.js.map +0 -1
- package/dist/tools/specTools.js +0 -332
- package/dist/tools/specTools.js.map +0 -1
- package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
- package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
- package/dist/tools/structural/cache.js +0 -226
- package/dist/tools/structural/cache.js.map +0 -1
- package/dist/tools/structural/engines/python/index.js +0 -118
- package/dist/tools/structural/engines/python/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
- package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
- package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
- package/dist/tools/structural/engines/typescript/index.js +0 -381
- package/dist/tools/structural/engines/typescript/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/utils.js +0 -279
- package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
- package/dist/tools/structural/index.js +0 -248
- package/dist/tools/structural/index.js.map +0 -1
- package/dist/tools/structural/types.js +0 -18
- package/dist/tools/structural/types.js.map +0 -1
- package/dist/tools/tmuxTools.js +0 -100
- package/dist/tools/tmuxTools.js.map +0 -1
- package/dist/tools/workRecorder.js +0 -215
- package/dist/tools/workRecorder.js.map +0 -1
- package/dist/tools/worktreeTools.js +0 -705
- package/dist/tools/worktreeTools.js.map +0 -1
- package/dist/utils/__tests__/integration.test.js +0 -57
- package/dist/utils/__tests__/integration.test.js.map +0 -1
- package/dist/utils/__tests__/serverDetection.test.js +0 -151
- package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
- package/dist/utils/errorHandling.js +0 -336
- package/dist/utils/errorHandling.js.map +0 -1
- package/dist/utils/processManager.js +0 -172
- package/dist/utils/processManager.js.map +0 -1
- package/dist/utils/reliability.js +0 -263
- package/dist/utils/reliability.js.map +0 -1
- package/dist/utils/responseFormatter.js +0 -250
- package/dist/utils/responseFormatter.js.map +0 -1
- package/dist/utils/serverDetection.js +0 -133
- package/dist/utils/serverDetection.js.map +0 -1
- package/dist/utils/specMigration.js +0 -105
- package/dist/utils/specMigration.js.map +0 -1
- package/dist/validation/schemas.js +0 -299
- package/dist/validation/schemas.js.map +0 -1
- package/public/.well-known/mcp/manifest.json +0 -473
- package/public/index.html +0 -3157
- package/public/index.html.backup +0 -2805
- package/public/index.html.backup2 +0 -1292
- package/scripts/cleanup-system-logs.ts +0 -121
- package/scripts/init-workspace.js +0 -63
- package/scripts/install-search-tools.js +0 -116
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
/**
|
|
3
|
-
* Cleanup Script: Remove Empty System Activity Logs
|
|
4
|
-
*
|
|
5
|
-
* This script scans all SPEC files and removes "System activity logged" entries
|
|
6
|
-
* from the enhanced_activities array. These are noise logs created by
|
|
7
|
-
* bob.dashboard.update calls without meaningful summaries.
|
|
8
|
-
*
|
|
9
|
-
* Usage: npm run cleanup:system-logs
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import fs from 'fs-extra';
|
|
13
|
-
import path from 'path';
|
|
14
|
-
|
|
15
|
-
interface EnhancedActivity {
|
|
16
|
-
id: string;
|
|
17
|
-
timestamp: string;
|
|
18
|
-
role: string;
|
|
19
|
-
type: string;
|
|
20
|
-
summary: string;
|
|
21
|
-
files_changed?: any[];
|
|
22
|
-
[key: string]: any;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface SpecData {
|
|
26
|
-
spec_id: string;
|
|
27
|
-
enhanced_activities?: EnhancedActivity[];
|
|
28
|
-
[key: string]: any;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async function cleanupSystemLogs() {
|
|
32
|
-
console.log('š§¹ Starting cleanup of empty system activity logs...\n');
|
|
33
|
-
|
|
34
|
-
const specsDir = path.resolve(process.cwd(), '.bob/specs');
|
|
35
|
-
|
|
36
|
-
// Check if specs directory exists
|
|
37
|
-
if (!await fs.pathExists(specsDir)) {
|
|
38
|
-
console.error(`ā Specs directory not found: ${specsDir}`);
|
|
39
|
-
process.exit(1);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const allFiles = await fs.readdir(specsDir);
|
|
43
|
-
const specFiles = allFiles
|
|
44
|
-
.filter(file => file.startsWith('SPEC-') && file.endsWith('.json'))
|
|
45
|
-
.map(file => path.join(specsDir, file));
|
|
46
|
-
|
|
47
|
-
if (specFiles.length === 0) {
|
|
48
|
-
console.log('ā¹ļø No SPEC files found.');
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
console.log(`š Found ${specFiles.length} SPEC files to process\n`);
|
|
53
|
-
|
|
54
|
-
let totalRemoved = 0;
|
|
55
|
-
let filesModified = 0;
|
|
56
|
-
|
|
57
|
-
for (const specFile of specFiles) {
|
|
58
|
-
try {
|
|
59
|
-
const specData: SpecData = await fs.readJson(specFile);
|
|
60
|
-
|
|
61
|
-
if (!specData.enhanced_activities || specData.enhanced_activities.length === 0) {
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const originalLength = specData.enhanced_activities.length;
|
|
66
|
-
|
|
67
|
-
// Filter out empty system logs
|
|
68
|
-
specData.enhanced_activities = specData.enhanced_activities.filter((activity: EnhancedActivity) => {
|
|
69
|
-
// Keep activity if ANY of these conditions are true:
|
|
70
|
-
// 1. Role is NOT system
|
|
71
|
-
// 2. Has a meaningful summary (not "System activity logged" and not empty)
|
|
72
|
-
// 3. Has file changes
|
|
73
|
-
const keepActivity = !(
|
|
74
|
-
activity.role === 'system' &&
|
|
75
|
-
(activity.summary === 'System activity logged' || !activity.summary || activity.summary.trim() === '') &&
|
|
76
|
-
(!activity.files_changed || activity.files_changed.length === 0)
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
return keepActivity;
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
const removed = originalLength - specData.enhanced_activities.length;
|
|
83
|
-
|
|
84
|
-
if (removed > 0) {
|
|
85
|
-
// Update timestamp
|
|
86
|
-
specData.updated_at = new Date().toISOString();
|
|
87
|
-
|
|
88
|
-
// Write back to file
|
|
89
|
-
await fs.writeJson(specFile, specData, { spaces: 2 });
|
|
90
|
-
|
|
91
|
-
totalRemoved += removed;
|
|
92
|
-
filesModified++;
|
|
93
|
-
|
|
94
|
-
const fileName = path.basename(specFile);
|
|
95
|
-
console.log(`ā ${fileName}: Removed ${removed} empty system log${removed > 1 ? 's' : ''}`);
|
|
96
|
-
}
|
|
97
|
-
} catch (error) {
|
|
98
|
-
console.error(`ā Error processing ${path.basename(specFile)}:`, error);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
console.log('\n' + '='.repeat(60));
|
|
103
|
-
console.log('ā
Cleanup complete!');
|
|
104
|
-
console.log('='.repeat(60));
|
|
105
|
-
console.log(`š Files modified: ${filesModified}`);
|
|
106
|
-
console.log(`šļø Empty system logs removed: ${totalRemoved}`);
|
|
107
|
-
console.log(`š Files unchanged: ${specFiles.length - filesModified}`);
|
|
108
|
-
console.log('='.repeat(60) + '\n');
|
|
109
|
-
|
|
110
|
-
if (totalRemoved === 0) {
|
|
111
|
-
console.log('š No empty system logs found - your SPEC files are already clean!');
|
|
112
|
-
} else {
|
|
113
|
-
console.log('š Dashboard activity timeline should now be cleaner!');
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Run the cleanup
|
|
118
|
-
cleanupSystemLogs().catch((error) => {
|
|
119
|
-
console.error('ā Fatal error during cleanup:', error);
|
|
120
|
-
process.exit(1);
|
|
121
|
-
});
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { dirname, join } from 'path';
|
|
5
|
-
import fs from 'fs-extra';
|
|
6
|
-
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = dirname(__filename);
|
|
9
|
-
|
|
10
|
-
async function initializeWorkspace() {
|
|
11
|
-
console.log('š§ Initializing Bob\'s Workshop workspace...');
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const projectRoot = join(__dirname, '..');
|
|
15
|
-
const bobDir = join(projectRoot, '.bob');
|
|
16
|
-
const specsDir = join(bobDir, 'specs');
|
|
17
|
-
const manualsDir = join(bobDir, 'manuals');
|
|
18
|
-
const worktreesDir = join(bobDir, 'worktrees');
|
|
19
|
-
const indexFile = join(specsDir, 'index.json');
|
|
20
|
-
|
|
21
|
-
// Create all necessary directories
|
|
22
|
-
await fs.ensureDir(specsDir);
|
|
23
|
-
await fs.ensureDir(manualsDir);
|
|
24
|
-
await fs.ensureDir(worktreesDir);
|
|
25
|
-
|
|
26
|
-
// Create specs index if it doesn't exist (preserve existing data)
|
|
27
|
-
if (!await fs.pathExists(indexFile)) {
|
|
28
|
-
await fs.writeJson(indexFile, {
|
|
29
|
-
specs: [],
|
|
30
|
-
created_at: new Date().toISOString(),
|
|
31
|
-
version: "1.0"
|
|
32
|
-
}, { spaces: 2 });
|
|
33
|
-
console.log('š Created new specs index');
|
|
34
|
-
} else {
|
|
35
|
-
console.log('š Existing specs index preserved');
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Create .gitkeep files to ensure directories are preserved in git
|
|
39
|
-
const gitkeepFiles = [
|
|
40
|
-
join(manualsDir, '.gitkeep'),
|
|
41
|
-
join(worktreesDir, '.gitkeep')
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
for (const gitkeepFile of gitkeepFiles) {
|
|
45
|
-
if (!await fs.pathExists(gitkeepFile)) {
|
|
46
|
-
await fs.writeFile(gitkeepFile, '# This file ensures the directory is preserved in git\n');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
console.log('ā
Bob\'s Workshop workspace initialized');
|
|
51
|
-
console.log('');
|
|
52
|
-
console.log('š Ready to use! Try:');
|
|
53
|
-
console.log(' bobs workshop # Launch dashboard');
|
|
54
|
-
console.log(' bobs --help # See all commands');
|
|
55
|
-
console.log('');
|
|
56
|
-
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error('ā ļø Workspace initialization failed:', error.message);
|
|
59
|
-
console.log('š” This won\'t prevent Bob\'s Workshop from working');
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
initializeWorkspace();
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { exec } from 'child_process';
|
|
4
|
-
import { promisify } from 'util';
|
|
5
|
-
import { existsSync } from 'fs';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import { fileURLToPath } from 'url';
|
|
8
|
-
|
|
9
|
-
const execAsync = promisify(exec);
|
|
10
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
|
|
12
|
-
console.log('š§ Setting up Bob\'s MCP search tools...\n');
|
|
13
|
-
|
|
14
|
-
async function checkCommand(command, name) {
|
|
15
|
-
try {
|
|
16
|
-
await execAsync(`${command} --version`);
|
|
17
|
-
console.log(`ā
${name} is already installed`);
|
|
18
|
-
return true;
|
|
19
|
-
} catch (error) {
|
|
20
|
-
console.log(`ā ${name} not found`);
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async function installSemgrep() {
|
|
26
|
-
console.log('š¦ Installing semgrep...');
|
|
27
|
-
|
|
28
|
-
// Try different installation methods
|
|
29
|
-
const methods = [
|
|
30
|
-
{
|
|
31
|
-
cmd: 'brew install semgrep',
|
|
32
|
-
name: 'Homebrew',
|
|
33
|
-
check: () => execAsync('which brew')
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
cmd: 'pip3 install semgrep',
|
|
37
|
-
name: 'pip3',
|
|
38
|
-
check: () => execAsync('which pip3')
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
cmd: 'python3 -m pip install semgrep',
|
|
42
|
-
name: 'Python pip',
|
|
43
|
-
check: () => execAsync('which python3')
|
|
44
|
-
}
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
for (const method of methods) {
|
|
48
|
-
try {
|
|
49
|
-
await method.check();
|
|
50
|
-
console.log(`š¦ Trying to install semgrep via ${method.name}...`);
|
|
51
|
-
await execAsync(method.cmd);
|
|
52
|
-
|
|
53
|
-
// Verify installation
|
|
54
|
-
if (await checkCommand('semgrep', 'semgrep')) {
|
|
55
|
-
console.log(`ā
Successfully installed semgrep via ${method.name}`);
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
} catch (error) {
|
|
59
|
-
console.log(`ā ļø ${method.name} installation failed or not available`);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
console.log(`ā ļø Could not automatically install semgrep. Please install manually:
|
|
65
|
-
⢠macOS: brew install semgrep
|
|
66
|
-
⢠Linux/other: pip3 install semgrep
|
|
67
|
-
⢠Or visit: https://semgrep.dev/docs/getting-started/`);
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async function checkRipgrep() {
|
|
72
|
-
console.log('š¦ Checking ripgrep...');
|
|
73
|
-
|
|
74
|
-
// Check if the npm package is available
|
|
75
|
-
const ripgrepPkgPath = path.resolve(__dirname, '../node_modules/@vscode/ripgrep');
|
|
76
|
-
if (existsSync(ripgrepPkgPath)) {
|
|
77
|
-
console.log('ā
Ripgrep installed via npm package (@vscode/ripgrep)');
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Check if ripgrep is available in system PATH
|
|
82
|
-
if (await checkCommand('rg', 'ripgrep')) {
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
console.log(`ā ļø Ripgrep not found. This is usually provided by Claude Code.
|
|
87
|
-
If you need to install it manually:
|
|
88
|
-
⢠macOS: brew install ripgrep
|
|
89
|
-
⢠Linux: apt install ripgrep / yum install ripgrep
|
|
90
|
-
⢠Or visit: https://github.com/BurntSushi/ripgrep`);
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async function main() {
|
|
95
|
-
let semgrepOk = await checkCommand('semgrep', 'semgrep');
|
|
96
|
-
let ripgrepOk = await checkRipgrep();
|
|
97
|
-
|
|
98
|
-
if (!semgrepOk) {
|
|
99
|
-
semgrepOk = await installSemgrep();
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
console.log('\nš Setup Summary:');
|
|
103
|
-
console.log(` Semgrep: ${semgrepOk ? 'ā
Ready' : 'ā Not available'}`);
|
|
104
|
-
console.log(` Ripgrep: ${ripgrepOk ? 'ā
Ready' : 'ā Not available'}`);
|
|
105
|
-
|
|
106
|
-
if (semgrepOk && ripgrepOk) {
|
|
107
|
-
console.log('\nš All search tools are ready! Bob\'s MCP can now perform advanced code searches.');
|
|
108
|
-
} else {
|
|
109
|
-
console.log('\nā ļø Some search tools are missing. Bob\'s MCP will work with limited search functionality.');
|
|
110
|
-
console.log(' Run `npm run install-search-tools` again after installing missing tools.');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
console.log('\nš Run `npm run dev` or `npm start` to start Bob\'s MCP server.');
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
main().catch(console.error);
|