DEV Community

무적이
무적이

Posted on

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

You know that moment where you lose 3 minutes to something stupid?

EADDRINUSE. A stack trace you have to manually paste into ChatGPT. A mysterious function nobody documented. A code review that can't happen because it's 2am.

Individually, these are minor. Collectively, they steal 60+ hours a year from your workflow.

I've been using 4 CLI tools that each solve one of these problems. They're all npx-ready — you can try them in the next 30 seconds without installing anything.


1. 🛡️ portguard — Kill EADDRINUSE Instantly

The problem everyone pretends doesn't bother them:

Error: listen EADDRINUSE: address already in use :::3000
Enter fullscreen mode Exit fullscreen mode

Every time this happens, you do the same dance:

lsof -i :3000          # wait for it...
# squint at the output, find the PID
kill -9 12345           # hope you killed the right one
Enter fullscreen mode Exit fullscreen mode

It's 30 seconds. But it happens 3-5 times a day during active development.

The fix:

npx @mj-muin/portguard kill 3000
Enter fullscreen mode Exit fullscreen mode

Done. One command. No PID hunting, no wrong-process anxiety.

The real power move — add it to package.json:

{
  "scripts": {
    "predev": "npx @mj-muin/portguard kill 3000 --silent",
    "dev": "next dev"
  }
}
Enter fullscreen mode Exit fullscreen mode

Now port conflicts literally can't happen. Your npm run dev cleans up before starting.

No API key. No config. No dependencies drama. This is the tool I recommend first because it costs you nothing to try.

📦 npmjs.com/package/@mj-muin/portguard


2. 🔥 roast — Gordon Ramsay for Your Code

The 2am problem:

You're working solo. Or your team's in a different timezone. You know this function is bad but can't articulate why. There's nobody to review your code.

What you'd normally do:

  • Paste code into ChatGPT (loses file context)
  • Write a PR and wait 12 hours (kills momentum)
  • Ship it and hope (we all know how this ends)

What you do instead:

npx @mj-muin/roast src/utils.js
Enter fullscreen mode Exit fullscreen mode
🔥 ROAST REPORT: src/utils.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.
Enter fullscreen mode Exit fullscreen mode

It's not just criticism — it's education. Every issue comes with why it's bad and how to fix it. Like a senior dev who's grumpy but helpful.

When this saves your neck:

  • Solo dev with nobody to review
  • Onboarding yourself onto a new codebase
  • Pre-PR sanity check before bothering your team
  • Learning — the roast explains patterns you might not know

📦 npmjs.com/package/@mj-muin/roast (requires ANTHROPIC_API_KEY)


3. 🏺 git-why — Understand Legacy Code Without Bothering Anyone

The onboarding problem:

You join a project. You see this:

// DO NOT REMOVE — breaks production
const delay = await sleep(2100);
Enter fullscreen mode Exit fullscreen mode

git blame tells you Sarah wrote it 18 months ago. Sarah left the company 6 months ago. The commit message says "fix."

Helpful.

The real question isn't who wrote it or when — it's why.

npx @mj-muin/git-why src/auth.js
Enter fullscreen mode Exit fullscreen mode

git-why reads git history — commits, diffs, messages across the file's lifetime — and uses AI to reconstruct the intent behind changes.

It might tell you: "This 2.1-second delay was added after commit a3f7c2d because the auth provider rate-limits requests under 2 seconds apart. See PR #142 for the incident report."

Now you know not to remove it. Or that you can remove it if you switch auth providers.

Where this is invaluable:

  • Onboarding: New team member ramps up in hours, not weeks
  • Refactoring: Know what you'll break before you break it
  • Code archaeology: That // HACK comment from 2019 finally makes sense
  • Due diligence: Evaluating an acquired codebase

📦 npmjs.com/package/@mj-muin/git-why (requires ANTHROPIC_API_KEY)


4. 💥 oops — Pipe Errors Directly to AI

The context-switching tax:

Your app crashes. You get a stack trace. Here's what happens next:

  1. Copy the error
  2. Open browser
  3. Navigate to ChatGPT
  4. Paste error
  5. Wait for response
  6. Context-switch back to terminal
  7. Realize you forgot to include the file contents
  8. Repeat steps 1-6

That's not debugging. That's a scavenger hunt.

The fix:

node app.js 2>&1 | oops
Enter fullscreen mode Exit fullscreen mode

That's it. The full stderr — stack trace, file paths, line numbers, everything — goes directly to AI analysis. The response appears right in your terminal.

$ 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 auth middleware
   isn't running before this route handler.

🔧 Fix: Add auth middleware before the route:
   app.get('/profile', authMiddleware, profileHandler)
Enter fullscreen mode Exit fullscreen mode

No tab switching. No copy-paste. No losing your mental context. The answer shows up where you're already working.

Works with anything that outputs to stderr:

python train.py 2>&1 | oops
cargo build 2>&1 | oops
go run main.go 2>&1 | oops
Enter fullscreen mode Exit fullscreen mode

📦 npmjs.com/package/@mj-muin/oops-cli (requires ANTHROPIC_API_KEY)


Try Them Right Now

# Zero config — works immediately
npx @mj-muin/portguard list

# AI-powered (one-time setup)
export ANTHROPIC_API_KEY=sk-ant-...

npx @mj-muin/roast src/index.js
npx @mj-muin/git-why src/auth.js
node app.js 2>&1 | oops
Enter fullscreen mode Exit fullscreen mode

Three of the four need an Anthropic API key. portguard needs absolutely nothing.

All four are open source, MIT licensed, and on npm under @mj-muin.


The Backstory

These tools weren't built by a product team with a roadmap. They were built by an AI COO — literally an AI agent running operations for a one-person company — over the course of 52 days.

If you're curious about what it's like to run a company where the COO is a language model and the tools get built by sub-agents, I wrote about the honest numbers (711 commits, 0 users, $0 revenue) in the first post of this series:

👉 Day 52: Building vs Shipping — Why We Had 711 Commits and 0 Users


What's your most annoying daily dev friction? I'm always looking for the next 30-second problem to automate away. 👇

Top comments (0)