-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
88 lines (60 loc) · 2.56 KB
/
Copy path__init__.py
File metadata and controls
88 lines (60 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""
python-devtools: Live runtime inspection for any Python app.
Embed a lightweight inspection server in your app, connect via MCP from
Claude Code or any LLM agent to query state, eval code, and inspect objects
while the app is running.
Quick start:
import python_devtools as devtools
devtools.register('app', my_app)
devtools.register('storage', storage)
devtools.start(app_id='my-app') # Auto-selects a free local port
Argparse integration:
devtools.add_arguments(parser) # Adds --devtools, --devtools-port, --devtools-app-id, --devtools-readonly
args = parser.parse_args()
devtools.from_args(args, app=my_app, storage=storage)
Threading safety (GUI apps):
devtools.set_main_thread_invoker(my_invoke_callback)
devtools.start()
Claude Code connects via the CLI bridge:
python-devtools
"""
from __future__ import annotations
from collections.abc import Callable
from python_devtools._core import DevTools
# Module-level singleton — most apps just need one
_default = DevTools()
def register(name: str, obj: object) -> None:
"""Register an object under a name in the default devtools instance."""
_default.register(name, obj)
def set_main_thread_invoker(callback: Callable | None) -> None:
"""Set a callback that routes resolve/eval onto the app's main thread."""
_default.set_main_thread_invoker(callback)
def set_screenshot_fn(callback: Callable[[], bytes] | None) -> None:
"""Register a callback that captures the app's GUI as PNG bytes."""
_default.set_screenshot_fn(callback)
def set_winshot_fn(callback: Callable[[str], bytes] | None) -> None:
"""Register a callback that renders code in an offscreen window and returns PNG bytes."""
_default.set_winshot_fn(callback)
def start(*, port: int = 0, host: str = 'localhost', readonly: bool = False, app_id: str | None = None) -> None:
"""Start the devtools inspection server on the default instance."""
_default.start(port=port, host=host, readonly=readonly, app_id=app_id)
def add_arguments(parser) -> None:
"""Add --devtools, --devtools-port, --devtools-app-id, --devtools-readonly."""
_default.add_arguments(parser)
def from_args(args, **namespaces) -> None:
"""Register namespaces and start if --devtools was passed."""
_default.from_args(args, **namespaces)
def stop() -> None:
"""Stop the devtools inspection server."""
_default.stop()
__all__ = [
'DevTools',
'add_arguments',
'from_args',
'register',
'set_main_thread_invoker',
'set_screenshot_fn',
'set_winshot_fn',
'start',
'stop',
]