Hypothesis-driven debugging with runtime log instrumentation for Claude Code
npx claudepluginhub mikecfisher/agent-debug-modeHypothesis-driven debugging with runtime log instrumentation. Use for bug reports, unexpected behavior, or when runtime evidence is needed.
This tool recreates Debug Mode found in other popular agentic code editors.
Debug Mode forces a disciplined debugging process:
The repo is packaged as a skills.sh bundle and can be installed into multiple agents from the same source.
Install into Codex:
bunx skills add https://github.com/mikecfisher/claude-debug-mode --agent codex -y
Install into Claude Code:
bunx skills add https://github.com/mikecfisher/claude-debug-mode --agent claude-code -y
Install from a local checkout during development:
bunx skills add /absolute/path/to/claude-debug-mode --agent codex -y
bunx skills add /absolute/path/to/claude-debug-mode --agent claude-code -y
The bundle exposes three skills:
debug-modedebug-reproduceddebug-fixedThe skill runtime is self-contained. Each installed skill carries its own helper scripts, so it does not depend on CLAUDE_PLUGIN_ROOT or repo-root script paths.
First, add the marketplace:
/plugin marketplace add mikecfisher/claude-debug-mode
Then install the plugin:
/plugin install debug-mode@mikecfisher-claude-debug-mode
Restart Claude Code to load the plugin. Restart Codex after installing skills there so the new skills are picked up.
git clone https://github.com/mikecfisher/claude-debug-mode.git
claude --plugin-dir ./claude-debug-mode
You can also load multiple plugins:
claude --plugin-dir ./claude-debug-mode --plugin-dir ./other-plugin
Start debugging — Describe your bug:
/debug-mode The checkout button isn't working
Reproduce — Follow Claude's reproduction steps to trigger the bug
Report result — Run one of:
/debug-reproduced — Bug still happening (Claude analyzes logs, iterates)/debug-fixed — Bug is fixed (Claude cleans up instrumentation)/debug-mode — Claude generates hypotheses and instruments codeWhen you report a bug, Claude creates specific, testable theories:
| ID | Hypothesis |
|---|---|
| A | items array is undefined when order.items isn't provided |
| B | Race condition: loadUser completes after renderProfile |
| C | API returns 200 but empty body on timeout |
Then instruments your code with logging:
// Before
async function processOrder(orderId, items) {
const validated = validateItems(items);
return await saveOrder(orderId, validated);
}
// After (instrumented)
async function processOrder(orderId, items) {
__debugLog("orders.ts:processOrder", "A", "Entry", { orderId, itemCount: items?.length });
const validated = validateItems(items);
__debugLog("orders.ts:processOrder", "A", "After validation", { validated: !!validated });
return await saveOrder(orderId, validated);
}
Follow Claude's reproduction steps. Logs capture exactly what happens at runtime.
/debug-reproduced — Claude analyzes and iterates=== Debug Log Analysis ===
Total events: 12
Time range: 14:32:05.123 - 14:32:05.891
--- Hypothesis A (8 events) ---
Errors:
[14:32:05.156] orders.ts:processOrder
Cannot read property 'length' of undefined
--- Hypothesis B (4 events) ---
Errors: None
=== Summary ===
Hypothesis A has 1 error - likely root cause.
Claude implements a fix (keeping instrumentation), then asks you to reproduce again. This cycle continues until the bug is fixed.
/debug-fixed — Clean upClaude removes all instrumentation and provides a summary of the root cause and fix.
| Variable | Default | Description |
|---|---|---|
DEBUG_PORT | 7777 | Port for the log collector server |
DEBUG_PORT=8080 claude --plugin-dir ./claude-debug-mode
For skill installs, DEBUG_PORT is read by the bundled helper scripts at runtime. No agent-specific environment variables are required.