bobs-workshop 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/bin/bobs-mcp.js +130 -0
  4. package/dist/api/taskLogger.js +106 -0
  5. package/dist/api/taskLogger.js.map +1 -0
  6. package/dist/cli/checker.js +401 -0
  7. package/dist/cli/checker.js.map +1 -0
  8. package/dist/cli/cleanup.js +131 -0
  9. package/dist/cli/cleanup.js.map +1 -0
  10. package/dist/cli/debug.js +157 -0
  11. package/dist/cli/debug.js.map +1 -0
  12. package/dist/cli/health.js +97 -0
  13. package/dist/cli/health.js.map +1 -0
  14. package/dist/cli/setup.js +81 -0
  15. package/dist/cli/setup.js.map +1 -0
  16. package/dist/cli/workshop.js +42 -0
  17. package/dist/cli/workshop.js.map +1 -0
  18. package/dist/dashboard/server.js +1206 -0
  19. package/dist/dashboard/server.js.map +1 -0
  20. package/dist/index.js +757 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/prompts/architect.js +157 -0
  23. package/dist/prompts/architect.js.map +1 -0
  24. package/dist/prompts/debugger.js +201 -0
  25. package/dist/prompts/debugger.js.map +1 -0
  26. package/dist/prompts/engineer.js +171 -0
  27. package/dist/prompts/engineer.js.map +1 -0
  28. package/dist/prompts/orchestrator.js +225 -0
  29. package/dist/prompts/orchestrator.js.map +1 -0
  30. package/dist/prompts/reviewer.js +199 -0
  31. package/dist/prompts/reviewer.js.map +1 -0
  32. package/dist/services/activitySummarizer.js +353 -0
  33. package/dist/services/activitySummarizer.js.map +1 -0
  34. package/dist/services/changeValidator.js +396 -0
  35. package/dist/services/changeValidator.js.map +1 -0
  36. package/dist/services/claudeOrchestrator.js +343 -0
  37. package/dist/services/claudeOrchestrator.js.map +1 -0
  38. package/dist/services/fileMonitor.js +250 -0
  39. package/dist/services/fileMonitor.js.map +1 -0
  40. package/dist/services/implementationSummarizer.js +306 -0
  41. package/dist/services/implementationSummarizer.js.map +1 -0
  42. package/dist/services/liveMonitor.js +315 -0
  43. package/dist/services/liveMonitor.js.map +1 -0
  44. package/dist/services/mcpAuditLogger.js +104 -0
  45. package/dist/services/mcpAuditLogger.js.map +1 -0
  46. package/dist/services/mcpLogger.js +223 -0
  47. package/dist/services/mcpLogger.js.map +1 -0
  48. package/dist/services/tmuxManager.js +541 -0
  49. package/dist/services/tmuxManager.js.map +1 -0
  50. package/dist/tools/approvalTools.js +244 -0
  51. package/dist/tools/approvalTools.js.map +1 -0
  52. package/dist/tools/autoDebugger.js +147 -0
  53. package/dist/tools/autoDebugger.js.map +1 -0
  54. package/dist/tools/cleanupService.js +221 -0
  55. package/dist/tools/cleanupService.js.map +1 -0
  56. package/dist/tools/dashboardTools.js +359 -0
  57. package/dist/tools/dashboardTools.js.map +1 -0
  58. package/dist/tools/developmentNudges.js +336 -0
  59. package/dist/tools/developmentNudges.js.map +1 -0
  60. package/dist/tools/gitTools.js +741 -0
  61. package/dist/tools/gitTools.js.map +1 -0
  62. package/dist/tools/orchestratorTools.js +765 -0
  63. package/dist/tools/orchestratorTools.js.map +1 -0
  64. package/dist/tools/searchTools.js +788 -0
  65. package/dist/tools/searchTools.js.map +1 -0
  66. package/dist/tools/specTools.js +350 -0
  67. package/dist/tools/specTools.js.map +1 -0
  68. package/dist/tools/tmuxTools.js +100 -0
  69. package/dist/tools/tmuxTools.js.map +1 -0
  70. package/dist/tools/workRecorder.js +215 -0
  71. package/dist/tools/workRecorder.js.map +1 -0
  72. package/dist/tools/worktreeTools.js +705 -0
  73. package/dist/tools/worktreeTools.js.map +1 -0
  74. package/dist/utils/__tests__/integration.test.js +57 -0
  75. package/dist/utils/__tests__/integration.test.js.map +1 -0
  76. package/dist/utils/__tests__/serverDetection.test.js +151 -0
  77. package/dist/utils/__tests__/serverDetection.test.js.map +1 -0
  78. package/dist/utils/errorHandling.js +336 -0
  79. package/dist/utils/errorHandling.js.map +1 -0
  80. package/dist/utils/processManager.js +172 -0
  81. package/dist/utils/processManager.js.map +1 -0
  82. package/dist/utils/reliability.js +263 -0
  83. package/dist/utils/reliability.js.map +1 -0
  84. package/dist/utils/responseFormatter.js +250 -0
  85. package/dist/utils/responseFormatter.js.map +1 -0
  86. package/dist/utils/serverDetection.js +133 -0
  87. package/dist/utils/serverDetection.js.map +1 -0
  88. package/dist/utils/specMigration.js +105 -0
  89. package/dist/utils/specMigration.js.map +1 -0
  90. package/dist/validation/schemas.js +299 -0
  91. package/dist/validation/schemas.js.map +1 -0
  92. package/package.json +79 -0
  93. package/scripts/init-workspace.js +63 -0
  94. package/scripts/install-search-tools.js +116 -0
@@ -0,0 +1,299 @@
1
+ // src/validation/schemas.ts
2
+ import { z } from "zod";
3
+ // Enhanced Activity Schema for unified logging
4
+ export const EnhancedActivitySchema = z.object({
5
+ id: z.string(),
6
+ timestamp: z.string().datetime(),
7
+ role: z.enum(['architect', 'engineer', 'debugger', 'reviewer', 'system']),
8
+ type: z.enum(['role_update', 'layer_progress', 'clarification', 'file_change', 'mcp_operation', 'phase_completion']),
9
+ summary: z.string(),
10
+ details: z.string().optional(),
11
+ architect_data: z.object({
12
+ phase: z.enum(['research', 'design', 'clarification', 'planning']).optional(),
13
+ sections_completed: z.array(z.string()).optional(),
14
+ research_findings: z.array(z.string()).optional(),
15
+ design_decisions: z.array(z.string()).optional(),
16
+ clarifications: z.array(z.object({
17
+ question: z.string(),
18
+ answer: z.string().optional(),
19
+ status: z.enum(['pending', 'answered'])
20
+ })).optional()
21
+ }).optional(),
22
+ engineer_data: z.object({
23
+ layer: z.enum(['database', 'backend', 'frontend', 'integration', 'testing']).optional(),
24
+ tasks_completed: z.array(z.string()).optional(),
25
+ tasks_remaining: z.array(z.string()).optional(),
26
+ completion_percentage: z.number().optional(),
27
+ build_status: z.enum(['success', 'failed', 'skipped']).optional(),
28
+ test_status: z.enum(['passed', 'failed', 'skipped']).optional()
29
+ }).optional(),
30
+ debugger_data: z.object({
31
+ issue: z.string().optional(),
32
+ root_cause: z.string().optional(),
33
+ fix: z.string().optional(),
34
+ confidence: z.enum(['high', 'medium', 'low']).optional(),
35
+ affected_systems: z.array(z.string()).optional()
36
+ }).optional(),
37
+ reviewer_data: z.object({
38
+ review_type: z.enum(['code', 'architecture', 'security', 'performance']).optional(),
39
+ findings: z.array(z.object({
40
+ severity: z.enum(['high', 'medium', 'low']),
41
+ description: z.string(),
42
+ file: z.string().optional()
43
+ })).optional(),
44
+ approval_status: z.enum(['approved', 'conditional', 'rejected']).optional()
45
+ }).optional(),
46
+ files_changed: z.array(z.object({
47
+ path: z.string(),
48
+ change_type: z.enum(['added', 'modified', 'deleted']),
49
+ lines_added: z.number(),
50
+ lines_removed: z.number(),
51
+ diff_summary: z.string(),
52
+ category: z.enum(['backend', 'frontend', 'test', 'config', 'docs', 'other'])
53
+ }))
54
+ });
55
+ // Manual Schema from the correction document (with enhanced_activities added)
56
+ export const SpecManualSchema = z.object({
57
+ spec_id: z.string().regex(/^SPEC-[0-9]{8}-.+$/),
58
+ executive_summary: z.string(),
59
+ product_specifications: z.string(),
60
+ architecture_analysis: z.string(),
61
+ implementation_plan: z.array(z.object({
62
+ task_id: z.string(),
63
+ description: z.string()
64
+ })),
65
+ testing: z.string(),
66
+ risk_assessment: z.string(),
67
+ execution_logs: z.array(z.object({
68
+ timestamp: z.string().datetime(),
69
+ engineer: z.string(),
70
+ action: z.string(),
71
+ task_id: z.string(),
72
+ files_changed: z.array(z.string()),
73
+ commit_hash: z.string(),
74
+ note: z.string()
75
+ })),
76
+ debug_logs: z.array(z.object({
77
+ timestamp: z.string().datetime(),
78
+ issue: z.string(),
79
+ root_cause: z.string(),
80
+ fix: z.string(),
81
+ confidence: z.enum(["High", "Medium", "Low"])
82
+ })),
83
+ // New enhanced activities array (backward compatible - optional)
84
+ enhanced_activities: z.array(EnhancedActivitySchema).optional()
85
+ });
86
+ // Role output validation schemas
87
+ export const ArchitectOutputSchema = z.object({
88
+ action: z.literal("plan"),
89
+ spec_id: z.string(),
90
+ sections_completed: z.array(z.string()),
91
+ research_conducted: z.boolean()
92
+ });
93
+ export const EngineerOutputSchema = z.object({
94
+ action: z.literal("implement"),
95
+ spec_id: z.string(),
96
+ tasks_completed: z.array(z.string()),
97
+ execution_logs_count: z.number(),
98
+ files_modified: z.array(z.string())
99
+ });
100
+ export const DebuggerOutputSchema = z.object({
101
+ action: z.literal("debug"),
102
+ spec_id: z.string(),
103
+ issue: z.string(),
104
+ root_cause: z.string(),
105
+ resolution_status: z.enum(["fixed", "escalated", "pending"])
106
+ });
107
+ export const ReviewerOutputSchema = z.object({
108
+ action: z.literal("review"),
109
+ spec_id: z.string(),
110
+ improvement_spec_id: z.string(),
111
+ categories_covered: z.array(z.enum(["Security", "Performance", "Quality"])),
112
+ findings_with_severity: z.boolean()
113
+ });
114
+ // Orchestrator schema
115
+ export const OrchestratorInputSchema = z.object({
116
+ problem: z.string().min(5).describe("Problem statement or task description"),
117
+ mode: z.enum(["architect", "engineer", "debugger", "reviewer"]).optional().describe("Preferred mode (optional - will be auto-determined)"),
118
+ spec_id: z.string().optional().describe("Continue existing manual (optional)"),
119
+ clarifications: z.record(z.string()).optional().describe("Answers to previous clarifying questions"),
120
+ user_approval: z.boolean().optional().describe("User approval for spec or implementation"),
121
+ user_satisfaction: z.boolean().optional().describe("User satisfaction with completed work")
122
+ });
123
+ export const OrchestratorOutputSchema = z.object({
124
+ spec_id: z.string(),
125
+ action: z.enum(["clarify", "route", "continue", "await_approval", "proceed", "complete"]),
126
+ clarify_questions: z.array(z.string()).optional(),
127
+ next_mode: z.string().optional(),
128
+ dashboard_url: z.string().optional(),
129
+ prompt_context: z.string().optional(),
130
+ workflow_step: z.enum([
131
+ "questioning", "spec_review", "approved", "implementation",
132
+ "user_review", "completed", "routed_to_architect", "routed_to_engineer",
133
+ "routed_to_debugger", "routed_to_reviewer"
134
+ ]).optional(),
135
+ requires_user_input: z.boolean().optional(),
136
+ approval_message: z.string().optional()
137
+ });
138
+ // User Approval Schemas
139
+ export const UserApprovalSchema = z.object({
140
+ spec_id: z.string(),
141
+ approval_type: z.enum(["spec_approval", "implementation_approval", "completion_confirmation"]),
142
+ approved: z.boolean(),
143
+ feedback: z.string().optional(),
144
+ timestamp: z.string().datetime()
145
+ });
146
+ export const StateTransitionSchema = z.object({
147
+ from_state: z.enum(["draft", "ready", "engineered", "done"]),
148
+ to_state: z.enum(["draft", "ready", "engineered", "done"]),
149
+ trigger: z.enum(["user_input", "clarification_provided", "spec_generated", "user_approved", "implementation_complete", "review_complete", "user_satisfied", "merge_complete"]),
150
+ timestamp: z.string().datetime(),
151
+ spec_id: z.string()
152
+ });
153
+ // Enhanced Architect Output for Approval-Driven Planning
154
+ export const EnhancedArchitectOutputSchema = z.object({
155
+ action: z.enum(["plan", "await_approval", "revise"]),
156
+ spec_id: z.string(),
157
+ sections_completed: z.array(z.string()),
158
+ research_conducted: z.boolean(),
159
+ requires_user_approval: z.boolean().optional(),
160
+ approval_request_message: z.string().optional(),
161
+ dashboard_url: z.string().optional()
162
+ });
163
+ // Enhanced Engineer Output for Implementation Tracking
164
+ export const EnhancedEngineerOutputSchema = z.object({
165
+ action: z.enum(["implement", "progress_update", "implementation_complete"]),
166
+ spec_id: z.string(),
167
+ tasks_completed: z.array(z.string()),
168
+ tasks_remaining: z.array(z.string()).optional(),
169
+ execution_logs_count: z.number(),
170
+ files_modified: z.array(z.string()),
171
+ ready_for_user_review: z.boolean().optional(),
172
+ implementation_summary: z.string().optional()
173
+ });
174
+ // Validation function
175
+ export function validateRoleOutput(role, output, enhanced = false) {
176
+ let schema;
177
+ switch (role.toLowerCase()) {
178
+ case "architect":
179
+ schema = enhanced ? EnhancedArchitectOutputSchema : ArchitectOutputSchema;
180
+ break;
181
+ case "engineer":
182
+ schema = enhanced ? EnhancedEngineerOutputSchema : EngineerOutputSchema;
183
+ break;
184
+ case "debugger":
185
+ schema = DebuggerOutputSchema;
186
+ break;
187
+ case "reviewer":
188
+ schema = ReviewerOutputSchema;
189
+ break;
190
+ case "orchestrator":
191
+ schema = OrchestratorOutputSchema;
192
+ break;
193
+ default:
194
+ throw new Error(`Unknown role: ${role}`);
195
+ }
196
+ const result = schema.safeParse(output);
197
+ if (!result.success) {
198
+ throw new Error(`Role output validation failed for ${role}: ${result.error.message}`);
199
+ }
200
+ return result.data;
201
+ }
202
+ // State transition validation
203
+ export function validateStateTransition(transition) {
204
+ const result = StateTransitionSchema.safeParse(transition);
205
+ if (!result.success) {
206
+ throw new Error(`State transition validation failed: ${result.error.message}`);
207
+ }
208
+ return result.data;
209
+ }
210
+ // User approval validation
211
+ export function validateUserApproval(approval) {
212
+ const result = UserApprovalSchema.safeParse(approval);
213
+ if (!result.success) {
214
+ throw new Error(`User approval validation failed: ${result.error.message}`);
215
+ }
216
+ return result.data;
217
+ }
218
+ // Manual validation function
219
+ export function validateSpecDocument(spec) {
220
+ const result = SpecManualSchema.safeParse(spec);
221
+ if (!result.success) {
222
+ throw new Error(`Manual validation failed: ${result.error.message}`);
223
+ }
224
+ return result.data;
225
+ }
226
+ // Enhanced 3-Gate Approval System Schemas
227
+ export const ApprovalGateSchema = z.object({
228
+ gate_number: z.enum(["1", "2", "3"]),
229
+ gate_name: z.enum(["qa_clarification", "spec_approval", "implementation_approval"]),
230
+ spec_id: z.string(),
231
+ required_confidence: z.number().min(0).max(1),
232
+ current_state: z.enum(["pending", "ready", "approved", "blocked"]),
233
+ blocking_reason: z.string().optional(),
234
+ timestamp: z.string().datetime()
235
+ });
236
+ export const StateTransitionValidationSchema = z.object({
237
+ transition: z.object({
238
+ from: z.enum(["questioning", "spec_review", "approved", "implementation", "user_review", "completed"]),
239
+ to: z.enum(["questioning", "spec_review", "approved", "implementation", "user_review", "completed"]),
240
+ gate_passed: z.enum(["1", "2", "3"]).optional()
241
+ }),
242
+ requirements_met: z.object({
243
+ confidence_threshold: z.boolean(),
244
+ search_enforcement: z.boolean().optional(),
245
+ reviewer_completed: z.boolean().optional(),
246
+ user_approval: z.boolean().optional()
247
+ }),
248
+ spec_id: z.string(),
249
+ timestamp: z.string().datetime()
250
+ });
251
+ export const SearchEnforcementSchema = z.object({
252
+ spec_id: z.string(),
253
+ mode: z.enum(["debugger", "architect", "engineer", "reviewer"]),
254
+ search_calls_required: z.number().min(1),
255
+ search_calls_completed: z.number().min(0),
256
+ enforcement_active: z.boolean(),
257
+ blocked_operations: z.array(z.string()).optional(),
258
+ timestamp: z.string().datetime()
259
+ });
260
+ // 3-Gate Validation Functions
261
+ export function validateApprovalGate(gate) {
262
+ const result = ApprovalGateSchema.safeParse(gate);
263
+ if (!result.success) {
264
+ throw new Error(`Approval gate validation failed: ${result.error.message}`);
265
+ }
266
+ return result.data;
267
+ }
268
+ export function validateEnhancedStateTransition(transition, requirements) {
269
+ const validationData = {
270
+ transition,
271
+ requirements_met: requirements,
272
+ spec_id: transition.spec_id || "",
273
+ timestamp: new Date().toISOString()
274
+ };
275
+ const result = StateTransitionValidationSchema.safeParse(validationData);
276
+ if (!result.success) {
277
+ throw new Error(`State transition validation failed: ${result.error.message}`);
278
+ }
279
+ return result.data;
280
+ }
281
+ export function validateSearchEnforcement(enforcement) {
282
+ const result = SearchEnforcementSchema.safeParse(enforcement);
283
+ if (!result.success) {
284
+ throw new Error(`Search enforcement validation failed: ${result.error.message}`);
285
+ }
286
+ return result.data;
287
+ }
288
+ // Gate-specific validation helpers
289
+ export function validateGate1(confidence, questions) {
290
+ return confidence >= 0.95 && questions.length === 0;
291
+ }
292
+ export function validateGate2(specApproved, sectionsComplete) {
293
+ const requiredSections = ["executive_summary", "product_specifications", "architecture_analysis", "implementation_plan"];
294
+ return specApproved && requiredSections.every(section => sectionsComplete.includes(section));
295
+ }
296
+ export function validateGate3(testsPass, reviewerComplete, userApproval) {
297
+ return testsPass && reviewerComplete && userApproval;
298
+ }
299
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/validation/schemas.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "bobs-workshop",
3
+ "version": "0.1.4",
4
+ "description": "Bob's Workshop — agentic development helper with observability, guard rails, research, and review capabilities",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "bobs": "./bin/bobs-mcp.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "tsx src/index.ts",
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "test": "jest",
15
+ "lint": "eslint src --ext .ts",
16
+ "dashboard": "node dist/dashboard/server.js",
17
+ "postinstall": "npm run build && node scripts/install-search-tools.js && node scripts/init-workspace.js",
18
+ "install-search-tools": "node scripts/install-search-tools.js"
19
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/sdk": "^1.0.0",
22
+ "@types/multer": "^2.0.0",
23
+ "chokidar": "^4.0.3",
24
+ "express": "^4.x",
25
+ "fs-extra": "^11.x",
26
+ "multer": "^2.0.2",
27
+ "simple-git": "^3.x",
28
+ "uuid": "^9.x",
29
+ "zod": "^3.x"
30
+ },
31
+ "optionalDependencies": {
32
+ "@lvce-editor/ripgrep": "^2.4.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/chokidar": "^1.7.5",
36
+ "@types/express": "^5.0.3",
37
+ "@types/fs-extra": "^11.0.4",
38
+ "@types/jest": "^29.x",
39
+ "@types/node": "^20.x",
40
+ "@types/uuid": "^10.0.0",
41
+ "eslint": "^8.x",
42
+ "jest": "^29.x",
43
+ "ts-jest": "^29.x",
44
+ "tsx": "^4.x",
45
+ "typescript": "^5.x"
46
+ },
47
+ "keywords": [
48
+ "mcp",
49
+ "model-context-protocol",
50
+ "developer-tools",
51
+ "workshop",
52
+ "cli",
53
+ "dashboard",
54
+ "spec-driven",
55
+ "development",
56
+ "typescript",
57
+ "developer-experience"
58
+ ],
59
+ "author": "Bob's Workshop Contributors",
60
+ "license": "MIT",
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/your-org/bobs-workshop.git"
64
+ },
65
+ "homepage": "https://github.com/your-org/bobs-workshop#readme",
66
+ "bugs": {
67
+ "url": "https://github.com/your-org/bobs-workshop/issues"
68
+ },
69
+ "engines": {
70
+ "node": ">=18.0.0"
71
+ },
72
+ "files": [
73
+ "dist/**/*",
74
+ "bin/**/*",
75
+ "scripts/**/*",
76
+ "README.md",
77
+ "LICENSE"
78
+ ]
79
+ }
@@ -0,0 +1,63 @@
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();
@@ -0,0 +1,116 @@
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/@lvce-editor/ripgrep');
76
+ if (existsSync(ripgrepPkgPath)) {
77
+ console.log('āœ… Ripgrep installed via npm package (@lvce-editor/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);