dev3000 0.0.102 → 0.0.103

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 (35) hide show
  1. package/mcp-server/.next/BUILD_ID +1 -1
  2. package/mcp-server/.next/build-manifest.json +2 -2
  3. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  4. package/mcp-server/.next/prerender-manifest.json +3 -3
  5. package/mcp-server/.next/server/app/_global-error.html +2 -2
  6. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  7. package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/mcp-server/.next/server/app/_not-found.html +1 -1
  12. package/mcp-server/.next/server/app/_not-found.rsc +1 -1
  13. package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/mcp-server/.next/server/app/index.html +1 -1
  19. package/mcp-server/.next/server/app/index.rsc +1 -1
  20. package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  21. package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +1 -1
  22. package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +1 -1
  23. package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  24. package/mcp-server/.next/server/chunks/[root-of-the-server]__0691849a._.js +1 -1
  25. package/mcp-server/.next/server/chunks/[root-of-the-server]__0691849a._.js.map +1 -1
  26. package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js +53 -17
  27. package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js.map +1 -1
  28. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  29. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  30. package/mcp-server/app/mcp/route.ts +2 -1
  31. package/mcp-server/app/mcp/tools.ts +298 -2
  32. package/package.json +1 -1
  33. /package/mcp-server/.next/static/{4DzBVkDIn_yRVz53mYMf8 → I_0vbzGzd9Y9Tse-yfGKd}/_buildManifest.js +0 -0
  34. /package/mcp-server/.next/static/{4DzBVkDIn_yRVz53mYMf8 → I_0vbzGzd9Y9Tse-yfGKd}/_clientMiddlewareManifest.json +0 -0
  35. /package/mcp-server/.next/static/{4DzBVkDIn_yRVz53mYMf8 → I_0vbzGzd9Y9Tse-yfGKd}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"J2fGjU4v1SMY6g5pu3U2aY0GeU26Wipdet5Y3MnFxRU=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"5LNEsGYjtwWobrqfCSeqJHwMBqVNoQL+Ca6PZ7kLWsc=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "J2fGjU4v1SMY6g5pu3U2aY0GeU26Wipdet5Y3MnFxRU="
4
+ "encryptionKey": "5LNEsGYjtwWobrqfCSeqJHwMBqVNoQL+Ca6PZ7kLWsc="
5
5
  }
@@ -419,7 +419,8 @@ const handler = createMcpHandler(
419
419
  returnRawData: z
420
420
  .boolean()
421
421
  .optional()
422
- .describe("Return structured data for Claude orchestration instead of formatted text")
422
+ .describe("Return structured data for Claude orchestration instead of formatted text"),
423
+ createPR: z.boolean().optional().describe("Create a PR for the highest priority issue (default: false)")
423
424
  },
424
425
  async (params) => {
425
426
  return fixMyApp(params)
@@ -12,7 +12,7 @@ const execAsync = promisify(exec)
12
12
  // Tool descriptions
13
13
  export const TOOL_DESCRIPTIONS = {
14
14
  fix_my_app:
15
- "🔧 **THE ULTIMATE FIND→FIX→VERIFY MACHINE!** This tool doesn't just find bugs - it FIXES them! Pure dev3000 magic that identifies issues, provides exact fixes, and verifies everything works! 🪄\n\n🔥 **INSTANT FIXING SUPERPOWERS:**\n• Detects ALL error types: server crashes, browser errors, build failures, API issues, performance problems\n• Shows EXACT user interactions that triggered each error (clicks, navigation, etc.)\n• Provides EXACT fix code with file locations and line numbers\n• Guides you through implementing fixes step-by-step\n• Verifies fixes by replaying the same interactions that caused the error!\n\n📍 **INTERACTION-BASED VERIFICATION:**\n• Every error includes the user interactions that led to it\n• Use execute_browser_action to replay these exact interactions\n• Verify your fix works by confirming the error doesn't reoccur\n• Example: Error shows '[INTERACTION] Click at (450,300)' → After fix, use execute_browser_action(action='click', params={x:450, y:300}) to verify\n\n⚡ **3 ACTION MODES:**\n• FIX NOW: 'What's broken RIGHT NOW?' → Find and fix immediately\n• FIX REGRESSION: 'What broke during testing?' → Compare before/after and fix\n• FIX CONTINUOUSLY: 'Fix issues as they appear' → Monitor and fix proactively\n\n🎪 **THE FIX-IT WORKFLOW:**\n1️⃣ I FIND all issues with their triggering interactions\n2️⃣ I provide EXACT FIXES with code snippets\n3️⃣ You implement the fixes\n4️⃣ We REPLAY the interactions to VERIFY everything works\n\n💡 **PERFECT FOR:** 'fix my app' or 'debug my app' requests, error resolution, code repairs, making broken apps work again. This tool doesn't just identify problems - it SOLVES them with precise reproduction steps!",
15
+ "🔧 **THE ULTIMATE FIND→FIX→VERIFY MACHINE!** This tool doesn't just find bugs - it FIXES them! Pure dev3000 magic that identifies issues, prioritizes them, and creates focused PRs for the worst issue! 🪄\n\n🔥 **INSTANT FIXING SUPERPOWERS:**\n• Detects ALL error types: server crashes, browser errors, build failures, API issues, performance problems\n• **PRIORITIZES errors** using smart scoring (build > server > browser > network > warnings)\n• **Identifies the SINGLE WORST issue** that needs fixing right now\n• **Creates ONE focused PR** per run - no overwhelming multi-issue PRs!\n• Shows EXACT user interactions that triggered each error (clicks, navigation, etc.)\n• Provides EXACT fix code with file locations and line numbers\n• Verifies fixes by replaying the same interactions that caused the error!\n\n🎯 **SMART PRIORITIZATION:**\n• Build errors: 1000+ priority (blocks development)\n• Server errors: 500+ priority (affects functionality)\n• Browser errors: 300+ priority (user-facing issues)\n• Network errors: 200+ priority (intermittent issues)\n• Warnings: 100+ priority (nice to fix)\n• +Modifiers: Multiple occurrences, recency, reproducibility\n\n🚀 **ONE-PR-PER-RUN WORKFLOW:**\n1️⃣ I FIND all issues and their interactions\n2️⃣ I PRIORITIZE using smart scoring algorithm\n3️⃣ I IDENTIFY the single worst issue\n4️⃣ Set createPR=true to CREATE A FOCUSED PR for just that issue\n5️⃣ Fix that ONE issue, then run again for the next worst issue\n\n📍 **INTERACTION-BASED VERIFICATION:**\n• Every error includes the user interactions that led to it\n• Use execute_browser_action to replay these exact interactions\n• Verify your fix works by confirming the error doesn't reoccur\n• Example: Error shows '[INTERACTION] Click at (450,300)' → After fix, use execute_browser_action(action='click', params={x:450, y:300}) to verify\n\n⚡ **3 ACTION MODES:**\n• FIX NOW: 'What's broken RIGHT NOW?' → Find worst issue and optionally create PR\n• FIX REGRESSION: 'What broke during testing?' → Compare before/after and fix worst issue\n• FIX CONTINUOUSLY: 'Fix issues as they appear' → Monitor and fix proactively\n\n💡 **PERFECT FOR:** 'fix my app' or 'debug my app' or 'create pr for worst issue' requests. This tool identifies problems, ranks them by severity, and creates focused single-issue PRs - not giant multi-fix PRs!",
16
16
 
17
17
  execute_browser_action:
18
18
  "🌐 **INTELLIGENT BROWSER AUTOMATION** - Smart browser action routing that automatically delegates to chrome-devtools MCP when available for superior automation capabilities.\n\n🎯 **INTELLIGENT DELEGATION:**\n• Screenshots → chrome-devtools MCP (better quality, no conflicts)\n• Navigation → chrome-devtools MCP (more reliable page handling)\n• Clicks → chrome-devtools MCP (precise coordinate-based interaction)\n• JavaScript evaluation → chrome-devtools MCP (enhanced debugging)\n• Scrolling & typing → dev3000 fallback (specialized actions)\n\n⚡ **PROGRESSIVE ENHANCEMENT:**\n• Uses chrome-devtools MCP when available for best results\n• Falls back to dev3000's native implementation when chrome-devtools unavailable\n• Shares the same Chrome instance via CDP URL coordination\n• Eliminates browser conflicts between tools\n\n💡 **PERFECT FOR:** Browser automation that automatically chooses the best tool for each action, ensuring optimal results whether chrome-devtools MCP is available or not.",
@@ -49,6 +49,7 @@ export interface FixMyAppParams {
49
49
  integrateNextjs?: boolean
50
50
  integrateChromeDevtools?: boolean
51
51
  returnRawData?: boolean
52
+ createPR?: boolean // Create a PR for the highest priority issue
52
53
  }
53
54
 
54
55
  export interface CreateIntegratedWorkflowParams {
@@ -122,6 +123,259 @@ export interface StructuredAnalysisResult {
122
123
  }
123
124
  }
124
125
 
126
+ export interface PrioritizedError {
127
+ error: string
128
+ category: "build" | "server" | "browser" | "network" | "warning"
129
+ severity: "critical" | "error" | "warning"
130
+ priorityScore: number
131
+ interactions: string[]
132
+ timestamp?: string
133
+ suggestedFix?: string
134
+ }
135
+
136
+ // Helper functions
137
+
138
+ /**
139
+ * Calculate priority score for an error
140
+ * Higher score = higher priority to fix
141
+ *
142
+ * Scoring system:
143
+ * - Build errors: 1000+ (blocks development)
144
+ * - Server errors: 500+ (affects functionality)
145
+ * - Browser errors: 300+ (user-facing issues)
146
+ * - Network errors: 200+ (intermittent issues)
147
+ * - Warnings: 100+ (nice to fix)
148
+ *
149
+ * Additional modifiers:
150
+ * - Multiple occurrences: +50 per occurrence
151
+ * - Recent (last minute): +100
152
+ * - Has user interactions: +50 (reproducible)
153
+ */
154
+ function calculateErrorPriority(
155
+ errorLine: string,
156
+ category: PrioritizedError["category"],
157
+ interactions: string[],
158
+ allErrors: string[]
159
+ ): number {
160
+ let score = 0
161
+
162
+ // Base score by category
163
+ if (category === "build") {
164
+ score = 1000
165
+ } else if (category === "server") {
166
+ score = 500
167
+ } else if (category === "browser") {
168
+ score = 300
169
+ } else if (category === "network") {
170
+ score = 200
171
+ } else if (category === "warning") {
172
+ score = 100
173
+ }
174
+
175
+ // Severity multipliers
176
+ if (/CRITICAL|FATAL|crashed/i.test(errorLine)) {
177
+ score *= 2
178
+ } else if (/ERROR|Exception|FAIL/i.test(errorLine)) {
179
+ score *= 1.5
180
+ }
181
+
182
+ // Count occurrences of similar errors
183
+ const errorPattern = errorLine.replace(/\d+/g, "\\d+").substring(0, 100)
184
+ const occurrences = allErrors.filter((e) => new RegExp(errorPattern).test(e)).length
185
+ if (occurrences > 1) {
186
+ score += (occurrences - 1) * 50
187
+ }
188
+
189
+ // Boost if has interactions (reproducible)
190
+ if (interactions.length > 0) {
191
+ score += 50
192
+ }
193
+
194
+ // Boost if recent (within last minute)
195
+ const timestampMatch = errorLine.match(/\[(\d{2}):(\d{2}):(\d{2})\.\d{3}\]/)
196
+ if (timestampMatch) {
197
+ const now = new Date()
198
+ const errorTime = new Date()
199
+ errorTime.setHours(parseInt(timestampMatch[1], 10))
200
+ errorTime.setMinutes(parseInt(timestampMatch[2], 10))
201
+ errorTime.setSeconds(parseInt(timestampMatch[3], 10))
202
+
203
+ const ageMinutes = (now.getTime() - errorTime.getTime()) / 1000 / 60
204
+ if (ageMinutes < 1) {
205
+ score += 100
206
+ }
207
+ }
208
+
209
+ return score
210
+ }
211
+
212
+ /**
213
+ * Find the single highest priority error from categorized errors
214
+ */
215
+ function findHighestPriorityError(
216
+ categorizedErrors: {
217
+ serverErrors: string[]
218
+ browserErrors: string[]
219
+ buildErrors: string[]
220
+ networkErrors: string[]
221
+ warnings: string[]
222
+ },
223
+ allErrors: string[],
224
+ logLines: string[]
225
+ ): PrioritizedError | null {
226
+ const prioritizedErrors: PrioritizedError[] = []
227
+
228
+ // Helper to find interactions before an error
229
+ const findInteractions = (errorLine: string): string[] => {
230
+ const errorIndex = logLines.indexOf(errorLine)
231
+ if (errorIndex === -1) return []
232
+
233
+ const interactions: string[] = []
234
+ for (let i = errorIndex - 1; i >= Math.max(0, errorIndex - 20) && interactions.length < 5; i--) {
235
+ if (
236
+ logLines[i].includes("[INTERACTION]") ||
237
+ logLines[i].includes("[NAVIGATION]") ||
238
+ logLines[i].includes("[PAGE]")
239
+ ) {
240
+ interactions.unshift(logLines[i])
241
+ }
242
+ }
243
+ return interactions
244
+ }
245
+
246
+ // Process build errors
247
+ for (const error of categorizedErrors.buildErrors) {
248
+ const interactions = findInteractions(error)
249
+ prioritizedErrors.push({
250
+ error,
251
+ category: "build",
252
+ severity: "critical",
253
+ priorityScore: calculateErrorPriority(error, "build", interactions, allErrors),
254
+ interactions
255
+ })
256
+ }
257
+
258
+ // Process server errors
259
+ for (const error of categorizedErrors.serverErrors) {
260
+ const interactions = findInteractions(error)
261
+ const severity: PrioritizedError["severity"] = /CRITICAL|FATAL/i.test(error) ? "critical" : "error"
262
+ prioritizedErrors.push({
263
+ error,
264
+ category: "server",
265
+ severity,
266
+ priorityScore: calculateErrorPriority(error, "server", interactions, allErrors),
267
+ interactions
268
+ })
269
+ }
270
+
271
+ // Process browser errors
272
+ for (const error of categorizedErrors.browserErrors) {
273
+ const interactions = findInteractions(error)
274
+ const severity: PrioritizedError["severity"] = /CRITICAL|FATAL/i.test(error) ? "critical" : "error"
275
+ prioritizedErrors.push({
276
+ error,
277
+ category: "browser",
278
+ severity,
279
+ priorityScore: calculateErrorPriority(error, "browser", interactions, allErrors),
280
+ interactions
281
+ })
282
+ }
283
+
284
+ // Process network errors
285
+ for (const error of categorizedErrors.networkErrors) {
286
+ const interactions = findInteractions(error)
287
+ prioritizedErrors.push({
288
+ error,
289
+ category: "network",
290
+ severity: "error",
291
+ priorityScore: calculateErrorPriority(error, "network", interactions, allErrors),
292
+ interactions
293
+ })
294
+ }
295
+
296
+ // Process warnings (only if no errors found)
297
+ if (prioritizedErrors.length === 0) {
298
+ for (const error of categorizedErrors.warnings) {
299
+ const interactions = findInteractions(error)
300
+ prioritizedErrors.push({
301
+ error,
302
+ category: "warning",
303
+ severity: "warning",
304
+ priorityScore: calculateErrorPriority(error, "warning", interactions, allErrors),
305
+ interactions
306
+ })
307
+ }
308
+ }
309
+
310
+ // Sort by priority score (highest first)
311
+ prioritizedErrors.sort((a, b) => b.priorityScore - a.priorityScore)
312
+
313
+ return prioritizedErrors[0] || null
314
+ }
315
+
316
+ /**
317
+ * Create a PR for the highest priority issue
318
+ */
319
+ async function createPRForIssue(prioritizedError: PrioritizedError, _projectName: string): Promise<string> {
320
+ try {
321
+ // Extract error details for PR title and body
322
+ const errorType = prioritizedError.category.toUpperCase()
323
+ const errorMessage = prioritizedError.error
324
+ .replace(/\[[^\]]+\]/g, "") // Remove timestamps and tags
325
+ .trim()
326
+ .substring(0, 100)
327
+
328
+ const prTitle = `Fix: ${errorType} - ${errorMessage}`
329
+
330
+ // Build PR body
331
+ const prBody = `## 🐛 Bug Fix - ${prioritizedError.category} Error
332
+
333
+ **Priority Score:** ${prioritizedError.priorityScore} (${prioritizedError.severity})
334
+
335
+ ### Error Details
336
+ \`\`\`
337
+ ${prioritizedError.error}
338
+ \`\`\`
339
+
340
+ ${
341
+ prioritizedError.interactions.length > 0
342
+ ? `### Reproduction Steps
343
+ The error occurred after these user interactions:
344
+ ${prioritizedError.interactions.map((i, idx) => `${idx + 1}. ${i}`).join("\n")}
345
+
346
+ ### Verification
347
+ After implementing the fix, verify by:
348
+ 1. Replaying the same interactions using \`execute_browser_action\`
349
+ 2. Confirming the error no longer appears in logs
350
+ 3. Checking that functionality works as expected
351
+ `
352
+ : ""
353
+ }
354
+
355
+ ### Suggested Fix
356
+ This PR addresses the ${prioritizedError.severity}-level ${prioritizedError.category} error detected by dev3000.
357
+
358
+ ${prioritizedError.suggestedFix || "Please analyze the error and implement the appropriate fix."}
359
+
360
+ ---
361
+ 🤖 Generated with [dev3000](https://github.com/vercel-labs/dev3000) - AI-powered debugging
362
+ `
363
+
364
+ // Create a new branch
365
+ const branchName = `fix/${prioritizedError.category}-${Date.now()}`
366
+
367
+ // Use execAsync to run git and gh commands
368
+ await execAsync(`git checkout -b ${branchName}`)
369
+
370
+ // Create the PR using gh
371
+ await execAsync(`gh pr create --title "${prTitle}" --body "${prBody}" --head ${branchName}`)
372
+
373
+ return `✅ Created PR: ${prTitle}\n\nBranch: ${branchName}\n\nNext steps:\n1. Implement the fix in your code\n2. Commit and push changes\n3. PR is ready for review!`
374
+ } catch (error) {
375
+ return `❌ Failed to create PR: ${error instanceof Error ? error.message : String(error)}\n\nYou can manually create a PR with the error details above.`
376
+ }
377
+ }
378
+
125
379
  // Helper functions
126
380
  export function findActiveSessions(): Session[] {
127
381
  const sessionDir = join(homedir(), ".d3k")
@@ -185,7 +439,8 @@ export async function fixMyApp({
185
439
  includeTimestampInstructions = true,
186
440
  integrateNextjs = false,
187
441
  integrateChromeDevtools = false,
188
- returnRawData = false
442
+ returnRawData = false,
443
+ createPR = false
189
444
  }: FixMyAppParams): Promise<{ content: Array<{ type: "text"; text: string }> }> {
190
445
  // 🎯 MCP ORCHESTRATION: Check which downstream MCPs are available
191
446
  const { getMCPClientManager } = await import("./client-manager")
@@ -631,6 +886,47 @@ export async function fixMyApp({
631
886
  results.push("• Combined = 90%+ issue resolution rate!")
632
887
  }
633
888
  }
889
+
890
+ // 🎯 PRIORITIZATION & PR CREATION
891
+ // Find the single highest priority error and optionally create a PR
892
+ const highestPriorityError = findHighestPriorityError(categorizedErrors, actionableErrors, logLines)
893
+
894
+ if (highestPriorityError) {
895
+ results.push("")
896
+ results.push("🎯 **HIGHEST PRIORITY ISSUE:**")
897
+ results.push(`📊 Priority Score: ${highestPriorityError.priorityScore}`)
898
+ results.push(`🏷️ Category: ${highestPriorityError.category.toUpperCase()}`)
899
+ results.push(`⚠️ Severity: ${highestPriorityError.severity.toUpperCase()}`)
900
+ results.push("")
901
+ results.push("❌ **Error:**")
902
+ results.push(` ${highestPriorityError.error}`)
903
+
904
+ if (highestPriorityError.interactions.length > 0) {
905
+ results.push("")
906
+ results.push("📍 **Reproduction Steps:**")
907
+ highestPriorityError.interactions.forEach((interaction, idx) => {
908
+ results.push(` ${idx + 1}. ${interaction}`)
909
+ })
910
+ }
911
+
912
+ // Create PR if requested
913
+ if (createPR) {
914
+ results.push("")
915
+ results.push("🚀 **CREATING PR FOR THIS ISSUE...**")
916
+ const prResult = await createPRForIssue(highestPriorityError, projectName || "")
917
+ results.push(prResult)
918
+ } else {
919
+ results.push("")
920
+ results.push("💡 **To create a PR for this issue:**")
921
+ results.push(" Run: fix_my_app(createPR=true)")
922
+ results.push("")
923
+ results.push(" This will:")
924
+ results.push(" • Create a new branch for the fix")
925
+ results.push(" • Generate a PR with full error context")
926
+ results.push(" • Include reproduction steps")
927
+ results.push(" • Focus on fixing just this ONE issue")
928
+ }
929
+ }
634
930
  }
635
931
 
636
932
  // Extract screenshot information (replaces get_recent_screenshots)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev3000",
3
- "version": "0.0.102",
3
+ "version": "0.0.103",
4
4
  "description": "AI-powered development tools with browser monitoring and MCP server integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",