From 58ba72500a9dbc5a944e2c046c681cd727fc94cc Mon Sep 17 00:00:00 2001 From: shaggy Date: Sun, 19 Oct 2025 20:03:00 -0500 Subject: [PATCH 01/19] add the ability to change the target file in the --stay-connected menu --- pybricksdev/cli/__init__.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index a499bd3..6e07e16 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -262,6 +262,7 @@ async def reconnect_hub(): return hub response_options = [ + "Change Target File", "Recompile and Run", "Recompile and Download", "Exit", @@ -292,8 +293,18 @@ async def reconnect_hub(): ) with _get_script_path(args.file) as script_path: if response == response_options[0]: - await hub.run(script_path, wait=True) + args.file = os.path.abspath( + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() + ) + ) + ) elif response == response_options[1]: + await hub.run(script_path, wait=True) + elif response == response_options[2]: await hub.download(script_path) else: return From 98a6659859393cc5f16689cbec71a3c395a3dec1 Mon Sep 17 00:00:00 2001 From: shaggy Date: Mon, 20 Oct 2025 14:35:52 -0500 Subject: [PATCH 02/19] fix to open the file properly as a stream as _get_script_path expects --- pybricksdev/cli/__init__.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 6e07e16..23f1d3f 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -284,21 +284,23 @@ async def reconnect_hub(): "Would you like to re-compile your code?", response_options, default=( - response_options[0] + response_options[1] if args.start - else response_options[1] + else response_options[2] ), ).ask_async() ) ) with _get_script_path(args.file) as script_path: if response == response_options[0]: - args.file = os.path.abspath( - await hub.race_disconnect( - hub.race_power_button_press( - questionary.path( - "What file would you like to use?" - ).ask_async() + args.file = open( + os.path.abspath( + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() + ) ) ) ) From 1eb8056871dfa213de86f386f27eb03c1c55e4ab Mon Sep 17 00:00:00 2001 From: shaggy Date: Mon, 20 Oct 2025 16:15:45 -0500 Subject: [PATCH 03/19] display the current file in the re-compile menu --- pybricksdev/cli/__init__.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 23f1d3f..8a9f7a1 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -281,7 +281,7 @@ async def reconnect_hub(): response = await hub.race_disconnect( hub.race_power_button_press( questionary.select( - "Would you like to re-compile your code?", + f"Would you like to re-compile {os.path.basename(args.file.name)}?", response_options, default=( response_options[1] @@ -294,13 +294,11 @@ async def reconnect_hub(): with _get_script_path(args.file) as script_path: if response == response_options[0]: args.file = open( - os.path.abspath( - await hub.race_disconnect( - hub.race_power_button_press( - questionary.path( - "What file would you like to use?" - ).ask_async() - ) + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() ) ) ) From 8e89cfbeeb1f09399164d62b5d459cd1e6c67871 Mon Sep 17 00:00:00 2001 From: shaggy Date: Mon, 20 Oct 2025 16:42:26 -0500 Subject: [PATCH 04/19] close the old file prior to opening a new one --- pybricksdev/cli/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 8a9f7a1..b32ec82 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -293,6 +293,7 @@ async def reconnect_hub(): ) with _get_script_path(args.file) as script_path: if response == response_options[0]: + args.file.close() args.file = open( await hub.race_disconnect( hub.race_power_button_press( From b735de6f516f1e88f1bfdf79adca086135862a49 Mon Sep 17 00:00:00 2001 From: shaggy Date: Mon, 20 Oct 2025 19:29:59 -0500 Subject: [PATCH 05/19] send the new file to the hub upon change --- pybricksdev/cli/__init__.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index b32ec82..b390210 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -291,22 +291,28 @@ async def reconnect_hub(): ).ask_async() ) ) - with _get_script_path(args.file) as script_path: - if response == response_options[0]: - args.file.close() - args.file = open( - await hub.race_disconnect( - hub.race_power_button_press( - questionary.path( - "What file would you like to use?" - ).ask_async() - ) + + if response == response_options[0]: + args.file.close() + args.file = open( + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() ) ) + ) + + with _get_script_path(args.file) as script_path: + # send the new target file to the hub + if ( + response == response_options[0] + or response == response_options[2] + ): + await hub.download(script_path) elif response == response_options[1]: await hub.run(script_path, wait=True) - elif response == response_options[2]: - await hub.download(script_path) else: return @@ -326,6 +332,9 @@ async def reconnect_hub(): await asyncio.sleep(0.3) hub = await reconnect_hub() + except FileNotFoundError: + print("Your file is invalid.") + finally: await hub.disconnect() From ce2447aa462509f030da6835fdb6fc4d59442a2d Mon Sep 17 00:00:00 2001 From: shaggy Date: Mon, 20 Oct 2025 19:44:01 -0500 Subject: [PATCH 06/19] add a changelog entry --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20886d0..df04f60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- Added the `Change Target File` option to the `--stay-connected` menu. + ([pybricksdev#123]) + +[pybricksdev#123]: https://github.com/pybricks/pybricksdev/pull/123 + ## [2.1.1] - 2025-09-13 ### Fixed From c2c72fc25158393cd86d888e326787f7dc5db33e Mon Sep 17 00:00:00 2001 From: shaggy Date: Thu, 23 Oct 2025 13:20:13 -0500 Subject: [PATCH 07/19] implement some suggested changes --- pybricksdev/cli/__init__.py | 67 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index b390210..4e31f15 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -10,6 +10,7 @@ import os import sys from abc import ABC, abstractmethod +from enum import IntEnum from os import PathLike, path from tempfile import NamedTemporaryFile from typing import ContextManager, TextIO @@ -239,6 +240,12 @@ def is_pybricks_usb(dev): if not args.stay_connected: return + class ResponseOptions(IntEnum): + RECOMPILE_RUN = 0 + RECOMPILE_DOWNLOAD = 1 + CHANGE_TARGET_FILE = 2 + EXIT = 3 + async def reconnect_hub(): if not await questionary.confirm( "\nThe hub has been disconnected. Would you like to re-connect?" @@ -262,9 +269,9 @@ async def reconnect_hub(): return hub response_options = [ - "Change Target File", "Recompile and Run", "Recompile and Download", + "Change Target File", "Exit", ] while True: @@ -284,37 +291,50 @@ async def reconnect_hub(): f"Would you like to re-compile {os.path.basename(args.file.name)}?", response_options, default=( - response_options[1] + response_options[ResponseOptions.RECOMPILE_RUN] if args.start - else response_options[2] + else response_options[ + ResponseOptions.RECOMPILE_DOWNLOAD + ] ), ).ask_async() ) ) - if response == response_options[0]: + if response == response_options[ResponseOptions.RECOMPILE_RUN]: + with _get_script_path(args.file) as script_path: + await hub.run(script_path, wait=True) + + elif ( + response == response_options[ResponseOptions.RECOMPILE_DOWNLOAD] + ): + with _get_script_path(args.file) as script_path: + await hub.download(script_path) + + elif ( + response == response_options[ResponseOptions.CHANGE_TARGET_FILE] + ): args.file.close() - args.file = open( - await hub.race_disconnect( - hub.race_power_button_press( - questionary.path( - "What file would you like to use?" - ).ask_async() + while True: + try: + args.file = open( + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() + ) + ) ) - ) - ) - - with _get_script_path(args.file) as script_path: + break + except FileNotFoundError: + print("The file was not found. Please try again.") # send the new target file to the hub - if ( - response == response_options[0] - or response == response_options[2] - ): + with _get_script_path(args.file) as script_path: await hub.download(script_path) - elif response == response_options[1]: - await hub.run(script_path, wait=True) - else: - return + + else: + return except HubPowerButtonPressedError: # This means the user pressed the button on the hub to re-start the @@ -332,9 +352,6 @@ async def reconnect_hub(): await asyncio.sleep(0.3) hub = await reconnect_hub() - except FileNotFoundError: - print("Your file is invalid.") - finally: await hub.disconnect() From 92b0d22b533f199ba44035f40b7f4c4a9f104e4e Mon Sep 17 00:00:00 2001 From: shaggy Date: Thu, 23 Oct 2025 14:37:58 -0500 Subject: [PATCH 08/19] replace the bulky if-else block with a match statement --- pybricksdev/cli/__init__.py | 62 ++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 4e31f15..e9751b2 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -301,40 +301,38 @@ async def reconnect_hub(): ) ) - if response == response_options[ResponseOptions.RECOMPILE_RUN]: - with _get_script_path(args.file) as script_path: - await hub.run(script_path, wait=True) - - elif ( - response == response_options[ResponseOptions.RECOMPILE_DOWNLOAD] - ): - with _get_script_path(args.file) as script_path: - await hub.download(script_path) - - elif ( - response == response_options[ResponseOptions.CHANGE_TARGET_FILE] - ): - args.file.close() - while True: - try: - args.file = open( - await hub.race_disconnect( - hub.race_power_button_press( - questionary.path( - "What file would you like to use?" - ).ask_async() + match response_options.index(response): + + case ResponseOptions.RECOMPILE_RUN: + with _get_script_path(args.file) as script_path: + await hub.run(script_path, wait=True) + + case ResponseOptions.RECOMPILE_DOWNLOAD: + with _get_script_path(args.file) as script_path: + await hub.download(script_path) + + case ResponseOptions.CHANGE_TARGET_FILE: + args.file.close() + while True: + try: + args.file = open( + await hub.race_disconnect( + hub.race_power_button_press( + questionary.path( + "What file would you like to use?" + ).ask_async() + ) ) ) - ) - break - except FileNotFoundError: - print("The file was not found. Please try again.") - # send the new target file to the hub - with _get_script_path(args.file) as script_path: - await hub.download(script_path) - - else: - return + break + except FileNotFoundError: + print("The file was not found. Please try again.") + # send the new target file to the hub + with _get_script_path(args.file) as script_path: + await hub.download(script_path) + + case _: + return except HubPowerButtonPressedError: # This means the user pressed the button on the hub to re-start the From e72b050b5b73e127744763c9052772f417123275 Mon Sep 17 00:00:00 2001 From: shaggy Date: Thu, 23 Oct 2025 19:11:09 -0500 Subject: [PATCH 09/19] fix comment alignment --- pybricksdev/cli/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index e9751b2..0abe13b 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -327,7 +327,7 @@ async def reconnect_hub(): break except FileNotFoundError: print("The file was not found. Please try again.") - # send the new target file to the hub + # send the new target file to the hub with _get_script_path(args.file) as script_path: await hub.download(script_path) From c34ca8d9552d3f5c7ff58007411079c5ebbd8931 Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 10:09:44 -0500 Subject: [PATCH 10/19] cli/__init__.py: Add an option to the --stay-connected menu to re-run the stored program --- pybricksdev/cli/__init__.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 0abe13b..505e4a4 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -19,6 +19,7 @@ import questionary from argcomplete.completers import FilesCompleter +from packaging.version import Version from pybricksdev import __name__ as MODULE_NAME from pybricksdev import __version__ as MODULE_VERSION from pybricksdev.connections.pybricks import ( @@ -243,8 +244,9 @@ def is_pybricks_usb(dev): class ResponseOptions(IntEnum): RECOMPILE_RUN = 0 RECOMPILE_DOWNLOAD = 1 - CHANGE_TARGET_FILE = 2 - EXIT = 3 + RERUN_STORED = 2 + CHANGE_TARGET_FILE = 3 + EXIT = 4 async def reconnect_hub(): if not await questionary.confirm( @@ -271,6 +273,7 @@ async def reconnect_hub(): response_options = [ "Recompile and Run", "Recompile and Download", + "Re-run Stored Program", "Change Target File", "Exit", ] @@ -311,6 +314,15 @@ async def reconnect_hub(): with _get_script_path(args.file) as script_path: await hub.download(script_path) + case ResponseOptions.RERUN_STORED: + if hub.fw_version < Version("v1.2.0"): + print( + "Running a stored program remotely is only supported in firmware version >= v1.2.0." + ) + else: + await hub.start_user_program() + await hub._wait_for_user_program_stop() + case ResponseOptions.CHANGE_TARGET_FILE: args.file.close() while True: From 802c9d830aa232b327bbdcc4169d36510def68f8 Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 10:13:44 -0500 Subject: [PATCH 11/19] cli/__init__.py: fix import layout --- pybricksdev/cli/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 505e4a4..a7fc7d3 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -20,6 +20,7 @@ from argcomplete.completers import FilesCompleter from packaging.version import Version + from pybricksdev import __name__ as MODULE_NAME from pybricksdev import __version__ as MODULE_VERSION from pybricksdev.connections.pybricks import ( From 87626a9f73551d6660f4f765ab5283e149c6494a Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 10:14:42 -0500 Subject: [PATCH 12/19] cli/__init__.py: fix import layout again --- pybricksdev/cli/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index a7fc7d3..a97a10e 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -18,7 +18,6 @@ import argcomplete import questionary from argcomplete.completers import FilesCompleter - from packaging.version import Version from pybricksdev import __name__ as MODULE_NAME From d07b2f087db18fc88373e33779021a5d81eb5e5f Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 10:23:07 -0500 Subject: [PATCH 13/19] cli/__init__.py: change "Re-run" to "Run" in the new menu option --- pybricksdev/cli/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index a97a10e..da58a09 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -244,7 +244,7 @@ def is_pybricks_usb(dev): class ResponseOptions(IntEnum): RECOMPILE_RUN = 0 RECOMPILE_DOWNLOAD = 1 - RERUN_STORED = 2 + RUN_STORED = 2 CHANGE_TARGET_FILE = 3 EXIT = 4 @@ -273,7 +273,7 @@ async def reconnect_hub(): response_options = [ "Recompile and Run", "Recompile and Download", - "Re-run Stored Program", + "Run Stored Program", "Change Target File", "Exit", ] @@ -314,7 +314,7 @@ async def reconnect_hub(): with _get_script_path(args.file) as script_path: await hub.download(script_path) - case ResponseOptions.RERUN_STORED: + case ResponseOptions.RUN_STORED: if hub.fw_version < Version("v1.2.0"): print( "Running a stored program remotely is only supported in firmware version >= v1.2.0." From 11b624963ae6125cde7f3c8278b9373feecebe5f Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 14:57:48 -0500 Subject: [PATCH 14/19] cli/__init__.py: dynamically adjust default response option in --stay-connected menu and fix firmware version info --- pybricksdev/cli/__init__.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index da58a09..cbde5c1 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -277,6 +277,15 @@ async def reconnect_hub(): "Change Target File", "Exit", ] + # the entry that is selected by default when the menu opens + # this is overridden after the user picks an option + # so that the default option is always the one that was last chosen + default_response_option = ( + ResponseOptions.RECOMPILE_RUN + if args.start + else ResponseOptions.RECOMPILE_DOWNLOAD + ) + while True: try: if args.file is sys.stdin: @@ -293,13 +302,7 @@ async def reconnect_hub(): questionary.select( f"Would you like to re-compile {os.path.basename(args.file.name)}?", response_options, - default=( - response_options[ResponseOptions.RECOMPILE_RUN] - if args.start - else response_options[ - ResponseOptions.RECOMPILE_DOWNLOAD - ] - ), + default=(response_options[default_response_option]), ).ask_async() ) ) @@ -308,18 +311,23 @@ async def reconnect_hub(): case ResponseOptions.RECOMPILE_RUN: with _get_script_path(args.file) as script_path: + default_response_option = ResponseOptions.RECOMPILE_RUN await hub.run(script_path, wait=True) case ResponseOptions.RECOMPILE_DOWNLOAD: with _get_script_path(args.file) as script_path: + default_response_option = ( + ResponseOptions.RECOMPILE_DOWNLOAD + ) await hub.download(script_path) case ResponseOptions.RUN_STORED: - if hub.fw_version < Version("v1.2.0"): + if hub.fw_version < Version("v3.3.0"): print( - "Running a stored program remotely is only supported in firmware version >= v1.2.0." + "Running a stored program remotely is only supported in the hub firmware version >= v3.3.0." ) else: + default_response_option = ResponseOptions.RUN_STORED await hub.start_user_program() await hub._wait_for_user_program_stop() From 3a06aad4d7a273299fccbbdd7ec665f97568fdfd Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 15:00:47 -0500 Subject: [PATCH 15/19] cli/__init__.py: set required firmware version for running a stored program to v3.2.0 --- pybricksdev/cli/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index cbde5c1..b366c3f 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -322,9 +322,9 @@ async def reconnect_hub(): await hub.download(script_path) case ResponseOptions.RUN_STORED: - if hub.fw_version < Version("v3.3.0"): + if hub.fw_version < Version("3.2.0-beta.4"): print( - "Running a stored program remotely is only supported in the hub firmware version >= v3.3.0." + "Running a stored program remotely is only supported in the hub firmware version >= v3.2.0." ) else: default_response_option = ResponseOptions.RUN_STORED From 4b1c83d8d9c5685ee1a45bf1ee0a05ddd5f65cdb Mon Sep 17 00:00:00 2001 From: shaggy Date: Fri, 24 Oct 2025 17:46:37 -0500 Subject: [PATCH 16/19] cli/__init__.py: move default response option setting code out of match statement --- pybricksdev/cli/__init__.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index b366c3f..9c787aa 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -307,18 +307,20 @@ async def reconnect_hub(): ) ) + if ( + response_options.index(response) + != ResponseOptions.CHANGE_TARGET_FILE + ): + default_response_option = response_options.index(response) + match response_options.index(response): case ResponseOptions.RECOMPILE_RUN: with _get_script_path(args.file) as script_path: - default_response_option = ResponseOptions.RECOMPILE_RUN await hub.run(script_path, wait=True) case ResponseOptions.RECOMPILE_DOWNLOAD: with _get_script_path(args.file) as script_path: - default_response_option = ( - ResponseOptions.RECOMPILE_DOWNLOAD - ) await hub.download(script_path) case ResponseOptions.RUN_STORED: @@ -327,7 +329,6 @@ async def reconnect_hub(): "Running a stored program remotely is only supported in the hub firmware version >= v3.2.0." ) else: - default_response_option = ResponseOptions.RUN_STORED await hub.start_user_program() await hub._wait_for_user_program_stop() From f4ca2734f88c4aa66213c80ce38ea1a6a5e3a1b2 Mon Sep 17 00:00:00 2001 From: shaggy Date: Sat, 25 Oct 2025 11:03:14 -0500 Subject: [PATCH 17/19] cli/__init__.py: always set the default response option to be the one that was last used --- pybricksdev/cli/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pybricksdev/cli/__init__.py b/pybricksdev/cli/__init__.py index 9c787aa..d2d08fc 100644 --- a/pybricksdev/cli/__init__.py +++ b/pybricksdev/cli/__init__.py @@ -307,11 +307,7 @@ async def reconnect_hub(): ) ) - if ( - response_options.index(response) - != ResponseOptions.CHANGE_TARGET_FILE - ): - default_response_option = response_options.index(response) + default_response_option = response_options.index(response) match response_options.index(response): From 72001c4a55b9bacccf2a1f3b86c595bf07581c7b Mon Sep 17 00:00:00 2001 From: shaggy Date: Sat, 25 Oct 2025 11:11:32 -0500 Subject: [PATCH 18/19] CHANGELOG.md: add entries for new changes --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index df04f60..80eb624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added +- Added the `Run Stored Program` option to the `--stay-connected` menu. + ([pybricksdev#125]) + - Added the `Change Target File` option to the `--stay-connected` menu. ([pybricksdev#123]) [pybricksdev#123]: https://github.com/pybricks/pybricksdev/pull/123 +### Changed +- Changed the default option in the `--stay-connected` menu to be the last + used option. ([pybricksdev#125]) + +[pybricksdev#125]: https://github.com/pybricks/pybricksdev/pull/125 + ## [2.1.1] - 2025-09-13 ### Fixed From b42c61c36b87e1f05a055b3a99f112236821e236 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Sat, 25 Oct 2025 13:48:41 -0500 Subject: [PATCH 19/19] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80eb624..7facd8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added the `Run Stored Program` option to the `--stay-connected` menu. ([pybricksdev#125]) - - Added the `Change Target File` option to the `--stay-connected` menu. ([pybricksdev#123])