replx 1.22.0__tar.gz → 1.22.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. {replx-1.22.0/replx.egg-info → replx-1.22.2}/PKG-INFO +1 -1
  2. {replx-1.22.0 → replx-1.22.2}/replx/__init__.py +1 -1
  3. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/device.py +18 -1
  4. {replx-1.22.0 → replx-1.22.2}/replx/cli/config.py +0 -14
  5. {replx-1.22.0 → replx-1.22.2}/replx/cli/connection.py +4 -2
  6. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/scanner.py +9 -3
  7. {replx-1.22.0 → replx-1.22.2/replx.egg-info}/PKG-INFO +1 -1
  8. {replx-1.22.0 → replx-1.22.2}/LICENSE +0 -0
  9. {replx-1.22.0 → replx-1.22.2}/README.md +0 -0
  10. {replx-1.22.0 → replx-1.22.2}/pyproject.toml +0 -0
  11. {replx-1.22.0 → replx-1.22.2}/replx/__main__.py +0 -0
  12. {replx-1.22.0 → replx-1.22.2}/replx/cli/__init__.py +0 -0
  13. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/__init__.py +0 -0
  14. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/client/__init__.py +0 -0
  15. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/client/core.py +0 -0
  16. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/client/session.py +0 -0
  17. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/protocol.py +0 -0
  18. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/__init__.py +0 -0
  19. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/__main__.py +0 -0
  20. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/command_dispatcher.py +0 -0
  21. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/connection_manager.py +0 -0
  22. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/core.py +0 -0
  23. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/__init__.py +0 -0
  24. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/exec.py +0 -0
  25. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/filesystem.py +0 -0
  26. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/i2c.py +0 -0
  27. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/repl.py +0 -0
  28. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/session.py +0 -0
  29. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/spi.py +0 -0
  30. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/transfer.py +0 -0
  31. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/handlers/uart.py +0 -0
  32. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/session_manager.py +0 -0
  33. {replx-1.22.0 → replx-1.22.2}/replx/cli/agent/server/udp.py +0 -0
  34. {replx-1.22.0 → replx-1.22.2}/replx/cli/app.py +0 -0
  35. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/__init__.py +0 -0
  36. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/_common.py +0 -0
  37. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/adc.py +0 -0
  38. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/ble.py +0 -0
  39. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/exec.py +0 -0
  40. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/file.py +0 -0
  41. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/firmware.py +0 -0
  42. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/gpio.py +0 -0
  43. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/i2c.py +0 -0
  44. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/i2s.py +0 -0
  45. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/mip.py +0 -0
  46. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/package.py +0 -0
  47. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/pwm.py +0 -0
  48. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/spi.py +0 -0
  49. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/uart.py +0 -0
  50. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/utility.py +0 -0
  51. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/wifi.py +0 -0
  52. {replx-1.22.0 → replx-1.22.2}/replx/cli/commands/ws2812.py +0 -0
  53. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/__init__.py +0 -0
  54. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/compiler.py +0 -0
  55. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/environment.py +0 -0
  56. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/output.py +0 -0
  57. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/registry.py +0 -0
  58. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/store.py +0 -0
  59. {replx-1.22.0 → replx-1.22.2}/replx/cli/helpers/updater.py +0 -0
  60. {replx-1.22.0 → replx-1.22.2}/replx/commands.py +0 -0
  61. {replx-1.22.0 → replx-1.22.2}/replx/protocol/__init__.py +0 -0
  62. {replx-1.22.0 → replx-1.22.2}/replx/protocol/repl.py +0 -0
  63. {replx-1.22.0 → replx-1.22.2}/replx/protocol/storage.py +0 -0
  64. {replx-1.22.0 → replx-1.22.2}/replx/terminal.py +0 -0
  65. {replx-1.22.0 → replx-1.22.2}/replx/transport/__init__.py +0 -0
  66. {replx-1.22.0 → replx-1.22.2}/replx/transport/serial.py +0 -0
  67. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/_thread.pyi +0 -0
  68. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/aioble/__init__.pyi +0 -0
  69. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/aioble/l2cap.pyi +0 -0
  70. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/array.pyi +0 -0
  71. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/asyncio/__init__.pyi +0 -0
  72. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/binascii.pyi +0 -0
  73. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/bluetooth.pyi +0 -0
  74. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/builtins.pyi +0 -0
  75. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/cmath.pyi +0 -0
  76. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/collections.pyi +0 -0
  77. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/cryptolib.pyi +0 -0
  78. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/deflate.pyi +0 -0
  79. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/errno.pyi +0 -0
  80. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/framebuf.pyi +0 -0
  81. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/gc.pyi +0 -0
  82. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/hashlib.pyi +0 -0
  83. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/heapq.pyi +0 -0
  84. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/io.pyi +0 -0
  85. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/json.pyi +0 -0
  86. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/lwip.pyi +0 -0
  87. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/machine.pyi +0 -0
  88. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/math.pyi +0 -0
  89. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/micropython.pyi +0 -0
  90. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/mip/__init__.pyi +0 -0
  91. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/network.pyi +0 -0
  92. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/ntptime.pyi +0 -0
  93. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/os.pyi +0 -0
  94. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/platform.pyi +0 -0
  95. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/random.pyi +0 -0
  96. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/re.pyi +0 -0
  97. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/requests/__init__.pyi +0 -0
  98. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/select.pyi +0 -0
  99. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/socket.pyi +0 -0
  100. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/ssl.pyi +0 -0
  101. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/struct.pyi +0 -0
  102. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/sys.pyi +0 -0
  103. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/time.pyi +0 -0
  104. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/tls.pyi +0 -0
  105. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/uasyncio.pyi +0 -0
  106. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/uctypes.pyi +0 -0
  107. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/ulab.pyi +0 -0
  108. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/urequests.pyi +0 -0
  109. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm/vfs.pyi +0 -0
  110. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/binascii.pyi +0 -0
  111. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/digi/__init__.pyi +0 -0
  112. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/digi/ble.pyi +0 -0
  113. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/errno.pyi +0 -0
  114. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/hashlib.pyi +0 -0
  115. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/io.pyi +0 -0
  116. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/json.pyi +0 -0
  117. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/machine.pyi +0 -0
  118. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/math.pyi +0 -0
  119. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/micropython.pyi +0 -0
  120. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/network.pyi +0 -0
  121. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/os.pyi +0 -0
  122. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/select.pyi +0 -0
  123. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/socket.pyi +0 -0
  124. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ssl.pyi +0 -0
  125. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/struct.pyi +0 -0
  126. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/sys.pyi +0 -0
  127. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/time.pyi +0 -0
  128. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ubinascii.pyi +0 -0
  129. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ucryptolib.pyi +0 -0
  130. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/uerrno.pyi +0 -0
  131. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/uhashlib.pyi +0 -0
  132. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/uio.pyi +0 -0
  133. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ujson.pyi +0 -0
  134. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/umachine.pyi +0 -0
  135. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/uos.pyi +0 -0
  136. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/uselect.pyi +0 -0
  137. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/usocket.pyi +0 -0
  138. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ussl.pyi +0 -0
  139. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/ustruct.pyi +0 -0
  140. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/utime.pyi +0 -0
  141. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/xbee/__init__.pyi +0 -0
  142. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/xbee/modem_status.pyi +0 -0
  143. {replx-1.22.0 → replx-1.22.2}/replx/typehints/comm_separate/EFR32MG/xbee/relay.pyi +0 -0
  144. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/ESP32/aioespnow.pyi +0 -0
  145. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/ESP32/esp.pyi +0 -0
  146. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/ESP32/esp32.pyi +0 -0
  147. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/ESP32/espnow.pyi +0 -0
  148. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/MIMXRT1062DVJ6A/mimxrt.pyi +0 -0
  149. {replx-1.22.0 → replx-1.22.2}/replx/typehints/core/RP2350/rp2.pyi +0 -0
  150. {replx-1.22.0 → replx-1.22.2}/replx/utils/__init__.py +0 -0
  151. {replx-1.22.0 → replx-1.22.2}/replx/utils/constants.py +0 -0
  152. {replx-1.22.0 → replx-1.22.2}/replx/utils/device_info.py +0 -0
  153. {replx-1.22.0 → replx-1.22.2}/replx/utils/exceptions.py +0 -0
  154. {replx-1.22.0 → replx-1.22.2}/replx.egg-info/SOURCES.txt +0 -0
  155. {replx-1.22.0 → replx-1.22.2}/replx.egg-info/dependency_links.txt +0 -0
  156. {replx-1.22.0 → replx-1.22.2}/replx.egg-info/entry_points.txt +0 -0
  157. {replx-1.22.0 → replx-1.22.2}/replx.egg-info/requires.txt +0 -0
  158. {replx-1.22.0 → replx-1.22.2}/replx.egg-info/top_level.txt +0 -0
  159. {replx-1.22.0 → replx-1.22.2}/setup.cfg +0 -0
  160. {replx-1.22.0 → replx-1.22.2}/test/test_hardware_commands.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replx
3
- Version: 1.22.0
3
+ Version: 1.22.2
4
4
  Summary: replx is a fast, modern MicroPython CLI: turbo REPL, robust file sync (put/get), project install, mpy-cross integration, and smart port discovery.
5
5
  Author-email: "chanmin.park" <devcamp@planxlab.com>
6
6
  License-Expression: MIT
@@ -1,5 +1,5 @@
1
1
  __all__ = ["__version__", "get_version", "__description__"]
2
- __version__ = "1.22.0"
2
+ __version__ = "1.22.2"
3
3
  __description__ = "Fast, modern MicroPython CLI with REPL, file sync, install, and smart port detection."
4
4
  __author__ = "PlanX Lab Development Team"
5
5
 
@@ -880,7 +880,7 @@ Scans all serial ports to detect MicroPython devices.
880
880
 
881
881
  history_default_cmp = _serial_port_cmp_key(history_default) if history_default else None
882
882
 
883
- scanned = DeviceScanner.scan_serial_ports(max_workers=10)
883
+ scanned, permission_denied_ports = DeviceScanner.scan_serial_ports(max_workers=10)
884
884
 
885
885
  for port_device, board_info in scanned:
886
886
  version, core, device, manufacturer = board_info
@@ -1034,6 +1034,23 @@ Scans all serial ports to detect MicroPython devices.
1034
1034
  title_align="left"
1035
1035
  )
1036
1036
 
1037
+ if permission_denied_ports:
1038
+ ports_list = ", ".join(_serial_port_display(p) for p in permission_denied_ports)
1039
+ if sys.platform.startswith("linux"):
1040
+ hint = (
1041
+ f"[yellow]Permission denied on: {ports_list}[/yellow]\n"
1042
+ "[dim]Add your user to the dialout group, then log out/in (or reboot):[/dim]\n"
1043
+ " sudo usermod -aG dialout $USER"
1044
+ )
1045
+ elif sys.platform == "darwin":
1046
+ hint = (
1047
+ f"[yellow]Permission denied on: {ports_list}[/yellow]\n"
1048
+ "[dim]Another process may be holding the port, or it needs access permission.[/dim]"
1049
+ )
1050
+ else:
1051
+ hint = f"[yellow]Permission denied on: {ports_list}[/yellow]"
1052
+ OutputHelper.print_panel(hint, title="Permission Issue", border_style="error")
1053
+
1037
1054
 
1038
1055
  from ..helpers.output import VALID_PANEL_CATEGORIES, _CATEGORY_COLOR_KEYS
1039
1056
 
@@ -78,20 +78,6 @@ class ConfigManager:
78
78
  @staticmethod
79
79
  def find_or_create_vscode_dir() -> str:
80
80
  current = os.path.realpath(os.getcwd())
81
- root = os.path.abspath(os.sep)
82
-
83
- search_dir = current
84
- visited = set()
85
- while search_dir not in visited:
86
- visited.add(search_dir)
87
- vscode_dir = os.path.join(search_dir, ".vscode")
88
- if os.path.isdir(vscode_dir):
89
- return vscode_dir
90
- parent = os.path.dirname(search_dir)
91
- if parent == search_dir or parent == root:
92
- break
93
- search_dir = parent
94
-
95
81
  vscode_dir = os.path.join(current, ".vscode")
96
82
  os.makedirs(vscode_dir, exist_ok=True)
97
83
  return vscode_dir
@@ -193,15 +193,17 @@ def _ensure_connected(ctx: typer.Context = None) -> dict:
193
193
  raise typer.Exit(1)
194
194
 
195
195
  if conn['source'] == 'global':
196
- is_first_connection = env_path is None or default_conn is None
197
196
  if not env_path:
198
197
  vscode_dir = _find_or_create_vscode_dir()
199
198
  env_path = os.path.join(vscode_dir, '.replx')
199
+ # Only `setup` may set the workspace default; a plain connect-on-demand
200
+ # (e.g. `replx PORT ls` with no default configured yet) must only
201
+ # register this port as the session's fg, never persist it as default.
200
202
  _update_connection_config(
201
203
  env_path, conn['connection'],
202
204
  version=STATE.version, core=STATE.core, device=STATE.device,
203
205
  manufacturer=STATE.manufacturer,
204
- set_default=is_first_connection
206
+ set_default=False
205
207
  )
206
208
 
207
209
  set_global_context(STATE.core, STATE.device, STATE.version, STATE.device_root_fs, STATE.device_path)
@@ -89,6 +89,8 @@ class DeviceScanner:
89
89
 
90
90
  return parse_device_banner(response_str)
91
91
 
92
+ except PermissionError:
93
+ raise
92
94
  except (OSError, IOError, serial.SerialException):
93
95
  pass
94
96
  except ImportError:
@@ -99,11 +101,12 @@ class DeviceScanner:
99
101
  return None
100
102
 
101
103
  @staticmethod
102
- def scan_serial_ports(max_workers: int = 5, exclude_ports: list = None) -> list:
104
+ def scan_serial_ports(max_workers: int = 5, exclude_ports: list = None) -> tuple:
103
105
  from serial.tools.list_ports import comports as list_ports_comports
104
106
  from concurrent.futures import ThreadPoolExecutor, as_completed
105
107
 
106
108
  results = []
109
+ permission_denied = []
107
110
 
108
111
  excluded = set()
109
112
  if exclude_ports:
@@ -137,7 +140,7 @@ class DeviceScanner:
137
140
  valid_ports.append(port)
138
141
 
139
142
  if not valid_ports:
140
- return results
143
+ return results, permission_denied
141
144
 
142
145
  if _plat == "darwin":
143
146
  per_port_timeout = 2.5
@@ -162,11 +165,14 @@ class DeviceScanner:
162
165
  except TimeoutError:
163
166
  # Port scan timed out
164
167
  pass
168
+ except PermissionError:
169
+ # OS denied access to the port (e.g. user not in dialout/uucp group on Linux)
170
+ permission_denied.append(port_device)
165
171
  except (OSError, IOError):
166
172
  # Port access error
167
173
  pass
168
174
 
169
- return results
175
+ return results, permission_denied
170
176
 
171
177
  @staticmethod
172
178
  def is_bluetooth_port(port_info) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replx
3
- Version: 1.22.0
3
+ Version: 1.22.2
4
4
  Summary: replx is a fast, modern MicroPython CLI: turbo REPL, robust file sync (put/get), project install, mpy-cross integration, and smart port discovery.
5
5
  Author-email: "chanmin.park" <devcamp@planxlab.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes