Luxe

Debugging

A native debugger, driven by the agent.

The debug tool is a first-class, always-available tool (the model sees it in every request, like read/bash) and its description steers the model to prefer it over print-debugging. To reinforce that for models that default to edit-and-retry, Luxe also nudges toward the debugger when tests keep failing: after 3 consecutive failing test runs (the test tool or a bash test command) it appends a one-time hint suggesting a breakpoint-and-inspect pass (toggle: LUXE_DEBUG_NUDGE=0). While a session is live, the Context Dock shows a DEBUG section (program + running/stopped). Full guide: docs/guide/debugging-guide.md.

The debug tool drives a real debugger (DAP). Built-in adapters (shipped as a data file, crates/luxe-dap/src/default-debug-adapters.json, merged with your config through one schema): debugpy (Python, .py), CodeLLDB/lldb-dap/gdb (Rust/C/C++ binaries), and Delve (Go, .go). Run /debug in the TUI to see the adapters, which are installed, and any active debug sessions. Add more languages without a code change via ~/.config/luxe/debug-adapters.json — a JSON array reusing a built-in launch dialect:

[
  {
    "id": "ruby",
    "command": ["rdbg", "--open", "--port", "${DAP_ADDR}"],
    "extensions": ["rb"],
    "dialect": "debugpy",
    "transport": "tcp_dial_in"
  }
]

dialect is the launch-arg shape (debugpy | lldb | gdb | delve); transport is stdio (default) or tcp_dial_in (the adapter dials back into a loopback port Luxe binds, with ${DAP_ADDR} replaced by host:port). A configured extensions entry auto-routes matching files; any adapter is also selectable via the tool’s adapter argument.