Tools: 4 CLI Tools Every Developer Needs (That You've Never Heard Of)

Tools: 4 CLI Tools Every Developer Needs (That You've Never Heard Of)

1. 🛡️ portguard — Kill Port Zombies in One Command

The Problem

The Fix

Real-World Usage

2. 🔥 oops — Pipe Error Messages Straight to AI

The Problem

The Fix

What It Looks Like

3. 🔥 roast — AI Code Reviews at 2am

The Problem

The Fix

Sample Output

4. 🏺 git-why — Understand Why Code Exists

The Problem

The Fix

When You Need This

The Philosophy Behind These Tools

Quick Start

Built by an AI-First Company Every developer has their toolkit. VS Code, Git, maybe a fancy terminal. But the best productivity gains come from tiny CLI tools that eliminate those 30-second annoyances you face 20 times a day. That's 10 minutes daily. 60 hours a year — gone to friction. I built 4 tools to fix that. They're small, open source, and npx-ready — meaning you can try them right now without installing anything. Let me walk you through each one. Sound familiar? You lsof -i :3000, squint at the output, find the PID, then kill -9 it. Every. Single. Time. That's it. See what's running on your ports and kill it — one command. Add it to your package.json and never think about port conflicts again: Why this one's first: No AI. No API keys. No config. Zero friction. It just solves a problem every web developer hits daily. 📦 @mj-muin/portguard — GitHub You get a stack trace. You copy it. Open ChatGPT. Paste it. Wait. Read the response. Switch back to your terminal. Lose your context. That's 6 steps for every error. And you probably forgot to include the relevant file paths. oops catches the full stderr output — stack traces, file paths, line numbers, the works — and sends it to Claude for instant analysis. The AI gets complete context, not your hurried copy-paste. No tab switching. No copy-paste. Solution appears right where you're working. 📦 @mj-muin/oops-cli — requires ANTHROPIC_API_KEY You want a code review, but: roast reads your file and delivers a brutally honest code review. Bugs, code smells, anti-patterns — with a side of personality. Think "senior developer who's tired of your BS but genuinely wants you to succeed." It's educational, not just critical. Perfect for learning why something is bad, not just that it is. 📦 @mj-muin/roast — requires ANTHROPIC_API_KEY git blame tells you who wrote a line and when. But it doesn't tell you why. You see a weird workaround from 2 years ago. Was it a bug fix? A performance hack? A client requirement? A 3am panic commit? You have no idea — and you're about to refactor it into oblivion. git-why reads your git history — commits, diffs, messages — and uses AI to explain the intent behind code changes. It's like having the original author sit next to you and walk through their thinking. 📦 @mj-muin/git-why — GitHub — requires ANTHROPIC_API_KEY These tools share a few principles: Three of them (oops, roast, git-why) use Claude under the hood and need an ANTHROPIC_API_KEY. portguard needs absolutely nothing. These tools are built by MUIN — a company where the COO is literally an AI agent. We build tools for developers because we are developers (well, one of us is a developer; the other is an AI that thinks it's a developer). If any of these save you even 5 minutes a day, that's 30 hours a year back in your life. ⭐ Star the repos if they help. Open issues if they don't. PRs welcome. What CLI tools can't you live without? Drop them in the comments — always looking for new additions to the toolbox. 👇 Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to ? It will become hidden in your post, but will still be visible via the comment's permalink. as well , this person and/or

Command

Copy

# 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