Loading...
Loading...
Use when a program crashes, a test fails, or code produces wrong results and reading the source isn't enough to see why. Lets you pause execution at any line and inspect the actual runtime state, variable values, types, call stacks, to find what went wrong.
npx skill4agent add joaquincampo/agent-debugger agent-debuggerevalvarsstepstacksourcexbalancevarseval "type(data['age'])"--break "file:line:i == 50"evalagent-debuggernpx -y agent-debugger# If installed globally:
agent-debugger start <script> --break file:line[:condition] [--runtime path] [--args ...]
# If not installed:
npx -y agent-debugger start <script> --break file:line[:condition] [--runtime path] [--args ...]
agent-debugger eval <expression> # Run any expression in the current frame
agent-debugger vars # List local variables (prefer eval)
agent-debugger step [into|out] # Step over / into function / out of function
agent-debugger continue # Run to next breakpoint or termination
agent-debugger stack # Show call stack
agent-debugger break file:line[:cond] # Add breakpoint mid-session
agent-debugger source # Show source around current line
agent-debugger status # Show session state and location
agent-debugger close # Kill session, clean up--break--break "app.py:42:len(items) > 10"| Language | Extension | Adapter | Requirement |
|---|---|---|---|
| Python | .py | debugpy | |
| JavaScript/TypeScript | .js/.ts | Node Inspector | Node.js |
| Go | .go | Delve | |
| Rust/C/C++ | .rs/.c/.cpp | CodeLLDB | |
agent-debugger start app.py --break "app.py:25"
agent-debugger eval "type(data['age'])" # <class 'str'> — found it
agent-debugger eval "int(data['age'])" # 35 — fix is safe
agent-debugger closeagent-debugger start etl.py --break "etl.py:90" # after the transformation
agent-debugger eval "all(isinstance(v, int) for v in result.values())" # False
agent-debugger eval "[k for k,v in result.items() if not isinstance(v, int)]" # ['quantity']
agent-debugger closeagent-debugger start app.py --break "app.py:45:i == 500" # midpoint
agent-debugger eval "is_valid(result)" # True → bug is after 500
agent-debugger close
agent-debugger start app.py --break "app.py:45:i == 750" # narrow
agent-debugger eval "is_valid(result)" # False → bug is between 500-750
agent-debugger close
agent-debugger start app.py --break "app.py:45:i == 625" # narrow again# "balance should never go negative"
agent-debugger start bank.py --break "bank.py:68:account.balance < 0"
# "every value should be numeric"
agent-debugger start pipeline.py --break "pipeline.py:30:not isinstance(value, (int, float))"
# "list should never exceed 100 items"
agent-debugger start app.py --break "app.py:55:len(results) > 100"agent-debugger start tree.py --break "tree.py:22"
agent-debugger stack # see the recursion depth
agent-debugger eval "current_depth" # 3
agent-debugger eval "max_depth" # 3 — off-by-one, should be <, not <=
agent-debugger closeagent-debugger start app.py --break "handler.py:55"
agent-debugger eval "data['age']" # '35' — string, wrong. But handler didn't create this.
agent-debugger close # pivot to the source
agent-debugger start app.py --break "loader.py:22"
agent-debugger eval "raw_row" # CSV parser returns strings. Root cause.
agent-debugger closeagent-debugger start app.py \
--break "auth.py:30" \
--break "validate.py:55" \
--break "handler.py:80"
# Hits validate.py:55 — now you know where to focus
agent-debugger eval "request.payload"
agent-debugger close# Paused at the crash: total + data['age'] where age is a string
agent-debugger eval "total + int(data['age'])" # 90 — works
agent-debugger eval "int(data['age'])" # 35 — safe cast
# Prove it works for the entire dataset
agent-debugger eval "sum(int(d['age']) if isinstance(d['age'], str) else d['age'] for d in users)"
agent-debugger close
# NOW edit the code, with confidence# Theory: "age is a string only in the third record"
# BAD — only confirms
agent-debugger eval "isinstance(data['age'], str)" # True. But so what?
# GOOD — tries to disprove
agent-debugger eval "isinstance(users[0]['age'], str)" # False — not all records
agent-debugger eval "isinstance(users[1]['age'], str)" # False — so it IS specific to record 3
agent-debugger eval "users[2]" # {'name': 'Charlie', 'age': '35'} — source data is wrongstepvarsevalagent-debugger closeclosedebugpypip install debugpyeval