# Try any of these instantly npx @mj-muin/portguard npx @mj-muin/oops-cli npx @mj-muin/roast your-file.js npx @mj-muin/-weight: 500;">git-why your-file.js COMMAND_BLOCK: # Try any of these instantly npx @mj-muin/portguard npx @mj-muin/oops-cli npx @mj-muin/roast your-file.js npx @mj-muin/-weight: 500;">git-why your-file.js COMMAND_BLOCK: # Try any of these instantly npx @mj-muin/portguard npx @mj-muin/oops-cli npx @mj-muin/roast your-file.js npx @mj-muin/-weight: 500;">git-why your-file.js CODE_BLOCK: Error: listen EADDRINUSE: address already in use :::3000 CODE_BLOCK: Error: listen EADDRINUSE: address already in use :::3000 CODE_BLOCK: Error: listen EADDRINUSE: address already in use :::3000 CODE_BLOCK: npx @mj-muin/portguard CODE_BLOCK: npx @mj-muin/portguard CODE_BLOCK: npx @mj-muin/portguard COMMAND_BLOCK: # List everything on common dev ports portguard list # Nuke whatever's on port 3000 portguard kill 3000 COMMAND_BLOCK: # List everything on common dev ports portguard list # Nuke whatever's on port 3000 portguard kill 3000 COMMAND_BLOCK: # List everything on common dev ports portguard list # Nuke whatever's on port 3000 portguard kill 3000 CODE_BLOCK: { "scripts": { "predev": "npx @mj-muin/portguard kill 3000 --silent", "dev": "next dev" } } CODE_BLOCK: { "scripts": { "predev": "npx @mj-muin/portguard kill 3000 --silent", "dev": "next dev" } } CODE_BLOCK: { "scripts": { "predev": "npx @mj-muin/portguard kill 3000 --silent", "dev": "next dev" } } COMMAND_BLOCK: -weight: 500;">npm i -g @mj-muin/oops-cli # Pipe any error directly to AI node app.js 2>&1 | oops python train.py 2>&1 | oops cargo build 2>&1 | oops COMMAND_BLOCK: -weight: 500;">npm i -g @mj-muin/oops-cli # Pipe any error directly to AI node app.js 2>&1 | oops python train.py 2>&1 | oops cargo build 2>&1 | oops COMMAND_BLOCK: -weight: 500;">npm i -g @mj-muin/oops-cli # Pipe any error directly to AI node app.js 2>&1 | oops python train.py 2>&1 | oops cargo build 2>&1 | oops COMMAND_BLOCK: $ node server.js 2>&1 | oops 🔍 Analyzing error... ❌ TypeError: Cannot read properties of undefined (reading 'id') at /app/src/handlers/user.js:42 💡 The `user` object is undefined because the middleware that sets `req.user` isn't running before this route. 🔧 Fix: Add your auth middleware before the route handler: app.get('/profile', authMiddleware, profileHandler) COMMAND_BLOCK: $ node server.js 2>&1 | oops 🔍 Analyzing error... ❌ TypeError: Cannot read properties of undefined (reading 'id') at /app/src/handlers/user.js:42 💡 The `user` object is undefined because the middleware that sets `req.user` isn't running before this route. 🔧 Fix: Add your auth middleware before the route handler: app.get('/profile', authMiddleware, profileHandler) COMMAND_BLOCK: $ node server.js 2>&1 | oops 🔍 Analyzing error... ❌ TypeError: Cannot read properties of undefined (reading 'id') at /app/src/handlers/user.js:42 💡 The `user` object is undefined because the middleware that sets `req.user` isn't running before this route. 🔧 Fix: Add your auth middleware before the route handler: app.get('/profile', authMiddleware, profileHandler) CODE_BLOCK: npx @mj-muin/roast src/utils.js CODE_BLOCK: npx @mj-muin/roast src/utils.js CODE_BLOCK: npx @mj-muin/roast src/utils.js COMMAND_BLOCK: $ npx @mj-muin/roast src/helpers.js 🔥 ROAST REPORT: src/helpers.js ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🤦 Line 12-89: This function is 77 lines long. That's not a function, that's a short story. → Extract the validation logic into its own function. 🐛 Line 34: You're catching errors and doing nothing. `catch(e) {}` is not error handling, it's error hiding. → At minimum, log it. Better: handle it or let it propagate. 💀 Line 56: `== null` vs `=== null` I see you like to live dangerously. → Use strict equality. Always. 📊 Overall: 4/10 — Functional but fragile. Fix the silent catch first. That WILL bite you in production. COMMAND_BLOCK: $ npx @mj-muin/roast src/helpers.js 🔥 ROAST REPORT: src/helpers.js ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🤦 Line 12-89: This function is 77 lines long. That's not a function, that's a short story. → Extract the validation logic into its own function. 🐛 Line 34: You're catching errors and doing nothing. `catch(e) {}` is not error handling, it's error hiding. → At minimum, log it. Better: handle it or let it propagate. 💀 Line 56: `== null` vs `=== null` I see you like to live dangerously. → Use strict equality. Always. 📊 Overall: 4/10 — Functional but fragile. Fix the silent catch first. That WILL bite you in production. COMMAND_BLOCK: $ npx @mj-muin/roast src/helpers.js 🔥 ROAST REPORT: src/helpers.js ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🤦 Line 12-89: This function is 77 lines long. That's not a function, that's a short story. → Extract the validation logic into its own function. 🐛 Line 34: You're catching errors and doing nothing. `catch(e) {}` is not error handling, it's error hiding. → At minimum, log it. Better: handle it or let it propagate. 💀 Line 56: `== null` vs `=== null` I see you like to live dangerously. → Use strict equality. Always. 📊 Overall: 4/10 — Functional but fragile. Fix the silent catch first. That WILL bite you in production. CODE_BLOCK: npx @mj-muin/-weight: 500;">git-why src/auth.js CODE_BLOCK: npx @mj-muin/-weight: 500;">git-why src/auth.js CODE_BLOCK: npx @mj-muin/-weight: 500;">git-why src/auth.js COMMAND_BLOCK: # 1. The zero-config one (no API key needed) npx @mj-muin/portguard list # 2. Set up AI-powered tools (one-time) export ANTHROPIC_API_KEY=sk-ant-... # 3. Pipe errors to AI node app.js 2>&1 | oops # 4. Get your code roasted npx @mj-muin/roast src/index.js # 5. Understand why code exists npx @mj-muin/-weight: 500;">git-why src/auth.js COMMAND_BLOCK: # 1. The zero-config one (no API key needed) npx @mj-muin/portguard list # 2. Set up AI-powered tools (one-time) export ANTHROPIC_API_KEY=sk-ant-... # 3. Pipe errors to AI node app.js 2>&1 | oops # 4. Get your code roasted npx @mj-muin/roast src/index.js # 5. Understand why code exists npx @mj-muin/-weight: 500;">git-why src/auth.js COMMAND_BLOCK: # 1. The zero-config one (no API key needed) npx @mj-muin/portguard list # 2. Set up AI-powered tools (one-time) export ANTHROPIC_API_KEY=sk-ant-... # 3. Pipe errors to AI node app.js 2>&1 | oops # 4. Get your code roasted npx @mj-muin/roast src/index.js # 5. Understand why code exists npx @mj-muin/-weight: 500;">git-why src/auth.js - It's 2am and your team is asleep - You're a solo dev with no reviewers - You know this function is ugly but can't articulate why - Onboarding — New team member? Point them at -weight: 500;">git-why instead of scheduling a 1-hour walkthrough. - Refactoring — Know what you're about to break before you break it. - Code archaeology — Finally understand that mysterious // DO NOT REMOVE comment. - Due diligence — Reviewing an inherited codebase? Get the "why" behind every decision. - portguard — Kill port zombies - -weight: 500;">git-why — Code archaeology - All packages on -weight: 500;">npm