bobs-workshop 0.2.6 → 0.3.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.
@@ -0,0 +1,296 @@
1
+ // src/tools/semgrep-patterns.ts
2
+ import { spawn } from "child_process";
3
+ import fs from "fs-extra";
4
+ import path from "path";
5
+ /**
6
+ * Generates and executes multi-pattern semgrep searches
7
+ * Replaces the broken single-pattern approach with 7 core patterns
8
+ * covering function calls, definitions, classes, imports, and error handling
9
+ */
10
+ export class SemgrepPatternGenerator {
11
+ /**
12
+ * Generate 7 core patterns for a given symbol/query
13
+ * Covers: calls, methods, definitions, classes, imports, assignments, error handling
14
+ */
15
+ generateCorePatterns(symbol, language = 'auto') {
16
+ const patterns = [];
17
+ // Pattern 1: Function calls
18
+ patterns.push({
19
+ id: 'function-call',
20
+ patterns: [
21
+ `${symbol}(...)`,
22
+ `await ${symbol}(...)`
23
+ ],
24
+ languages: this.getLanguages(language),
25
+ message: `Function call: ${symbol}`
26
+ });
27
+ // Pattern 2: Method calls
28
+ patterns.push({
29
+ id: 'method-call',
30
+ patterns: [`$OBJ.${symbol}(...)`],
31
+ languages: this.getLanguages(language),
32
+ message: `Method call: ${symbol}`
33
+ });
34
+ // Pattern 3: Function definitions (multi-language)
35
+ patterns.push({
36
+ id: 'function-def',
37
+ patterns: this.getFunctionDefPatterns(symbol, language),
38
+ languages: this.getLanguages(language),
39
+ message: `Function definition: ${symbol}`
40
+ });
41
+ // Pattern 4: Class patterns
42
+ patterns.push({
43
+ id: 'class-pattern',
44
+ patterns: [
45
+ `class ${symbol} { ... }`,
46
+ `class $X { ... ${symbol}(...) { ... } ... }`
47
+ ],
48
+ languages: this.getLanguages(language),
49
+ message: `Class pattern: ${symbol}`
50
+ });
51
+ // Pattern 5: Imports (multi-language)
52
+ patterns.push({
53
+ id: 'imports',
54
+ patterns: this.getImportPatterns(symbol, language),
55
+ languages: this.getLanguages(language),
56
+ message: `Import statement: ${symbol}`
57
+ });
58
+ // Pattern 6: Variable assignment
59
+ patterns.push({
60
+ id: 'assignment',
61
+ patterns: [
62
+ `$VAR = ${symbol}`,
63
+ `const $VAR = ${symbol}`,
64
+ `return ${symbol}`
65
+ ],
66
+ languages: this.getLanguages(language),
67
+ message: `Variable assignment: ${symbol}`
68
+ });
69
+ // Pattern 7: Error handling
70
+ patterns.push({
71
+ id: 'error-handling',
72
+ patterns: [
73
+ `try { ... ${symbol}(...) ... } catch ($E) { ... }`
74
+ ],
75
+ languages: this.getLanguages(language),
76
+ message: `Error handling: ${symbol}`
77
+ });
78
+ return patterns;
79
+ }
80
+ /**
81
+ * Run all patterns in parallel (Promise.all)
82
+ * Returns aggregated results from all patterns
83
+ */
84
+ async runPatterns(patterns, projectPath, timeoutMs = 4000) {
85
+ console.log(`[SEMGREP PATTERNS] Running ${patterns.length} patterns in parallel`);
86
+ // Run all patterns with individual timeouts
87
+ const results = await Promise.allSettled(patterns.map(pattern => this.runSinglePattern(pattern, projectPath, timeoutMs)));
88
+ // Collect successful results
89
+ const allResults = [];
90
+ let successCount = 0;
91
+ let failCount = 0;
92
+ results.forEach((result, index) => {
93
+ if (result.status === 'fulfilled') {
94
+ allResults.push(...result.value);
95
+ successCount++;
96
+ console.log(`[SEMGREP PATTERNS] Pattern ${patterns[index].id}: ${result.value.length} matches`);
97
+ }
98
+ else {
99
+ failCount++;
100
+ console.warn(`[SEMGREP PATTERNS] Pattern ${patterns[index].id} failed:`, result.reason?.message);
101
+ }
102
+ });
103
+ console.log(`[SEMGREP PATTERNS] Complete: ${successCount}/${patterns.length} patterns succeeded, ${allResults.length} total matches`);
104
+ return allResults;
105
+ }
106
+ /**
107
+ * Run a single semgrep pattern with timeout protection
108
+ */
109
+ async runSinglePattern(pattern, projectPath, timeoutMs) {
110
+ return new Promise((resolve, reject) => {
111
+ const args = ['--json', '--quiet', '--metrics=off'];
112
+ // Add language filter
113
+ if (pattern.languages.length === 1 && pattern.languages[0] !== 'generic') {
114
+ args.push('--lang', pattern.languages[0]);
115
+ }
116
+ // Add patterns (use pattern-either for multiple)
117
+ if (pattern.patterns.length === 1) {
118
+ args.push('--pattern', pattern.patterns[0]);
119
+ }
120
+ else {
121
+ // For multiple patterns, we need to run them separately or use config
122
+ // For now, run first pattern (can enhance later)
123
+ args.push('--pattern', pattern.patterns[0]);
124
+ }
125
+ // Add target path
126
+ args.push(projectPath);
127
+ const child = spawn('semgrep', args, {
128
+ stdio: ['ignore', 'pipe', 'pipe']
129
+ });
130
+ let stdout = '';
131
+ let stderr = '';
132
+ let isResolved = false;
133
+ // Timeout handler
134
+ const timeoutId = setTimeout(() => {
135
+ if (!isResolved) {
136
+ isResolved = true;
137
+ child.kill('SIGTERM');
138
+ reject(new Error(`Pattern ${pattern.id} timed out after ${timeoutMs}ms`));
139
+ }
140
+ }, timeoutMs);
141
+ child.stdout?.on('data', (data) => {
142
+ stdout += data.toString();
143
+ });
144
+ child.stderr?.on('data', (data) => {
145
+ stderr += data.toString();
146
+ });
147
+ child.on('close', (code) => {
148
+ if (!isResolved) {
149
+ isResolved = true;
150
+ clearTimeout(timeoutId);
151
+ // Semgrep exit codes: 0 = no findings, 1 = error, 2 = findings
152
+ if (code === 0 || code === 2) {
153
+ try {
154
+ const results = this.parseSemgrepOutput(stdout, pattern);
155
+ resolve(results);
156
+ }
157
+ catch (error) {
158
+ resolve([]); // Parse error - return empty
159
+ }
160
+ }
161
+ else {
162
+ // Error code 1 or other - not findings
163
+ resolve([]);
164
+ }
165
+ }
166
+ });
167
+ child.on('error', (err) => {
168
+ if (!isResolved) {
169
+ isResolved = true;
170
+ clearTimeout(timeoutId);
171
+ reject(err);
172
+ }
173
+ });
174
+ });
175
+ }
176
+ /**
177
+ * Parse semgrep JSON output into normalized results
178
+ */
179
+ parseSemgrepOutput(stdout, pattern) {
180
+ if (!stdout.trim()) {
181
+ return [];
182
+ }
183
+ const parsed = JSON.parse(stdout);
184
+ if (!parsed.results || !Array.isArray(parsed.results)) {
185
+ return [];
186
+ }
187
+ return parsed.results.map((result) => ({
188
+ file: result.path,
189
+ line: result.start?.line || 0,
190
+ ruleId: result.check_id || pattern.id,
191
+ message: result.extra?.message || pattern.message,
192
+ patternId: pattern.id
193
+ }));
194
+ }
195
+ /**
196
+ * Detect project language from project files
197
+ */
198
+ detectLanguageFromProject(projectPath = process.cwd()) {
199
+ // Check for package.json (JavaScript/TypeScript)
200
+ if (fs.existsSync(path.join(projectPath, 'package.json'))) {
201
+ return 'javascript';
202
+ }
203
+ // Check for requirements.txt or setup.py (Python)
204
+ if (fs.existsSync(path.join(projectPath, 'requirements.txt')) ||
205
+ fs.existsSync(path.join(projectPath, 'setup.py')) ||
206
+ fs.existsSync(path.join(projectPath, 'pyproject.toml'))) {
207
+ return 'python';
208
+ }
209
+ // Check for go.mod (Go)
210
+ if (fs.existsSync(path.join(projectPath, 'go.mod'))) {
211
+ return 'go';
212
+ }
213
+ // Check for pom.xml or build.gradle (Java)
214
+ if (fs.existsSync(path.join(projectPath, 'pom.xml')) ||
215
+ fs.existsSync(path.join(projectPath, 'build.gradle')) ||
216
+ fs.existsSync(path.join(projectPath, 'build.gradle.kts'))) {
217
+ return 'java';
218
+ }
219
+ // Check for Cargo.toml (Rust)
220
+ if (fs.existsSync(path.join(projectPath, 'Cargo.toml'))) {
221
+ return 'rust';
222
+ }
223
+ // Default: auto (all languages)
224
+ return 'auto';
225
+ }
226
+ /**
227
+ * Get function definition patterns for different languages
228
+ */
229
+ getFunctionDefPatterns(symbol, language) {
230
+ const patterns = [];
231
+ // JavaScript/TypeScript (always include)
232
+ patterns.push(`function ${symbol}(...) { ... }`);
233
+ patterns.push(`const ${symbol} = (...) => { ... }`);
234
+ patterns.push(`async function ${symbol}(...) { ... }`);
235
+ // Python
236
+ if (language === 'auto' || language === 'python') {
237
+ patterns.push(`def ${symbol}(...): ...`);
238
+ patterns.push(`async def ${symbol}(...): ...`);
239
+ }
240
+ // Go
241
+ if (language === 'auto' || language === 'go') {
242
+ patterns.push(`func ${symbol}(...) { ... }`);
243
+ }
244
+ // Java
245
+ if (language === 'auto' || language === 'java') {
246
+ patterns.push(`public $T ${symbol}(...) { ... }`);
247
+ patterns.push(`private $T ${symbol}(...) { ... }`);
248
+ }
249
+ return patterns;
250
+ }
251
+ /**
252
+ * Get import patterns for different languages
253
+ */
254
+ getImportPatterns(symbol, language) {
255
+ const patterns = [];
256
+ // JavaScript/TypeScript
257
+ patterns.push(`import { ..., ${symbol}, ... } from "..."`);
258
+ patterns.push(`import ${symbol} from "..."`);
259
+ // Python
260
+ if (language === 'auto' || language === 'python') {
261
+ patterns.push(`from $MOD import ${symbol}`);
262
+ patterns.push(`import ${symbol}`);
263
+ }
264
+ // Go
265
+ if (language === 'auto' || language === 'go') {
266
+ patterns.push(`import "$MOD/${symbol}"`);
267
+ }
268
+ // Java
269
+ if (language === 'auto' || language === 'java') {
270
+ patterns.push(`import $PKG.${symbol}`);
271
+ }
272
+ return patterns;
273
+ }
274
+ /**
275
+ * Get language list for semgrep
276
+ */
277
+ getLanguages(language) {
278
+ if (language === 'auto') {
279
+ return ['javascript', 'typescript', 'python', 'go', 'java', 'generic'];
280
+ }
281
+ // Map friendly names to semgrep language names
282
+ const languageMap = {
283
+ 'javascript': 'javascript',
284
+ 'typescript': 'typescript',
285
+ 'js': 'javascript',
286
+ 'ts': 'typescript',
287
+ 'python': 'python',
288
+ 'py': 'python',
289
+ 'go': 'go',
290
+ 'java': 'java',
291
+ 'rust': 'rust'
292
+ };
293
+ return [languageMap[language] || language];
294
+ }
295
+ }
296
+ //# sourceMappingURL=semgrep-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrep-patterns.js","sourceRoot":"","sources":["../../src/tools/semgrep-patterns.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bobs-workshop",
3
- "version": "0.2.6",
3
+ "version": "0.3.0",
4
4
  "description": "Bob's Workshop — agentic development helper with observability, guard rails, research, and review capabilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",