{"_id":"@adamancyzhang/agent-py-debugger","_rev":"4-39d6db5d1efeb31b1ce9b68ecaf2d759","name":"@adamancyzhang/agent-py-debugger","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@adamancyzhang/agent-py-debugger","version":"0.1.0","keywords":["python","debugger","breakpoint","remote-debug","jdwp","cli","agent","step","trace","pdb"],"license":"MIT","_id":"@adamancyzhang/agent-py-debugger@0.1.0","maintainers":[{"name":"adamancyzhang","email":"adamancyzhang@163.com"}],"homepage":"https://github.com/adamancyzhang/agent-py-debugger#readme","bugs":{"url":"https://github.com/adamancyzhang/agent-py-debugger/issues"},"bin":{"agentdbg":"bin/agentdbg.mjs","agent-py-debugger":"bin/agentdbg.mjs"},"dist":{"shasum":"e41f9184b145d3edfd77148eac6443a4b9eebf81","tarball":"https://registry.npmjs.org/@adamancyzhang/agent-py-debugger/-/agent-py-debugger-0.1.0.tgz","fileCount":13,"integrity":"sha512-k7RMT27bH2RpDKbvI6vwC4RExyox+z6oVi10duec17OvMAp2/Ip4EDxXqTgtzcBYgAm6gXpqWE2/1CaeZOIy3g==","signatures":[{"sig":"MEQCIHNdFkDKrws+MlyEP3TwMly+9EsgsOohwrzg88dWHWQpAiBiwWCzWmzjugS3PlsTcIS4TOQ/RYTTc/pRGmfJHT98Hw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86082},"type":"module","engines":{"node":">=18"},"gitHead":"94a875a6628000fa266ad138613883602ad67db1","scripts":{"prepublishOnly":"python3 -m py_compile agentdbg/__init__.py agentdbg/__main__.py agentdbg/cli.py agentdbg/client.py agentdbg/connect.py agentdbg/format.py && rm -rf agentdbg/__pycache__"},"_npmUser":{"name":"adamancyzhang","email":"adamancyzhang@163.com"},"repository":{"url":"git+https://github.com/adamancyzhang/agent-py-debugger.git","type":"git"},"_npmVersion":"11.19.0","description":"Python breakpoint debugging CLI for AI agents — JDWP-style remote debug: breakpoints, stack, locals, eval and stepping over TCP. PyCharm-like, driven entirely from the command line.","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/agent-py-debugger_0.1.0_1788769480869_0.5161512880035575","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adamancyzhang/agent-py-debugger","version":"0.1.1","keywords":["python","debugger","breakpoint","remote-debug","jdwp","cli","agent","step","trace","pdb"],"license":"MIT","_id":"@adamancyzhang/agent-py-debugger@0.1.1","maintainers":[{"name":"adamancyzhang","email":"adamancyzhang@163.com"}],"homepage":"https://github.com/adamancyzhang/agent-py-debugger#readme","bugs":{"url":"https://github.com/adamancyzhang/agent-py-debugger/issues"},"bin":{"agent-py-debugger":"bin/agent-py-debugger.mjs"},"dist":{"shasum":"37f506b931e8ebff944de823c4a41205672608a8","tarball":"https://registry.npmjs.org/@adamancyzhang/agent-py-debugger/-/agent-py-debugger-0.1.1.tgz","fileCount":13,"integrity":"sha512-eBMmntB43fxSK3zoL36WMxJ8H72YT8JMFg9fn8IQN3HS+Dz6GZUoz280pQZmSTIarLHIv2Fjpbz6mNmZa+7oHA==","signatures":[{"sig":"MEUCIQD+EULJhtmo9jAdfR9i0Wf3v0/8eCmq7DxbZIzqJAaCewIgNdjKZCKYlzrydOiMVFZmAYozC0OctfvY6PfEYSL2iBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAicazXL7XEuw/FuekLClx4CwwbW9fp6LjnSlTFMEEeNAiAMUl528WQ/+0qUv0N2wWrDrCTI0LYQ4EOdY4ewwCQqyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90468},"type":"module","engines":{"node":">=18"},"gitHead":"e7714484a117cf91f4f8e226e85040ce7193b2bb","scripts":{"prepublishOnly":"python3 -m py_compile agentdbg/__init__.py agentdbg/__main__.py agentdbg/cli.py agentdbg/client.py agentdbg/connect.py agentdbg/format.py && rm -rf agentdbg/__pycache__"},"_npmUser":{"name":"adamancyzhang","email":"adamancyzhang@163.com"},"repository":{"url":"git+https://github.com/adamancyzhang/agent-py-debugger.git","type":"git"},"_npmVersion":"11.19.0","description":"Python breakpoint debugging CLI for AI agents — JDWP-style remote debug: breakpoints, stack, locals, eval and stepping over TCP. PyCharm-like, driven entirely from the command line.","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/agent-py-debugger_0.1.1_1788770567753_0.14711311194253884","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adamancyzhang/agent-py-debugger","version":"0.2.0","keywords":["python","debugger","breakpoint","remote-debug","jdwp","cli","agent","step","trace","pdb"],"license":"MIT","_id":"@adamancyzhang/agent-py-debugger@0.2.0","maintainers":[{"name":"adamancyzhang","email":"adamancyzhang@163.com"}],"homepage":"https://github.com/adamancyzhang/agent-py-debugger#readme","bugs":{"url":"https://github.com/adamancyzhang/agent-py-debugger/issues"},"bin":{"agent-py-debugger":"bin/agent-py-debugger.mjs"},"dist":{"shasum":"2470929ba21ecd2d16fa010d952a6b053c629b87","tarball":"https://registry.npmjs.org/@adamancyzhang/agent-py-debugger/-/agent-py-debugger-0.2.0.tgz","fileCount":13,"integrity":"sha512-4faFShrT/EgLvYCMzgXWKE3ifMGL1TA0gePxqmNhmKzf7kCxDywhBzz9xJLb/NXfH4crIrpddVmiFkhVrojvQQ==","signatures":[{"sig":"MEQCIFgsPuR1KzjtYM/UWagrPGRdqHRhXwuR5WYQ+gymMb34AiBCRyi92PJ4wHez9fWczOlQQY2sfzxHG4L7V3KxazvT8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHt4wEh5ofGLx8kGrUN9/YucEXmwLn0dREJHTcri9WnAAiEAjszwfjC8O8PIzP/IptzYc56m1ySEa2dAEoJIkbTIN4M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100038},"type":"module","engines":{"node":">=18"},"gitHead":"e7714484a117cf91f4f8e226e85040ce7193b2bb","scripts":{"prepublishOnly":"python3 -m py_compile agentdbg/__init__.py agentdbg/__main__.py agentdbg/cli.py agentdbg/client.py agentdbg/connect.py agentdbg/format.py && rm -rf agentdbg/__pycache__"},"_npmUser":{"name":"adamancyzhang","email":"adamancyzhang@163.com"},"repository":{"url":"git+https://github.com/adamancyzhang/agent-py-debugger.git","type":"git"},"_npmVersion":"11.19.0","description":"Python breakpoint debugging CLI for AI agents — JDWP-style remote debug: breakpoints, stack, locals, eval and stepping over TCP. PyCharm-like, driven entirely from the command line.","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/agent-py-debugger_0.2.0_1788848479047_0.30386541055117133","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@adamancyzhang/agent-py-debugger@0.2.1","bin":{"agent-py-debugger":"bin/agent-py-debugger.mjs"},"bugs":{"url":"https://github.com/adamancyzhang/agent-py-debugger/issues"},"dist":{"shasum":"a1b5c08de85efdd2c003549c7bb3311c5a452242","tarball":"https://registry.npmjs.org/@adamancyzhang/agent-py-debugger/-/agent-py-debugger-0.2.1.tgz","fileCount":12,"integrity":"sha512-qsgZzgtzwHf+NgH04ySyOwRBSI5rzjO5euTsgblzMQzgA4g7yoNuup6x89eldsBAQDfVGs4aM9Q3ZbjvjysWUQ==","signatures":[{"sig":"MEUCIBhg8w7vX5DNFFBX9C5aqCMr3/2MLbq841xqdKHpG1q8AiEA1egDT7YzkB8zzPj7X3tSFARHqh1cqlOG57wthbBFACk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGBFx3DwTjvx7jDXLxZeUJy2F9TLHvMyH8+eZJJMOtzwAiAlBM2NyO8E+Xmi2+Dfnb65oeDPtC02Q1xkuicFVomo0g=="}],"unpackedSize":96682},"name":"@adamancyzhang/agent-py-debugger","type":"module","engines":{"node":">=18"},"gitHead":"8259cb9258fc2c18a7d67aa4b12392bebaa7a24d","license":"MIT","scripts":{"prepublishOnly":"python3 -m py_compile agentdbg/__init__.py agentdbg/__main__.py agentdbg/cli.py agentdbg/client.py agentdbg/connect.py agentdbg/format.py && rm -rf agentdbg/__pycache__"},"version":"0.2.1","_npmUser":{"name":"adamancyzhang","email":"adamancyzhang@163.com"},"homepage":"https://github.com/adamancyzhang/agent-py-debugger#readme","keywords":["python","debugger","breakpoint","remote-debug","jdwp","cli","agent","step","trace","pdb"],"repository":{"url":"git+https://github.com/adamancyzhang/agent-py-debugger.git","type":"git"},"_npmVersion":"11.19.0","description":"Python breakpoint debugging CLI for AI agents — JDWP-style remote debug: breakpoints, stack, locals, eval and stepping over TCP. PyCharm-like, driven entirely from the command line.","directories":{},"maintainers":[{"name":"adamancyzhang","email":"adamancyzhang@163.com"}],"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/agent-py-debugger_0.2.1_1788850544336_0.48629303760300924"}}},"time":{"created":"2026-09-07T08:24:40.691Z","modified":"2026-09-08T06:55:44.556Z","0.1.0":"2026-09-07T08:24:41.006Z","0.1.1":"2026-09-07T08:42:47.842Z","0.2.0":"2026-09-08T06:21:19.124Z","0.2.1":"2026-09-08T06:55:44.409Z"},"bugs":{"url":"https://github.com/adamancyzhang/agent-py-debugger/issues"},"license":"MIT","homepage":"https://github.com/adamancyzhang/agent-py-debugger#readme","keywords":["python","debugger","breakpoint","remote-debug","jdwp","cli","agent","step","trace","pdb"],"repository":{"url":"git+https://github.com/adamancyzhang/agent-py-debugger.git","type":"git"},"description":"Python breakpoint debugging CLI for AI agents — JDWP-style remote debug: breakpoints, stack, locals, eval and stepping over TCP. PyCharm-like, driven entirely from the command line.","maintainers":[{"name":"adamancyzhang","email":"adamancyzhang@163.com"}],"readme":"# agent-py-debugger\n\nBreakpoint debugging for Python services from the command line — no IDE required. Built for AI agents: stable machine-readable output, plus a human-readable text format.\n\n[![npm version](https://img.shields.io/npm/v/%40adamancyzhang%2Fagent-py-debugger)](https://www.npmjs.com/package/@adamancyzhang/agent-py-debugger)\n[![license](https://img.shields.io/npm/l/%40adamancyzhang%2Fagent-py-debugger)](LICENSE)\n[![node](https://img.shields.io/badge/node-%3E%3D18-green)](package.json)\n\n## What it does\n\nagent-py-debugger debugs Python processes the way JVM remote debugging (JDWP) works: the target starts with a debug listener and the CLI connects over TCP. A pure-stdlib trace engine (`sys.settrace` / `threading.settrace`) runs inside the target process — breakpoints, pause state, and the protocol server all live there — so every CLI invocation is a stateless one-shot connection, exactly what an agent tool layer needs.\n\n```bash\nagent-py-debugger connect 127.0.0.1:5678            # open a session against a listener\nagent-py-debugger breakpoint set app/api/users.py 120\nagent-py-debugger wait                               # block until a thread pauses\nagent-py-debugger locals --depth 2                   # local variables (in-memory data)\nagent-py-debugger eval \"token_pair.expires_in\"       # evaluate any expression\nagent-py-debugger continue                           # release the paused thread\n```\n\nThe debugged process can be anywhere — any OS, any CPU. Only the machine running the CLI needs Python 3.8+.\n\n## Installation\n\n### Global (recommended)\n\n```bash\nnpm install -g @adamancyzhang/agent-py-debugger\n```\n\nRequires Node >= 18 (launcher shim only) and Python 3.8+ (the CLI itself is pure Python — no pip packages needed; the interpreter is discovered automatically, override with `AGENTDBG_PYTHON`).\n\n### From source\n\n```bash\ngit clone https://github.com/adamancyzhang/agent-py-debugger.git\ncd agent-py-debugger\nnpm link\n```\n\n### As a dependency of the target project\n\nThe debug listener ships as a Python package; add it to the target's environment so the app can be started with debugging enabled:\n\n```toml\n# pyproject.toml of the target project\ndependencies = [..., \"agentdbg>=0.1.1\"]\n[tool.uv.sources]\nagentdbg = { path = \"/path/to/agent-py-debugger\" }   # or a git URL / PyPI\n```\n\nThen `uv sync` (or `pip install -e .`). Equivalent without any package manager:\n\n```bash\npython -m agentdbg install /path/to/venv/lib/python3.12/site-packages\n```\n\n## Enabling debugging in the target\n\nThe target process must be started with the debug listener — one of three equivalent ways:\n\n```bash\n# ① CLI wrapper — no configuration changes. Non-blocking by default (suspend=n):\nagent-py-debugger run --port 5678 -- -m uvicorn app.main:app --host 0.0.0.0 --port 3003\n#    --suspend: suspend=y — wait for `agent-py-debugger resume` before running\n#    --foreground: stay in the foreground (Ctrl-C stops, like plain uvicorn)\n\n# ② Environment variable + sitecustomize — docker/systemd friendly.\n#    The wheel installs a sitecustomize.py that is a strict no-op unless\n#    AGENTDBG_LISTEN is set:\nAGENTDBG_LISTEN=127.0.0.1:5678 AGENTDBG_TOKEN=secret .venv/bin/uvicorn app.main:app --port 3003\n#    AGENTDBG_SUSPEND=1 = suspend=y · AGENTDBG_AUTO_CONTINUE=300 · AGENTDBG_LOG=/tmp/dbg.log\n\n# ③ Explicit in code (the debugpy.listen equivalent):\n#    import agentdbg.client as c\n#    c.listen(host=\"127.0.0.1\", port=5678, token=\"secret\")\n```\n\nJVM mapping: `run` (default) = `suspend=n` — the app runs completely normally while no debugger is connected, and a debugger can connect or disconnect at any time. `disconnect` resumes every paused thread and keeps the listener and breakpoints (JVM disconnect semantics); `detach` removes tracing entirely and shuts the listener down. Neither stops the process: a target started with `run` is owned by agent-py-debugger and is stopped with `kill --session <port>`; a target started outside agentdbg (options ② / ③) is its owner's to stop — agentdbg never kills it.\n\n## Quick Start\n\n```bash\nagent-py-debugger connect 127.0.0.1:5678 --token secret   # session (token optional if one exists)\nagent-py-debugger breakpoint set app/auth/router.py 60\nagent-py-debugger breakpoint set router.py:60 --condition 'body.email.endswith(\"dev\")'\nagent-py-debugger breakpoint list / delete 1 / enable 1 / disable 1\ncurl -s http://localhost:3003/api/... &     # drive the app; the request hangs at the breakpoint\nagent-py-debugger wait --timeout 30         # block until a thread pauses\nagent-py-debugger status                    # paused threads + reason + breakpoint id\nagent-py-debugger stack                     # call stack with file:line and code line\nagent-py-debugger locals --depth 2          # local variables, recursive type/length/truncation\nagent-py-debugger eval \"token_pair.expires_in\"\nagent-py-debugger step --over | --into | --out\nagent-py-debugger continue                  # release the request\nagent-py-debugger disconnect                # resume everything, end the interaction\nagent-py-debugger kill --session 5678       # done with a 'run'-launched target: stop it, clean session + logs\nagent-py-debugger detach                    # externally-started target only: remove tracing, process keeps running\n```\n\n## Commands\n\n### connect\n\n```\nagent-py-debugger connect <host:port> [--token T]\n```\n\nVerifies the listener and records a session in `~/.agentdbg/<name>.json` (0600, token inside). Subsequent commands reuse the latest session; select one with `--session <name>` or `AGENTDBG_SESSION`.\n\n### run\n\n```\nagent-py-debugger run [--port N] [--token T] [--suspend] [--foreground] [--auto-continue S] -- <python> <script | -m module> [args...]\n```\n\nLaunches a new process with the listener enabled. Non-blocking by default: the command returns as soon as the listener is up and the app keeps running (logs: `~/.agentdbg/run-<token>/app.log`). The interpreter may be omitted (`-m uvicorn …` or a `.py` path are auto-detected). The target keeps running across `connect`/`disconnect`/`detach` — stop it with `kill` when you are done with it (below).\n\n### breakpoint\n\n```\nagent-py-debugger breakpoint set <file> <line> | file:line [--condition E] [--temporary] [--disabled]\nagent-py-debugger breakpoint list | delete <id> | delete --all | enable <id> | disable <id>\n```\n\nPaths are realpath-normalized, symlinks fine. Setting a breakpoint warns when the line carries no bytecode (it would never hit). Conditional breakpoints evaluate the expression in the hit frame; a failing condition is reported on the breakpoint instead of stopping.\n\n### wait\n\n```\nagent-py-debugger wait [--timeout S]\n```\n\nBlocks until a thread pauses (or the timeout). Exit code `2` means \"no pause within the timeout\" — the agent can branch on it.\n\n### status / stack / locals / globals / eval\n\n```\nagent-py-debugger status\nagent-py-debugger stack [--thread T]\nagent-py-debugger locals [--thread T] [--frame I] [--depth D] [--all]\nagent-py-debugger globals [--thread T] [--frame I] [--depth D] [--all]\nagent-py-debugger eval <expr> [--thread T] [--frame I] [--timeout S]\n```\n\n`locals`/`globals` produce recursive descriptions with type, length and truncation — the Variables-view equivalent. `eval` runs in the paused frame with a timeout (user expressions that hang are contained). `--frame` selects any frame of the paused thread's stack.\n\n### step / continue / disconnect / detach\n\n```\nagent-py-debugger step --over | --into | --out [--thread T]\nagent-py-debugger continue [--thread T | --all]\nagent-py-debugger disconnect\nagent-py-debugger detach\n```\n\nPyCharm stepping semantics. A breakpoint triggers once per execution pass — the CPython after-call line event does not re-trigger it, loop iterations do. `disconnect` = JVM disconnect (resume everything, listener + breakpoints kept, reconnect anytime). `detach` removes tracing and shuts the listener down — it is only accepted for targets that were started **outside** `agentdbg run`; on a `run`-managed target it is refused, because the process would be left running with no owner.\n\n### kill\n\n```\nagent-py-debugger kill --session <name> | --pid <pid> [--json]\n```\n\nStops a target that `agentdbg run` launched: SIGTERM, SIGKILL escalation after ~5s, then removal of the session file and the `~/.agentdbg/run-<token>/` workdir. The name is a session name from `agentdbg sessions` (the listener port); `--session` is explicit — `kill` never falls back to the latest session. `--pid` is the rescue path for targets whose session file was lost (orphans from an interrupted session).\n\nOwnership is verified against the live process: only a pid running under an agentdbg run bootstrap (`~/.agentdbg/run-*/bootstrap.py`) is ever killed. A session recorded via `connect` — a service started with `AGENTDBG_LISTEN`/`install`, a process on another machine — is refused with an error: stopping those services belongs to their owner, and `detach` remains the way to end debugging without touching the process.\n\n### sessions / repl / install / resume\n\n```\nagent-py-debugger sessions\nagent-py-debugger repl\nagent-py-debugger install <site-packages-dir>\nagent-py-debugger resume\n```\n\n`sessions` lists recorded sessions; `repl` is an interactive prompt for humans; `install` copies the package + sitecustomize into a venv without any package manager; `resume` releases a suspend=y target.\n\n## Agent Mode\n\n`--json` prints a single-line envelope on stdout — errors included:\n\n```json\n{\"ok\":true,\"paused\":true,\"paused_threads\":[{\"thread_id\":8451547520,\"thread_name\":\"MainThread\",\n \"reason\":\"breakpoint\",\"breakpoint_id\":1}],\"threads\":[…],\"breakpoints\":2,\"suspended\":false,\"pid\":16283}\n```\n\nExit codes: `0` success / `1` protocol error / `2` `wait` timed out without a pause. Every command accepts `--json`; the pause/inspection responses are stable objects safe for `jq`.\n\n## Limits & Caveats\n\n- **One listener per process**; after `detach` a minimal per-call hook remains until the process restarts.\n- **A `run` target never stops itself** — `disconnect`/`detach` leave the process running by design (JVM model). Stop it with `kill` when done; a `run` target that is only ever detached becomes an orphan. Targets started outside agentdbg keep running under their own owner.\n- **One thread paused, others running** — suspend-all is a future version. Use `--thread` when stepping multi-threaded programs.\n- **Tracing overhead**: while the listener is active the target runs under a trace hook (dict-lookup hot path; the same cost class as PyCharm's debugger). `detach` removes it.\n- **Raw threads** created via `_thread.start_new_thread` are not traced; `threading.Thread` and asyncio code paths are fully covered.\n- **A dead agent session cannot freeze the app forever** if the target was started with `--auto-continue` (recommended for production-like targets); pauses always outlive CLI disconnects, so reconnect + continue always works.\n- Trusted networks only: the listener binds a configurable address and requires the session token.\n\n## Skill for AI Coding Assistants\n\nInstall the agent-py-debugger skill with the [skills](https://skills.sh) CLI, directly from GitHub:\n\n```bash\nnpx skills add adamancyzhang/agent-py-debugger\n```\n\nThe skill is fetched from this repository (`skills/agent-py-debugger/SKILL.md`), so it stays up to date automatically. Works with Claude Code, Codex, Cursor, Gemini CLI, and other skills-aware assistants. Do not copy `SKILL.md` from `node_modules` — it will become stale.\n\nManual install for Claude Code:\n\n```bash\nmkdir -p .claude/skills\ncp -r skills/agent-py-debugger .claude/skills/\n```\n\n## Development\n\n```bash\npython3 tests/e2e.py            # end-to-end suite: run/suspend/install modes, breakpoint flow,\n                                # after-call no-retrigger regression, connect reliability, kill lifecycle\nnpm pack --dry-run              # verify the npm tarball\nuv build                        # build the python wheel (sitecustomize included)\n```\n\nLayout: `agentdbg/` (the Python package: `client.py` trace engine + protocol server, `cli.py` commands, `connect.py` sessions/installation, `format.py` memory formatting) · `bin/` (npm launcher shim) · `skills/` (agent skill docs) · `tests/` (scratch target + e2e suite) · `sitecustomize.py` (AGENTDBG_LISTEN bootstrap, shipped by the wheel).\n\n## Roadmap\n\n- Suspend-all pause mode (PyCharm \"pause all threads\")\n- Tracepoint breakpoints (log and continue)\n- Exception breakpoints\n- Windows raw-thread coverage via a C-level hook\n\n## License\n\n[MIT](LICENSE) © 2026 Adamancy Zhang\n","readmeFilename":"README.md"}