termapy 0.78.0__tar.gz → 0.79.0__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.
- {termapy-0.78.0 → termapy-0.79.0}/PKG-INFO +74 -42
- {termapy-0.78.0 → termapy-0.79.0}/README.md +71 -40
- {termapy-0.78.0 → termapy-0.79.0}/pyproject.toml +8 -3
- {termapy-0.78.0 → termapy-0.79.0}/pyproject.toml.orig +12 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/app.py +521 -225
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/app_dirs.py +4 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/app_hooks.py +59 -13
- termapy-0.79.0/src/termapy/boards/__init__.py +362 -0
- termapy-0.79.0/src/termapy/boards/esp32s3/config.json +11 -0
- termapy-0.79.0/src/termapy/boards/esp32s3/firmware/main.py +84 -0
- termapy-0.79.0/src/termapy/boards/esp32s3/profile.json +121 -0
- termapy-0.79.0/src/termapy/boards/micropython/firmware/termapy_json.py +339 -0
- termapy-0.79.0/src/termapy/boards/micropython/firmware/termapy_mem.py +250 -0
- termapy-0.79.0/src/termapy/boards/pico/config.json +11 -0
- termapy-0.79.0/src/termapy/boards/pico/firmware/main.py +52 -0
- termapy-0.79.0/src/termapy/boards/pico/profile.json +62 -0
- termapy-0.79.0/src/termapy/breadcrumbs.py +415 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/_cfg_icon.py +10 -5
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/_crc_verbs.py +4 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/_run_record.py +17 -14
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/_xmodem_handlers.py +7 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/_ymodem_handlers.py +7 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/app.py +222 -39
- termapy-0.79.0/src/termapy/builtins/commands/board.py +216 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/cap.py +9 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/cfg.py +111 -38
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/cls.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/confirm.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/credits.py +10 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/delay.py +7 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/demo.py +9 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/dev.py +122 -90
- termapy-0.79.0/src/termapy/builtins/commands/edit.py +131 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/env.py +24 -23
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/exit.py +7 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/expect.py +8 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/find.py +21 -17
- termapy-0.79.0/src/termapy/builtins/commands/firmware.py +228 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/grep.py +11 -48
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/help.py +438 -182
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/log.py +127 -56
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/mcp.py +17 -7
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/mem.py +313 -116
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/os_cmd.py +11 -5
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/ping.py +8 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/plugin.py +5 -5
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/port.py +49 -33
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/print.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/profile.py +17 -8
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/proto.py +99 -72
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/raw.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/repeat.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/run.py +40 -24
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/search.py +22 -22
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/seq.py +15 -6
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/show.py +24 -13
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/ss.py +9 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/stop.py +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/sym.py +56 -37
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/term.py +30 -35
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/var.py +9 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/commands/xfer.py +11 -5
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/demo.cfg +30 -26
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/demo.symbols.json +9 -2
- termapy-0.79.0/src/termapy/builtins/demo/dev/console.device.json +18 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/plugin/cmd.py +4 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/plugin/probe.py +5 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/plugin/temp_plot.py +5 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/plugin/traffic.py +5 -0
- termapy-0.79.0/src/termapy/builtins/demo/run/doc_screenshots.run +25 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/capture_view.py +3 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/cli.py +28 -28
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/cli_flags.py +216 -65
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/config.py +92 -13
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/config_resolve.py +3 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/converters.py +72 -8
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/credits_data.py +8 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/defaults.py +136 -82
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/demo.py +10 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/demo_ndjson.py +46 -30
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/devices/__init__.py +117 -8
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/devices/converters/__init__.py +2 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/devices/converters/svd.py +13 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/_common.py +121 -32
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/config_editor.py +31 -25
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/filename_dialog.py +25 -9
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/port_picker.py +14 -31
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/proto_editor.py +17 -9
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/proto_picker.py +2 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/quick_setup.py +34 -6
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/script_editor.py +24 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/set_var_dialog.py +34 -10
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/entry.py +44 -5
- termapy-0.79.0/src/termapy/firmware/__init__.py +223 -0
- termapy-0.79.0/src/termapy/firmware/c/termapy_json.c +919 -0
- termapy-0.79.0/src/termapy/firmware/c/termapy_json.h +473 -0
- termapy-0.79.0/src/termapy/firmware/c/termapy_mem.c +528 -0
- termapy-0.79.0/src/termapy/firmware/c/termapy_mem.h +224 -0
- termapy-0.79.0/src/termapy/folder_ops.py +843 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/folders.py +87 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/acknowledgments.md +3 -0
- termapy-0.79.0/src/termapy/help/boards.md +147 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/cli.md +74 -33
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/commands.md +83 -16
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/config.md +58 -44
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/custom-buttons.md +20 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/demo.md +2 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/devices.md +20 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/environment.md +15 -8
- termapy-0.79.0/src/termapy/help/firmware-json.md +294 -0
- termapy-0.79.0/src/termapy/help/firmware.md +39 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/getting-started.md +18 -2
- termapy-0.79.0/src/termapy/help/img/doc_01_main_tui.svg +204 -0
- termapy-0.79.0/src/termapy/help/img/doc_02_help.svg +206 -0
- termapy-0.79.0/src/termapy/help/img/doc_02b_help_group.svg +204 -0
- termapy-0.79.0/src/termapy/help/img/doc_03_help_proto.svg +208 -0
- termapy-0.79.0/src/termapy/help/img/doc_04_proto_send.svg +205 -0
- termapy-0.79.0/src/termapy/help/img/doc_05_proto_crc.svg +205 -0
- termapy-0.79.0/src/termapy/help/img/doc_06_proto_delay.svg +203 -0
- termapy-0.79.0/src/termapy/help/img/doc_07_crc_python.svg +205 -0
- termapy-0.79.0/src/termapy/help/img/doc_08_variables.svg +206 -0
- termapy-0.79.0/src/termapy/help/img/doc_09_target_help.svg +204 -0
- termapy-0.79.0/src/termapy/help/img/doc_10_config_info.svg +206 -0
- termapy-0.79.0/src/termapy/help/img/doc_11_proto_run.svg +207 -0
- termapy-0.79.0/src/termapy/help/img/doc_12_cap_struct.svg +205 -0
- {termapy-0.78.0/src/termapy/html → termapy-0.79.0/src/termapy/help}/img/doc_13_cap_progress.svg +85 -84
- termapy-0.79.0/src/termapy/help/img/doc_14_port_list.svg +203 -0
- termapy-0.79.0/src/termapy/help/img/doc_15_xfer.svg +205 -0
- {termapy-0.78.0/src/termapy/html → termapy-0.79.0/src/termapy/help}/img/doc_17_proto_debug.svg +104 -103
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/index.md +2 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/mcp-server.md +7 -5
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/memory.md +112 -27
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/ports.md +20 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/protocol-testing.md +42 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/scripting.md +24 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/serial-tools.md +2 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/symbols.md +127 -31
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/toolbar.md +34 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/writing-plugins.md +78 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help_tooltip.py +6 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/404.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/acknowledgments.html +94 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/assets/javascripts/LICENSE +29 -29
- termapy-0.79.0/src/termapy/html/assets/javascripts/bundle.d31f0ffa.min.js +10 -0
- termapy-0.78.0/src/termapy/html/assets/javascripts/workers/search.c47bb847.min.js → termapy-0.79.0/src/termapy/html/assets/javascripts/workers/search.719e0d91.min.js +1 -1
- termapy-0.79.0/src/termapy/html/assets/stylesheets/classic/main.94dd801d.min.css +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/assets/stylesheets/classic/palette.813d4b3f.min.css +3 -3
- termapy-0.79.0/src/termapy/html/assets/stylesheets/modern/main.4ab2de0c.min.css +6 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/assets/stylesheets/modern/palette.b60ce83d.min.css +3 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/authoring-profiles.html +91 -11
- termapy-0.79.0/src/termapy/html/boards.html +1461 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/cli.html +208 -72
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/commands.html +264 -30
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/config.html +272 -163
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/custom-buttons.html +146 -14
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/data-capture.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/demo.html +93 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/device-help.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/devices.html +147 -30
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/environment.html +106 -19
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/file-transfer.html +94 -14
- termapy-0.79.0/src/termapy/html/firmware-json.html +1770 -0
- termapy-0.79.0/src/termapy/html/firmware.html +1204 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/getting-started.html +108 -13
- termapy-0.79.0/src/termapy/html/img/doc_01_main_tui.svg +204 -0
- termapy-0.79.0/src/termapy/html/img/doc_02_help.svg +206 -0
- termapy-0.79.0/src/termapy/html/img/doc_02b_help_group.svg +204 -0
- termapy-0.79.0/src/termapy/html/img/doc_03_help_proto.svg +208 -0
- termapy-0.79.0/src/termapy/html/img/doc_04_proto_send.svg +205 -0
- termapy-0.79.0/src/termapy/html/img/doc_05_proto_crc.svg +205 -0
- termapy-0.79.0/src/termapy/html/img/doc_06_proto_delay.svg +203 -0
- termapy-0.79.0/src/termapy/html/img/doc_07_crc_python.svg +205 -0
- termapy-0.79.0/src/termapy/html/img/doc_08_variables.svg +206 -0
- termapy-0.79.0/src/termapy/html/img/doc_09_target_help.svg +204 -0
- termapy-0.79.0/src/termapy/html/img/doc_10_config_info.svg +206 -0
- termapy-0.79.0/src/termapy/html/img/doc_11_proto_run.svg +207 -0
- termapy-0.79.0/src/termapy/html/img/doc_12_cap_struct.svg +205 -0
- {termapy-0.78.0/src/termapy/help → termapy-0.79.0/src/termapy/html}/img/doc_13_cap_progress.svg +85 -84
- termapy-0.79.0/src/termapy/html/img/doc_14_port_list.svg +203 -0
- termapy-0.79.0/src/termapy/html/img/doc_15_xfer.svg +205 -0
- {termapy-0.78.0/src/termapy/help → termapy-0.79.0/src/termapy/html}/img/doc_17_proto_debug.svg +104 -103
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/index.html +93 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/installation.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/mcp-server.html +99 -16
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/memory.html +302 -45
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/on-ai-assistance.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/ports.html +110 -15
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/protocol-testing.html +165 -14
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/scripting.html +149 -30
- termapy-0.79.0/src/termapy/html/search.json +1 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/serial-tools.html +93 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/sitemap.xml +2 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/symbols.html +347 -78
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/toolbar.html +156 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/using-git.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/variables.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/vt100.html +91 -11
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/writing-plugins.html +420 -236
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/info_views.py +3 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/legacy.py +10 -6
- termapy-0.79.0/src/termapy/load_report.py +244 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/markup.py +53 -0
- termapy-0.79.0/src/termapy/matching.py +133 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/mcp/catalog.py +15 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/mcp/server.py +88 -40
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/memory.py +2 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/memory_views.py +82 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/migration.py +47 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/pickers.py +7 -12
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/__init__.py +24 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/capabilities.py +15 -2
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/command.py +289 -16
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/internal.py +30 -18
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/io.py +42 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/loader.py +54 -26
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/params.py +29 -0
- termapy-0.79.0/src/termapy/plugins/views.py +388 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/port_control.py +301 -105
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/port_format.py +49 -14
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/profile/loader.py +6 -6
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/proto_debug.py +203 -62
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/core.py +30 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/viz.py +2 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/repl.py +292 -152
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/run_legacy.py +33 -22
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/scripting.py +51 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/serial_engine.py +25 -4
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/__init__.py +4 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/address.py +3 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/converters/__init__.py +27 -6
- termapy-0.79.0/src/termapy/symbols/converters/elf.py +666 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/converters/xc32.py +92 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/format.py +196 -33
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/session.py +82 -36
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/table.py +194 -37
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/terminal_host.py +141 -18
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/title_bar.py +58 -13
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/tree_render.py +6 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb/__init__.py +2 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb/chips.py +72 -49
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb/vendors.py +39 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb_tree.py +6 -3
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vt100.py +13 -1
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/widgets/__init__.py +14 -1
- termapy-0.79.0/src/termapy/widgets/link_log.py +50 -0
- termapy-0.79.0/src/termapy/widgets/prompt_input.py +39 -0
- termapy-0.79.0/src/termapy/widgets/selectable_log.py +317 -0
- termapy-0.79.0/src/termapy/widgets/selection_list.py +100 -0
- termapy-0.78.0/src/termapy/builtins/commands/edit.py +0 -287
- termapy-0.78.0/src/termapy/builtins/demo/run/doc_screenshots.run +0 -124
- termapy-0.78.0/src/termapy/folder_ops.py +0 -493
- termapy-0.78.0/src/termapy/help/img/doc_01_main_tui.svg +0 -202
- termapy-0.78.0/src/termapy/help/img/doc_02_help.svg +0 -205
- termapy-0.78.0/src/termapy/help/img/doc_03_help_proto.svg +0 -206
- termapy-0.78.0/src/termapy/help/img/doc_04_proto_send.svg +0 -203
- termapy-0.78.0/src/termapy/help/img/doc_05_proto_crc.svg +0 -203
- termapy-0.78.0/src/termapy/help/img/doc_06_proto_delay.svg +0 -204
- termapy-0.78.0/src/termapy/help/img/doc_07_crc_python.svg +0 -201
- termapy-0.78.0/src/termapy/help/img/doc_08_variables.svg +0 -203
- termapy-0.78.0/src/termapy/help/img/doc_09_target_help.svg +0 -205
- termapy-0.78.0/src/termapy/help/img/doc_10_config_info.svg +0 -204
- termapy-0.78.0/src/termapy/help/img/doc_11_proto_run.svg +0 -205
- termapy-0.78.0/src/termapy/help/img/doc_12_cap_struct.svg +0 -203
- termapy-0.78.0/src/termapy/help/img/doc_14_port_list.svg +0 -201
- termapy-0.78.0/src/termapy/help/img/doc_15_xfer.svg +0 -203
- termapy-0.78.0/src/termapy/html/assets/javascripts/bundle.a2388154.min.js +0 -10
- termapy-0.78.0/src/termapy/html/assets/stylesheets/classic/main.68ef4dbf.min.css +0 -6
- termapy-0.78.0/src/termapy/html/assets/stylesheets/modern/main.e442bf79.min.css +0 -6
- termapy-0.78.0/src/termapy/html/img/doc_01_main_tui.svg +0 -202
- termapy-0.78.0/src/termapy/html/img/doc_02_help.svg +0 -205
- termapy-0.78.0/src/termapy/html/img/doc_03_help_proto.svg +0 -206
- termapy-0.78.0/src/termapy/html/img/doc_04_proto_send.svg +0 -203
- termapy-0.78.0/src/termapy/html/img/doc_05_proto_crc.svg +0 -203
- termapy-0.78.0/src/termapy/html/img/doc_06_proto_delay.svg +0 -204
- termapy-0.78.0/src/termapy/html/img/doc_07_crc_python.svg +0 -201
- termapy-0.78.0/src/termapy/html/img/doc_08_variables.svg +0 -203
- termapy-0.78.0/src/termapy/html/img/doc_09_target_help.svg +0 -205
- termapy-0.78.0/src/termapy/html/img/doc_10_config_info.svg +0 -204
- termapy-0.78.0/src/termapy/html/img/doc_11_proto_run.svg +0 -205
- termapy-0.78.0/src/termapy/html/img/doc_12_cap_struct.svg +0 -203
- termapy-0.78.0/src/termapy/html/img/doc_14_port_list.svg +0 -201
- termapy-0.78.0/src/termapy/html/img/doc_15_xfer.svg +0 -203
- termapy-0.78.0/src/termapy/html/search.json +0 -1
- termapy-0.78.0/src/termapy/plugins/views.py +0 -185
- {termapy-0.78.0 → termapy-0.79.0}/LICENSE +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/__main__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/crc/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/crc/sum16.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/crc/sum8.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/.gitignore +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/demo.profile.json +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/demo_legacy.profile.json +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/demo_ndjson.profile.json +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/plugin/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/proto/at_test.pro +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/proto/bitfield_inline.pro +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/proto/modbus_inline.pro +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/at_demo.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/crc_tour.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/expect_test.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/gps_demo.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/smoke_test.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/status_check.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/var_demo.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/demo/run/welcome.run +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/viz/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/viz/hex_view.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/builtins/viz/text_view.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/capture.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/cli_prompt.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/demo_vt100.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/cfg_confirm.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/config_picker.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/confirm_dialog.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/script_picker.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/dialogs/update_available.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/env_flags.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/.coverage +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/authoring-profiles.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/data-capture.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/device-help.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/file-transfer.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_16_toolbar.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_20_palette.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_21_script_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_22_script_editor.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_23_config_editor.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_24_cmd_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_30_new_cfg.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_31_cli_completion.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_32_port_picker.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_33_port_tooltip.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_34_latency_timer.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_35_vt100_menu.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_36_vt100_status.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/img/doc_37_config_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/installation.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/on-ai-assistance.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/using-git.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/variables.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help/vt100.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/help_dynamic.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/history_nav.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/.coverage +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/assets/images/favicon.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_16_toolbar.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_20_palette.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_21_script_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_22_script_editor.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_23_config_editor.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_24_cmd_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_30_new_cfg.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_31_cli_completion.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_32_port_picker.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_33_port_tooltip.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_34_latency_timer.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_35_vt100_menu.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_36_vt100_status.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/html/img/doc_37_config_picker.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/install_info.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/mcp/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/mcp/prompts.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/palette_provider.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/context.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/fs.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/serial.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/handles/ui.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/plugins/output_levels.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/profile/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/profile/matcher.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/profile/schema.json +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/profile/types.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/crc.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/runner.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/protocol/type_codes.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/request_response.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/response_parsers.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/run_docstring.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/serial_port.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/symbols/provenance.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/icons/termapy.icns +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/icons/termapy.ico +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/icons/termapy.png +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/icons/termapy.svg +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/linux/termapy.desktop.template +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/macos/Termapy.app/Contents/Info.plist +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/templates/macos/Termapy.app/Contents/MacOS/launcher.template +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/update_check.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb/_vendors_full.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/usb/aliases.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/variables.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/LICENSES.md +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/__main__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/rfc2217.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/rs485.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/serialcli.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/serialjava.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/serialposix.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/serialutil.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/serialwin32.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/threaded/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/hexlify_codec.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports_common.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports_linux.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports_osx.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports_posix.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/list_ports_windows.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/tools/miniterm.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_alt.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_cp2110.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_hwgrep.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_loop.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_rfc2217.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_socket.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/urlhandler/protocol_spy.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/serial/win32.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/xmodem.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/CRC.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/Platform.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/Protocol.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/Socket.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/Version.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/vendor/ymodem/__init__.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/widgets/checkbox.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/widgets/status_bar.py +0 -0
- {termapy-0.78.0 → termapy-0.79.0}/src/termapy/widgets/suggester.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: termapy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.79.0
|
|
4
4
|
Summary: A TUI serial terminal with ANSI color support, built on Textual and pyserial
|
|
5
5
|
Keywords: serial,terminal,tui,textual,pyserial,embedded,xmodem,ymodem
|
|
6
6
|
Author: Chuck Bass
|
|
@@ -20,7 +20,7 @@ Classifier: Programming Language :: Python :: 3.15
|
|
|
20
20
|
Classifier: Topic :: Communications
|
|
21
21
|
Classifier: Topic :: System :: Hardware
|
|
22
22
|
Classifier: Topic :: Terminals :: Serial
|
|
23
|
-
Requires-Dist: textual>=0
|
|
23
|
+
Requires-Dist: textual>=2.0
|
|
24
24
|
Requires-Dist: prompt-toolkit>=3.0
|
|
25
25
|
Requires-Dist: pygments>=2.20.0
|
|
26
26
|
Requires-Dist: tree-sitter>=0.25.0,<0.27
|
|
@@ -31,6 +31,7 @@ Requires-Dist: packaging>=24.0
|
|
|
31
31
|
Requires-Dist: frist>=0.21
|
|
32
32
|
Requires-Dist: platformdirs>=4.0
|
|
33
33
|
Requires-Dist: crcglot>=0.32.1
|
|
34
|
+
Requires-Dist: pyelftools>=0.33
|
|
34
35
|
Requires-Dist: termapy[mcp,web] ; extra == 'all'
|
|
35
36
|
Requires-Dist: mcp>=2,<3 ; extra == 'mcp'
|
|
36
37
|
Requires-Dist: textual-serve>=1.1 ; extra == 'web'
|
|
@@ -101,6 +102,12 @@ For your own device, one line creates a config and connects:
|
|
|
101
102
|
termapy --new my_device COM4 115200 8N1
|
|
102
103
|
```
|
|
103
104
|
|
|
105
|
+
For a new dev board, a starter project gives it a command monitor that answers you and an MCP agent on day one. The Raspberry Pi Pico and the ESP32-S3 DevKitC-1 have one; see the Dev boards help page:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
termapy --board pico
|
|
109
|
+
```
|
|
110
|
+
|
|
104
111
|
For a plain-text terminal (no TUI), use CLI mode:
|
|
105
112
|
|
|
106
113
|
```sh
|
|
@@ -150,11 +157,26 @@ See the [detailed feature comparison](docs/comparison.md) against RealTerm, Cool
|
|
|
150
157
|
|
|
151
158
|
</details>
|
|
152
159
|
|
|
160
|
+
## Feature status
|
|
161
|
+
|
|
162
|
+
Termapy is in beta: everything not listed here is stable and ready for public testing. These parts work and are used daily, but they are still being developed, sit outside the compatibility promise, and may change in any release.
|
|
163
|
+
|
|
164
|
+
| Feature | Commands | Status |
|
|
165
|
+
| --- | --- | --- |
|
|
166
|
+
| MCP server | `/mcp` | preview |
|
|
167
|
+
| Device files | `/dev` | preview |
|
|
168
|
+
| Symbols | `/sym` | preview |
|
|
169
|
+
| Memory access | `/mem` | preview |
|
|
170
|
+
| Dev board starters | `/board` | prototype |
|
|
171
|
+
| Device-side firmware | `/firmware` | prototype |
|
|
172
|
+
|
|
173
|
+
**Preview** works but may change in any release; **prototype** is new and incomplete, and may change or be removed. `/help` shows each command's level in every listing and on its page, the MCP catalog carries it, and a prototype says so once a session when it first runs.
|
|
174
|
+
|
|
153
175
|
## Security
|
|
154
176
|
|
|
155
|
-
Termapy runs with your privileges and does whatever you — or a connected MCP client — tell it, so point it at devices, profiles, and MCP clients you trust. The MCP server is
|
|
177
|
+
Termapy runs with your privileges and does whatever you — or a connected MCP client — tell it, so point it at devices, profiles, and MCP clients you trust. The MCP server is a preview, and its limits on host access are not complete yet: by default it refuses the access below on the main routes, but known gaps remain (listed in the [MCP server](src/termapy/help/mcp-server.md) help), so the MCP client's own permissions are the real boundary.
|
|
156
178
|
|
|
157
|
-
| Host access (
|
|
179
|
+
| Host access (refused by default on the main routes) | Opt in with |
|
|
158
180
|
| --- | --- |
|
|
159
181
|
| Files outside the config directory | `TERMAPY_MCP_FS_UNCONFINED=1` |
|
|
160
182
|
| Network sockets (`socket://`, `rfc2217://`) | `TERMAPY_MCP_NET_EGRESS=1` |
|
|
@@ -173,6 +195,9 @@ Each flag takes any boolean token (`1`, `on`, `true`, `yes`, ...); a value outsi
|
|
|
173
195
|
| Ctrl+S | Save SVG screenshot |
|
|
174
196
|
| Ctrl+T | Save text screenshot |
|
|
175
197
|
| Ctrl+P | Command palette |
|
|
198
|
+
| Ctrl+C | Copy the selected output text |
|
|
199
|
+
| Ctrl+A | Select all output (click it first) |
|
|
200
|
+
| Shift+Up | Select output lines from the prompt; then Shift+arrows grow it |
|
|
176
201
|
| F1–F4 | Help / Cfg / Run / Proto buttons (Ctrl+Shift+1–4 in VS Code); F10 edits the config |
|
|
177
202
|
| Up/Down | Cycle through command history |
|
|
178
203
|
| Escape | Clear input / exit history browsing |
|
|
@@ -245,6 +270,7 @@ The most common ones:
|
|
|
245
270
|
| `/cfg.auto <key> <value>` | Set an in-memory config key immediately (no confirmation) |
|
|
246
271
|
| `/cfg.list` | List all config files |
|
|
247
272
|
| `/cfg.load <name>` | Switch to a different config by name |
|
|
273
|
+
| `/cfg.loaded` | Show what the config load loaded: plugin files, symbols, device files |
|
|
248
274
|
| `/cfg.show` | Open the current config file in the system viewer |
|
|
249
275
|
| `/cfg.help` | Same as `/help cfg` |
|
|
250
276
|
| `/ss.svg {name}` | Save SVG screenshot |
|
|
@@ -252,7 +278,7 @@ The most common ones:
|
|
|
252
278
|
| `/ss.list` | List screenshots, newest first, with size and age |
|
|
253
279
|
| `/ss.explore` | Open the screenshot folder in the system file explorer |
|
|
254
280
|
| `/cls` | Clear the terminal screen |
|
|
255
|
-
| `/run {filename}` | Open Run picker (bare TUI), list scripts (bare CLI), or run; nests 5 deep
|
|
281
|
+
| `/run {filename}` | Open Run picker (bare TUI), list scripts (bare CLI), or run; nests 5 deep; `--echo` shows each command line as it runs |
|
|
256
282
|
| `/run.list` | List .run files in run/, newest first, with size, age, and summary |
|
|
257
283
|
| `/run.rename <old> <new>` | Rename a script (`.run` kept; never overwrites) |
|
|
258
284
|
| `/run.help` | Same as `/help run` |
|
|
@@ -291,31 +317,32 @@ The most common ones:
|
|
|
291
317
|
| `/proto.list` | List .pro files in proto/, newest first, with size, age and each one's `name` |
|
|
292
318
|
| `/proto.rename <old> <new>` | Rename a protocol script (`.pro` kept; never overwrites) |
|
|
293
319
|
| `/proto.hex {on\|off\|toggle}` | Same flag as `/term.hex` |
|
|
294
|
-
| `/proto.crc.list {pat}` | List available CRC algorithms (optional
|
|
320
|
+
| `/proto.crc.list {pat}` | List available CRC algorithms (optional name pattern: `modbus`, `crc16*`) |
|
|
295
321
|
| `/proto.crc.info <name>` | Show CRC algorithm parameters and description |
|
|
296
322
|
| `/proto.crc.calc <n> {d}` | Compute CRC over hex bytes, quoted text, or a file; omit data to verify check string |
|
|
297
323
|
| `/proto.crc.find bin=<hex>\|asc=<text>\|cmd=<trigger>` | Identify CRC algorithm from a captured packet, text, or a command's reply |
|
|
298
324
|
| `/proto.info` | Print current protocol state |
|
|
299
|
-
| `/mem.dump <target> {len} {type}` | Hexdump or typed word columns at
|
|
325
|
+
| `/mem.dump <target> {len} {type}` | Hexdump or typed word columns; columns follow the output level (bytes at quiet, +ASCII at normal, +address at verbose) |
|
|
300
326
|
| `/mem.read <target> {type}` | One typed value: scalar, char, register field, bit or slice |
|
|
301
|
-
| `/mem.write <target> <
|
|
327
|
+
| `/mem.write <target> <value>` | Write a value to a named symbol, register or field, or hex bytes at an address (audited; destructive over MCP) |
|
|
302
328
|
| `/mem.or <target> <mask>` | Boolean ops on one word (also `.and`, `.clear`, `.xor`, `.not`); atomic via `MEM.M` where expressible |
|
|
303
329
|
| `/mem.str <target> {max}` | Read a NUL-terminated string as a first-class value |
|
|
304
330
|
| `/mem.info` | Memory access config: dialect, block limit, width, endian, atomic modify |
|
|
305
331
|
| `/sym <addr\|name>` | Symbol table: name to address, or address to `name+offset` |
|
|
306
|
-
| `/sym.import {file} {format=<value>}` | Convert a linker map to `sym/<cfg>.symbols.json` and load it (bare: re-import the same
|
|
332
|
+
| `/sym.import {file} {format=<value>}` | Convert an ELF or a linker map to `sym/<cfg>.symbols.json` and load it (bare: re-import the same file) |
|
|
307
333
|
| `/sym.info` | Show the loaded symbol table: file, source, counts by section, range |
|
|
308
334
|
| `/sym.load {path}` | Load a symbol table (default: the cfg sidecar `/sym.import` writes) |
|
|
309
|
-
| `/sym.search <pattern>` | Search symbols by name: exact
|
|
335
|
+
| `/sym.search <pattern>` | Search symbols by name: the exact name, else a name pattern (`gpio`, `Mon*`) |
|
|
310
336
|
| `/sym.unload` | Clear the loaded symbol table |
|
|
311
337
|
| `/dev.import <file> {format=<value>} {category=<value>} {to=<value>} {use=on\|off}` | Convert a vendor register description (CMSIS-SVD) into this config's `lib/` and reference it from `dev/` (`to=global` shares it) |
|
|
312
338
|
| `/dev.lib {pattern}` | List the parts the libraries hold (available, not loaded), with their layer |
|
|
313
339
|
| `/dev.list` | List the devices this config has loaded, with layer and placement |
|
|
340
|
+
| `/dev.regs <device> {pattern}` | List a loaded device's registers from its file (never the chip), hazards flagged |
|
|
314
341
|
| `/dev.use <part> {at=<value>}` | Add a library part to this config; `at=NAME@ADDR ...` places a relocatable one |
|
|
315
342
|
| `/var {name}` | List user variables, or show one by name |
|
|
316
343
|
| `/var.set <NAME> <value>` | Set a user variable |
|
|
317
344
|
| `/var.clear` | Clear all user variables |
|
|
318
|
-
| `/env.list {pattern}` | List environment variables (all,
|
|
345
|
+
| `/env.list {pattern}` | List environment variables (all, or a name pattern: `path`, `COM*`) |
|
|
319
346
|
| `/env.set <name> <value>` | Set a session-scoped environment variable |
|
|
320
347
|
| `/env.reload` | Re-snapshot variables from the OS environment |
|
|
321
348
|
| `/cap.text <f> ...` | Capture serial text to file for a timed duration |
|
|
@@ -359,6 +386,7 @@ termapy_cfg/
|
|
|
359
386
|
│ ├── temp_plot.py
|
|
360
387
|
│ └── traffic.py
|
|
361
388
|
├── sym/ # symbol tables (demo.symbols.json, auto-loaded)
|
|
389
|
+
├── dev/ # device files (console.device.json: the UART block CONSOLE names)
|
|
362
390
|
└── proto/ # protocol test scripts
|
|
363
391
|
├── at_test.pro
|
|
364
392
|
├── bitfield_inline.pro
|
|
@@ -402,7 +430,7 @@ You can also manage environment variables at runtime with REPL commands:
|
|
|
402
430
|
|
|
403
431
|
| Command | Description |
|
|
404
432
|
| ----------------------- | -------------------------------------------------- |
|
|
405
|
-
| `/env.list {pattern}` | List variables (all,
|
|
433
|
+
| `/env.list {pattern}` | List variables (all, or a name pattern: `COM*`) |
|
|
406
434
|
| `/env.set <name> <val>` | Set a session-scoped variable (in-memory only) |
|
|
407
435
|
| `/env.reload` | Re-snapshot variables from the OS environment |
|
|
408
436
|
|
|
@@ -572,18 +600,9 @@ Set `serial.flow_control` to `"manual"` to get DTR, RTS, and Break buttons in th
|
|
|
572
600
|
<!-- validate-config-keys -->
|
|
573
601
|
```json
|
|
574
602
|
{
|
|
575
|
-
"config_version":
|
|
603
|
+
"config_version": 33,
|
|
576
604
|
"title": "",
|
|
577
605
|
"border_color": "",
|
|
578
|
-
"max_lines": 10000,
|
|
579
|
-
"default_ui": "tui",
|
|
580
|
-
"vt100_hint": true,
|
|
581
|
-
"cmd_prefix": "/",
|
|
582
|
-
"cli_prompt": "$(CFG)> ",
|
|
583
|
-
"cli_completion": true,
|
|
584
|
-
"config_read_only": false,
|
|
585
|
-
"profile_path": "",
|
|
586
|
-
"validate_typed_args": false,
|
|
587
606
|
"serial": {
|
|
588
607
|
"port": "COM4",
|
|
589
608
|
"baud_rate": 115200,
|
|
@@ -593,44 +612,57 @@ Set `serial.flow_control` to `"manual"` to get DTR, RTS, and Break buttons in th
|
|
|
593
612
|
"stop_bits": 1,
|
|
594
613
|
"flow_control": "none"
|
|
595
614
|
},
|
|
596
|
-
"encoding": "utf-8",
|
|
597
|
-
"cmd_delay_ms": 0,
|
|
598
|
-
"protocol": "text",
|
|
599
|
-
"ndjson_field_routing": {
|
|
600
|
-
"response_id": "id",
|
|
601
|
-
"error_field": "error",
|
|
602
|
-
"event_field": "event"
|
|
603
|
-
},
|
|
604
|
-
"default_response_timeout_ms": 1000,
|
|
605
615
|
"auto_connect": false,
|
|
606
616
|
"auto_reconnect": false,
|
|
607
617
|
"on_connect_cmd": "",
|
|
608
618
|
"tui_on_connect_cmd": "",
|
|
609
619
|
"cli_on_connect_cmd": "",
|
|
610
620
|
"mcp_on_connect_cmd": "",
|
|
621
|
+
"encoding": "utf-8",
|
|
611
622
|
"eol": "\r",
|
|
612
623
|
"eol_rx": "auto",
|
|
624
|
+
"eol_markers": false,
|
|
613
625
|
"send_bare_enter": false,
|
|
626
|
+
"cmd_delay_ms": 0,
|
|
627
|
+
"multiline_paste": true,
|
|
628
|
+
"multiline_paste_delay_ms": 10,
|
|
614
629
|
"echo": false,
|
|
615
630
|
"echo_fmt": "[purple]$(CFG)> {cmd}[/]",
|
|
616
|
-
"log_file": "",
|
|
617
|
-
"show_traceback": false,
|
|
618
|
-
"proto_frame_gap_ms": 50,
|
|
619
|
-
"proto_results_template": "{name}_results.json",
|
|
620
631
|
"timestamps": false,
|
|
621
|
-
"eol_markers": false,
|
|
622
632
|
"line_no": false,
|
|
623
633
|
"hex": false,
|
|
634
|
+
"max_lines": 10000,
|
|
635
|
+
"max_grep_lines": 100,
|
|
636
|
+
"protocol": "text",
|
|
637
|
+
"ndjson_field_routing": {
|
|
638
|
+
"response_id": "id",
|
|
639
|
+
"error_field": "error",
|
|
640
|
+
"event_field": "event"
|
|
641
|
+
},
|
|
624
642
|
"request_mode": false,
|
|
625
643
|
"request_err_pattern": "(?i)^(ERROR|ERR|FAULT)\\b",
|
|
626
|
-
"json_style": "compact",
|
|
627
644
|
"strip_device_echo": false,
|
|
628
|
-
"
|
|
645
|
+
"json_style": "compact",
|
|
646
|
+
"profile_path": "",
|
|
647
|
+
"validate_typed_args": false,
|
|
648
|
+
"default_response_timeout_ms": 1000,
|
|
649
|
+
"log_file": "",
|
|
629
650
|
"file_xfer_root": "",
|
|
651
|
+
"proto_frame_gap_ms": 50,
|
|
652
|
+
"proto_results_template": "{name}_results.json",
|
|
653
|
+
"default_ui": "tui",
|
|
654
|
+
"quiet_start": true,
|
|
655
|
+
"vt100_hint": true,
|
|
656
|
+
"cmd_prefix": "/",
|
|
657
|
+
"cli_prompt": "$(CFG)> ",
|
|
658
|
+
"cli_completion": true,
|
|
659
|
+
"show_traceback": false,
|
|
630
660
|
"cfg_enabled": true,
|
|
631
661
|
"run_enabled": true,
|
|
632
662
|
"proto_enabled": true,
|
|
633
663
|
"record_enabled": true,
|
|
664
|
+
"config_read_only": false,
|
|
665
|
+
"custom_buttons_side": "bottom",
|
|
634
666
|
"custom_buttons": []
|
|
635
667
|
}
|
|
636
668
|
```
|
|
@@ -907,7 +939,7 @@ The device supports a full AT command set. Type commands and get responses just
|
|
|
907
939
|
| `AT+STATUS` | Device status (LED, uptime, connections) |
|
|
908
940
|
| `AT+RESET` | Reset device (simulates boot sequence) |
|
|
909
941
|
| `mem <addr> [len]` | Hex memory dump (deterministic, max 256 bytes) |
|
|
910
|
-
| `help` |
|
|
942
|
+
| `help` | The command landscape, grouped |
|
|
911
943
|
|
|
912
944
|
#### GPS / NMEA commands
|
|
913
945
|
|
|
@@ -1011,7 +1043,7 @@ It's also a reversible toggle from inside the TUI, like `/cli` <-> `/tui`: `/vt1
|
|
|
1011
1043
|
|
|
1012
1044
|
### Symbols, memory and parts
|
|
1013
1045
|
|
|
1014
|
-
`/sym.import
|
|
1046
|
+
`/sym.import out/default.elf` turns your build into names, sizes and C types (from its debug info), so `/mem.read gTemp` reads a variable by name instead of by address, signed or float as declared; a linker map works too, with names and sizes only. A `const` in the build keeps its value, and a pointer constant to a peripheral names its registers under your own name (`SPI_PORT_DIR` for `PORTC_DIR`). `/dev.import part.svd` does the same for the silicon: a vendor CMSIS-SVD becomes a **device file** -- every register of the part with its bit fields -- stored once in the config's `lib/` and referenced from its `dev/`, so `/mem.read PORT_GROUP0_DIR` works and a checked-in config folder carries its parts. A part on the external bus (two ADCs, an FPGA block) is written once with register offsets and placed per board: `/dev.use acme-adc16 at=ADC1@0x60000000 ADC2@0x60001000`. Registers are live silicon, not variables, so `/mem.*` refuses bulk reads over them, refuses reads of write-only registers, and logs the rest. The device side is the MEM wire spec (`/firmware.copy mem` writes the drop-in `termapy_mem.c` into your tree) or a profile block describing your monitor's own peek/poke grammar. See the Symbols, Devices and Memory help pages.
|
|
1015
1047
|
|
|
1016
1048
|
### Plugins
|
|
1017
1049
|
|
|
@@ -1047,7 +1079,7 @@ COMMAND = Command(
|
|
|
1047
1079
|
|
|
1048
1080
|
Resolution is the same in every frontend (TUI, CLI, MCP server) and reruns on every config switch; a folder plugin can never take an app hook's name.
|
|
1049
1081
|
|
|
1050
|
-
Subcommands (`/tool.run`, `/tool.status`), typed parameters, scriptable return values, the full `PluginContext` API with its five handles and capability gating, and
|
|
1082
|
+
Subcommands (`/tool.run`, `/tool.status`), typed parameters, scriptable return values, the full `PluginContext` API with its five handles and capability gating, and `ctx.internal`, the engine and host services every plugin may use, are all in the [Writing plugins](src/termapy/help/writing-plugins.md) guide, which also ships in the in-app help.
|
|
1051
1083
|
|
|
1052
1084
|
<details>
|
|
1053
1085
|
<summary>Example plugins</summary>
|
|
@@ -1212,7 +1244,7 @@ Every command runs on a worker thread, the serial reader is the only long-lived
|
|
|
1212
1244
|
</details>
|
|
1213
1245
|
|
|
1214
1246
|
<details>
|
|
1215
|
-
<summary><strong>Test coverage</strong> -
|
|
1247
|
+
<summary><strong>Test coverage</strong> - 6018 tests</summary>
|
|
1216
1248
|
|
|
1217
1249
|
Run the full suite with `uv run pytest`. (The count above is the one place it
|
|
1218
1250
|
is tracked; `release_prep` refreshes it each release.) The coverage figure is
|
|
@@ -54,6 +54,12 @@ For your own device, one line creates a config and connects:
|
|
|
54
54
|
termapy --new my_device COM4 115200 8N1
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
For a new dev board, a starter project gives it a command monitor that answers you and an MCP agent on day one. The Raspberry Pi Pico and the ESP32-S3 DevKitC-1 have one; see the Dev boards help page:
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
termapy --board pico
|
|
61
|
+
```
|
|
62
|
+
|
|
57
63
|
For a plain-text terminal (no TUI), use CLI mode:
|
|
58
64
|
|
|
59
65
|
```sh
|
|
@@ -103,11 +109,26 @@ See the [detailed feature comparison](docs/comparison.md) against RealTerm, Cool
|
|
|
103
109
|
|
|
104
110
|
</details>
|
|
105
111
|
|
|
112
|
+
## Feature status
|
|
113
|
+
|
|
114
|
+
Termapy is in beta: everything not listed here is stable and ready for public testing. These parts work and are used daily, but they are still being developed, sit outside the compatibility promise, and may change in any release.
|
|
115
|
+
|
|
116
|
+
| Feature | Commands | Status |
|
|
117
|
+
| --- | --- | --- |
|
|
118
|
+
| MCP server | `/mcp` | preview |
|
|
119
|
+
| Device files | `/dev` | preview |
|
|
120
|
+
| Symbols | `/sym` | preview |
|
|
121
|
+
| Memory access | `/mem` | preview |
|
|
122
|
+
| Dev board starters | `/board` | prototype |
|
|
123
|
+
| Device-side firmware | `/firmware` | prototype |
|
|
124
|
+
|
|
125
|
+
**Preview** works but may change in any release; **prototype** is new and incomplete, and may change or be removed. `/help` shows each command's level in every listing and on its page, the MCP catalog carries it, and a prototype says so once a session when it first runs.
|
|
126
|
+
|
|
106
127
|
## Security
|
|
107
128
|
|
|
108
|
-
Termapy runs with your privileges and does whatever you — or a connected MCP client — tell it, so point it at devices, profiles, and MCP clients you trust. The MCP server is
|
|
129
|
+
Termapy runs with your privileges and does whatever you — or a connected MCP client — tell it, so point it at devices, profiles, and MCP clients you trust. The MCP server is a preview, and its limits on host access are not complete yet: by default it refuses the access below on the main routes, but known gaps remain (listed in the [MCP server](src/termapy/help/mcp-server.md) help), so the MCP client's own permissions are the real boundary.
|
|
109
130
|
|
|
110
|
-
| Host access (
|
|
131
|
+
| Host access (refused by default on the main routes) | Opt in with |
|
|
111
132
|
| --- | --- |
|
|
112
133
|
| Files outside the config directory | `TERMAPY_MCP_FS_UNCONFINED=1` |
|
|
113
134
|
| Network sockets (`socket://`, `rfc2217://`) | `TERMAPY_MCP_NET_EGRESS=1` |
|
|
@@ -126,6 +147,9 @@ Each flag takes any boolean token (`1`, `on`, `true`, `yes`, ...); a value outsi
|
|
|
126
147
|
| Ctrl+S | Save SVG screenshot |
|
|
127
148
|
| Ctrl+T | Save text screenshot |
|
|
128
149
|
| Ctrl+P | Command palette |
|
|
150
|
+
| Ctrl+C | Copy the selected output text |
|
|
151
|
+
| Ctrl+A | Select all output (click it first) |
|
|
152
|
+
| Shift+Up | Select output lines from the prompt; then Shift+arrows grow it |
|
|
129
153
|
| F1–F4 | Help / Cfg / Run / Proto buttons (Ctrl+Shift+1–4 in VS Code); F10 edits the config |
|
|
130
154
|
| Up/Down | Cycle through command history |
|
|
131
155
|
| Escape | Clear input / exit history browsing |
|
|
@@ -198,6 +222,7 @@ The most common ones:
|
|
|
198
222
|
| `/cfg.auto <key> <value>` | Set an in-memory config key immediately (no confirmation) |
|
|
199
223
|
| `/cfg.list` | List all config files |
|
|
200
224
|
| `/cfg.load <name>` | Switch to a different config by name |
|
|
225
|
+
| `/cfg.loaded` | Show what the config load loaded: plugin files, symbols, device files |
|
|
201
226
|
| `/cfg.show` | Open the current config file in the system viewer |
|
|
202
227
|
| `/cfg.help` | Same as `/help cfg` |
|
|
203
228
|
| `/ss.svg {name}` | Save SVG screenshot |
|
|
@@ -205,7 +230,7 @@ The most common ones:
|
|
|
205
230
|
| `/ss.list` | List screenshots, newest first, with size and age |
|
|
206
231
|
| `/ss.explore` | Open the screenshot folder in the system file explorer |
|
|
207
232
|
| `/cls` | Clear the terminal screen |
|
|
208
|
-
| `/run {filename}` | Open Run picker (bare TUI), list scripts (bare CLI), or run; nests 5 deep
|
|
233
|
+
| `/run {filename}` | Open Run picker (bare TUI), list scripts (bare CLI), or run; nests 5 deep; `--echo` shows each command line as it runs |
|
|
209
234
|
| `/run.list` | List .run files in run/, newest first, with size, age, and summary |
|
|
210
235
|
| `/run.rename <old> <new>` | Rename a script (`.run` kept; never overwrites) |
|
|
211
236
|
| `/run.help` | Same as `/help run` |
|
|
@@ -244,31 +269,32 @@ The most common ones:
|
|
|
244
269
|
| `/proto.list` | List .pro files in proto/, newest first, with size, age and each one's `name` |
|
|
245
270
|
| `/proto.rename <old> <new>` | Rename a protocol script (`.pro` kept; never overwrites) |
|
|
246
271
|
| `/proto.hex {on\|off\|toggle}` | Same flag as `/term.hex` |
|
|
247
|
-
| `/proto.crc.list {pat}` | List available CRC algorithms (optional
|
|
272
|
+
| `/proto.crc.list {pat}` | List available CRC algorithms (optional name pattern: `modbus`, `crc16*`) |
|
|
248
273
|
| `/proto.crc.info <name>` | Show CRC algorithm parameters and description |
|
|
249
274
|
| `/proto.crc.calc <n> {d}` | Compute CRC over hex bytes, quoted text, or a file; omit data to verify check string |
|
|
250
275
|
| `/proto.crc.find bin=<hex>\|asc=<text>\|cmd=<trigger>` | Identify CRC algorithm from a captured packet, text, or a command's reply |
|
|
251
276
|
| `/proto.info` | Print current protocol state |
|
|
252
|
-
| `/mem.dump <target> {len} {type}` | Hexdump or typed word columns at
|
|
277
|
+
| `/mem.dump <target> {len} {type}` | Hexdump or typed word columns; columns follow the output level (bytes at quiet, +ASCII at normal, +address at verbose) |
|
|
253
278
|
| `/mem.read <target> {type}` | One typed value: scalar, char, register field, bit or slice |
|
|
254
|
-
| `/mem.write <target> <
|
|
279
|
+
| `/mem.write <target> <value>` | Write a value to a named symbol, register or field, or hex bytes at an address (audited; destructive over MCP) |
|
|
255
280
|
| `/mem.or <target> <mask>` | Boolean ops on one word (also `.and`, `.clear`, `.xor`, `.not`); atomic via `MEM.M` where expressible |
|
|
256
281
|
| `/mem.str <target> {max}` | Read a NUL-terminated string as a first-class value |
|
|
257
282
|
| `/mem.info` | Memory access config: dialect, block limit, width, endian, atomic modify |
|
|
258
283
|
| `/sym <addr\|name>` | Symbol table: name to address, or address to `name+offset` |
|
|
259
|
-
| `/sym.import {file} {format=<value>}` | Convert a linker map to `sym/<cfg>.symbols.json` and load it (bare: re-import the same
|
|
284
|
+
| `/sym.import {file} {format=<value>}` | Convert an ELF or a linker map to `sym/<cfg>.symbols.json` and load it (bare: re-import the same file) |
|
|
260
285
|
| `/sym.info` | Show the loaded symbol table: file, source, counts by section, range |
|
|
261
286
|
| `/sym.load {path}` | Load a symbol table (default: the cfg sidecar `/sym.import` writes) |
|
|
262
|
-
| `/sym.search <pattern>` | Search symbols by name: exact
|
|
287
|
+
| `/sym.search <pattern>` | Search symbols by name: the exact name, else a name pattern (`gpio`, `Mon*`) |
|
|
263
288
|
| `/sym.unload` | Clear the loaded symbol table |
|
|
264
289
|
| `/dev.import <file> {format=<value>} {category=<value>} {to=<value>} {use=on\|off}` | Convert a vendor register description (CMSIS-SVD) into this config's `lib/` and reference it from `dev/` (`to=global` shares it) |
|
|
265
290
|
| `/dev.lib {pattern}` | List the parts the libraries hold (available, not loaded), with their layer |
|
|
266
291
|
| `/dev.list` | List the devices this config has loaded, with layer and placement |
|
|
292
|
+
| `/dev.regs <device> {pattern}` | List a loaded device's registers from its file (never the chip), hazards flagged |
|
|
267
293
|
| `/dev.use <part> {at=<value>}` | Add a library part to this config; `at=NAME@ADDR ...` places a relocatable one |
|
|
268
294
|
| `/var {name}` | List user variables, or show one by name |
|
|
269
295
|
| `/var.set <NAME> <value>` | Set a user variable |
|
|
270
296
|
| `/var.clear` | Clear all user variables |
|
|
271
|
-
| `/env.list {pattern}` | List environment variables (all,
|
|
297
|
+
| `/env.list {pattern}` | List environment variables (all, or a name pattern: `path`, `COM*`) |
|
|
272
298
|
| `/env.set <name> <value>` | Set a session-scoped environment variable |
|
|
273
299
|
| `/env.reload` | Re-snapshot variables from the OS environment |
|
|
274
300
|
| `/cap.text <f> ...` | Capture serial text to file for a timed duration |
|
|
@@ -312,6 +338,7 @@ termapy_cfg/
|
|
|
312
338
|
│ ├── temp_plot.py
|
|
313
339
|
│ └── traffic.py
|
|
314
340
|
├── sym/ # symbol tables (demo.symbols.json, auto-loaded)
|
|
341
|
+
├── dev/ # device files (console.device.json: the UART block CONSOLE names)
|
|
315
342
|
└── proto/ # protocol test scripts
|
|
316
343
|
├── at_test.pro
|
|
317
344
|
├── bitfield_inline.pro
|
|
@@ -355,7 +382,7 @@ You can also manage environment variables at runtime with REPL commands:
|
|
|
355
382
|
|
|
356
383
|
| Command | Description |
|
|
357
384
|
| ----------------------- | -------------------------------------------------- |
|
|
358
|
-
| `/env.list {pattern}` | List variables (all,
|
|
385
|
+
| `/env.list {pattern}` | List variables (all, or a name pattern: `COM*`) |
|
|
359
386
|
| `/env.set <name> <val>` | Set a session-scoped variable (in-memory only) |
|
|
360
387
|
| `/env.reload` | Re-snapshot variables from the OS environment |
|
|
361
388
|
|
|
@@ -525,18 +552,9 @@ Set `serial.flow_control` to `"manual"` to get DTR, RTS, and Break buttons in th
|
|
|
525
552
|
<!-- validate-config-keys -->
|
|
526
553
|
```json
|
|
527
554
|
{
|
|
528
|
-
"config_version":
|
|
555
|
+
"config_version": 33,
|
|
529
556
|
"title": "",
|
|
530
557
|
"border_color": "",
|
|
531
|
-
"max_lines": 10000,
|
|
532
|
-
"default_ui": "tui",
|
|
533
|
-
"vt100_hint": true,
|
|
534
|
-
"cmd_prefix": "/",
|
|
535
|
-
"cli_prompt": "$(CFG)> ",
|
|
536
|
-
"cli_completion": true,
|
|
537
|
-
"config_read_only": false,
|
|
538
|
-
"profile_path": "",
|
|
539
|
-
"validate_typed_args": false,
|
|
540
558
|
"serial": {
|
|
541
559
|
"port": "COM4",
|
|
542
560
|
"baud_rate": 115200,
|
|
@@ -546,44 +564,57 @@ Set `serial.flow_control` to `"manual"` to get DTR, RTS, and Break buttons in th
|
|
|
546
564
|
"stop_bits": 1,
|
|
547
565
|
"flow_control": "none"
|
|
548
566
|
},
|
|
549
|
-
"encoding": "utf-8",
|
|
550
|
-
"cmd_delay_ms": 0,
|
|
551
|
-
"protocol": "text",
|
|
552
|
-
"ndjson_field_routing": {
|
|
553
|
-
"response_id": "id",
|
|
554
|
-
"error_field": "error",
|
|
555
|
-
"event_field": "event"
|
|
556
|
-
},
|
|
557
|
-
"default_response_timeout_ms": 1000,
|
|
558
567
|
"auto_connect": false,
|
|
559
568
|
"auto_reconnect": false,
|
|
560
569
|
"on_connect_cmd": "",
|
|
561
570
|
"tui_on_connect_cmd": "",
|
|
562
571
|
"cli_on_connect_cmd": "",
|
|
563
572
|
"mcp_on_connect_cmd": "",
|
|
573
|
+
"encoding": "utf-8",
|
|
564
574
|
"eol": "\r",
|
|
565
575
|
"eol_rx": "auto",
|
|
576
|
+
"eol_markers": false,
|
|
566
577
|
"send_bare_enter": false,
|
|
578
|
+
"cmd_delay_ms": 0,
|
|
579
|
+
"multiline_paste": true,
|
|
580
|
+
"multiline_paste_delay_ms": 10,
|
|
567
581
|
"echo": false,
|
|
568
582
|
"echo_fmt": "[purple]$(CFG)> {cmd}[/]",
|
|
569
|
-
"log_file": "",
|
|
570
|
-
"show_traceback": false,
|
|
571
|
-
"proto_frame_gap_ms": 50,
|
|
572
|
-
"proto_results_template": "{name}_results.json",
|
|
573
583
|
"timestamps": false,
|
|
574
|
-
"eol_markers": false,
|
|
575
584
|
"line_no": false,
|
|
576
585
|
"hex": false,
|
|
586
|
+
"max_lines": 10000,
|
|
587
|
+
"max_grep_lines": 100,
|
|
588
|
+
"protocol": "text",
|
|
589
|
+
"ndjson_field_routing": {
|
|
590
|
+
"response_id": "id",
|
|
591
|
+
"error_field": "error",
|
|
592
|
+
"event_field": "event"
|
|
593
|
+
},
|
|
577
594
|
"request_mode": false,
|
|
578
595
|
"request_err_pattern": "(?i)^(ERROR|ERR|FAULT)\\b",
|
|
579
|
-
"json_style": "compact",
|
|
580
596
|
"strip_device_echo": false,
|
|
581
|
-
"
|
|
597
|
+
"json_style": "compact",
|
|
598
|
+
"profile_path": "",
|
|
599
|
+
"validate_typed_args": false,
|
|
600
|
+
"default_response_timeout_ms": 1000,
|
|
601
|
+
"log_file": "",
|
|
582
602
|
"file_xfer_root": "",
|
|
603
|
+
"proto_frame_gap_ms": 50,
|
|
604
|
+
"proto_results_template": "{name}_results.json",
|
|
605
|
+
"default_ui": "tui",
|
|
606
|
+
"quiet_start": true,
|
|
607
|
+
"vt100_hint": true,
|
|
608
|
+
"cmd_prefix": "/",
|
|
609
|
+
"cli_prompt": "$(CFG)> ",
|
|
610
|
+
"cli_completion": true,
|
|
611
|
+
"show_traceback": false,
|
|
583
612
|
"cfg_enabled": true,
|
|
584
613
|
"run_enabled": true,
|
|
585
614
|
"proto_enabled": true,
|
|
586
615
|
"record_enabled": true,
|
|
616
|
+
"config_read_only": false,
|
|
617
|
+
"custom_buttons_side": "bottom",
|
|
587
618
|
"custom_buttons": []
|
|
588
619
|
}
|
|
589
620
|
```
|
|
@@ -860,7 +891,7 @@ The device supports a full AT command set. Type commands and get responses just
|
|
|
860
891
|
| `AT+STATUS` | Device status (LED, uptime, connections) |
|
|
861
892
|
| `AT+RESET` | Reset device (simulates boot sequence) |
|
|
862
893
|
| `mem <addr> [len]` | Hex memory dump (deterministic, max 256 bytes) |
|
|
863
|
-
| `help` |
|
|
894
|
+
| `help` | The command landscape, grouped |
|
|
864
895
|
|
|
865
896
|
#### GPS / NMEA commands
|
|
866
897
|
|
|
@@ -964,7 +995,7 @@ It's also a reversible toggle from inside the TUI, like `/cli` <-> `/tui`: `/vt1
|
|
|
964
995
|
|
|
965
996
|
### Symbols, memory and parts
|
|
966
997
|
|
|
967
|
-
`/sym.import
|
|
998
|
+
`/sym.import out/default.elf` turns your build into names, sizes and C types (from its debug info), so `/mem.read gTemp` reads a variable by name instead of by address, signed or float as declared; a linker map works too, with names and sizes only. A `const` in the build keeps its value, and a pointer constant to a peripheral names its registers under your own name (`SPI_PORT_DIR` for `PORTC_DIR`). `/dev.import part.svd` does the same for the silicon: a vendor CMSIS-SVD becomes a **device file** -- every register of the part with its bit fields -- stored once in the config's `lib/` and referenced from its `dev/`, so `/mem.read PORT_GROUP0_DIR` works and a checked-in config folder carries its parts. A part on the external bus (two ADCs, an FPGA block) is written once with register offsets and placed per board: `/dev.use acme-adc16 at=ADC1@0x60000000 ADC2@0x60001000`. Registers are live silicon, not variables, so `/mem.*` refuses bulk reads over them, refuses reads of write-only registers, and logs the rest. The device side is the MEM wire spec (`/firmware.copy mem` writes the drop-in `termapy_mem.c` into your tree) or a profile block describing your monitor's own peek/poke grammar. See the Symbols, Devices and Memory help pages.
|
|
968
999
|
|
|
969
1000
|
### Plugins
|
|
970
1001
|
|
|
@@ -1000,7 +1031,7 @@ COMMAND = Command(
|
|
|
1000
1031
|
|
|
1001
1032
|
Resolution is the same in every frontend (TUI, CLI, MCP server) and reruns on every config switch; a folder plugin can never take an app hook's name.
|
|
1002
1033
|
|
|
1003
|
-
Subcommands (`/tool.run`, `/tool.status`), typed parameters, scriptable return values, the full `PluginContext` API with its five handles and capability gating, and
|
|
1034
|
+
Subcommands (`/tool.run`, `/tool.status`), typed parameters, scriptable return values, the full `PluginContext` API with its five handles and capability gating, and `ctx.internal`, the engine and host services every plugin may use, are all in the [Writing plugins](src/termapy/help/writing-plugins.md) guide, which also ships in the in-app help.
|
|
1004
1035
|
|
|
1005
1036
|
<details>
|
|
1006
1037
|
<summary>Example plugins</summary>
|
|
@@ -1165,7 +1196,7 @@ Every command runs on a worker thread, the serial reader is the only long-lived
|
|
|
1165
1196
|
</details>
|
|
1166
1197
|
|
|
1167
1198
|
<details>
|
|
1168
|
-
<summary><strong>Test coverage</strong> -
|
|
1199
|
+
<summary><strong>Test coverage</strong> - 6018 tests</summary>
|
|
1169
1200
|
|
|
1170
1201
|
Run the full suite with `uv run pytest`. (The count above is the one place it
|
|
1171
1202
|
is tracked; `release_prep` refreshes it each release.) The coverage figure is
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "termapy"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.79.0"
|
|
4
4
|
description = "A TUI serial terminal with ANSI color support, built on Textual and pyserial"
|
|
5
5
|
license = "MIT"
|
|
6
6
|
license-files = ["LICENSE"]
|
|
@@ -32,7 +32,7 @@ classifiers = [
|
|
|
32
32
|
"Topic :: Terminals :: Serial",
|
|
33
33
|
]
|
|
34
34
|
dependencies = [
|
|
35
|
-
"textual>=0
|
|
35
|
+
"textual>=2.0",
|
|
36
36
|
"prompt-toolkit>=3.0",
|
|
37
37
|
"pygments>=2.20.0",
|
|
38
38
|
"tree-sitter>=0.25.0,<0.27",
|
|
@@ -43,6 +43,7 @@ dependencies = [
|
|
|
43
43
|
"frist>=0.21",
|
|
44
44
|
"platformdirs>=4.0",
|
|
45
45
|
"crcglot>=0.32.1",
|
|
46
|
+
"pyelftools>=0.33",
|
|
46
47
|
]
|
|
47
48
|
|
|
48
49
|
[[project.authors]]
|
|
@@ -86,7 +87,10 @@ extra-paths = [
|
|
|
86
87
|
]
|
|
87
88
|
|
|
88
89
|
[tool.ty.src]
|
|
89
|
-
exclude = [
|
|
90
|
+
exclude = [
|
|
91
|
+
"src/termapy/vendor/**",
|
|
92
|
+
"src/termapy/boards/*/firmware/**",
|
|
93
|
+
]
|
|
90
94
|
|
|
91
95
|
[tool.pyright]
|
|
92
96
|
extraPaths = [
|
|
@@ -96,6 +100,7 @@ extraPaths = [
|
|
|
96
100
|
exclude = [
|
|
97
101
|
"src/termapy/vendor",
|
|
98
102
|
"src/termapy/html",
|
|
103
|
+
"src/termapy/boards/*/firmware",
|
|
99
104
|
]
|
|
100
105
|
|
|
101
106
|
[tool.ruff]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "termapy"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.79.0"
|
|
4
4
|
description = "A TUI serial terminal with ANSI color support, built on Textual and pyserial"
|
|
5
5
|
license = "MIT"
|
|
6
6
|
license-files = ["LICENSE"]
|
|
@@ -26,7 +26,7 @@ classifiers = [
|
|
|
26
26
|
dependencies = [
|
|
27
27
|
# Core TUI framework (without [syntax] extra to avoid installing 16 tree-sitter
|
|
28
28
|
# grammars - we only need json, toml, bash for our editors, listed below)
|
|
29
|
-
"textual>=0
|
|
29
|
+
"textual>=2.0",
|
|
30
30
|
# pyserial is vendored in src/termapy/vendor/serial/ (see vendor/LICENSES.md)
|
|
31
31
|
"prompt-toolkit>=3.0",
|
|
32
32
|
"pygments>=2.20.0",
|
|
@@ -137,6 +137,12 @@ dependencies = [
|
|
|
137
137
|
# /proto.crc.detect (single-frame is unaffected). Surfacing it is a
|
|
138
138
|
# follow-up, not a floor concern. Floor moves to 0.31.0.
|
|
139
139
|
"crcglot>=0.32.1",
|
|
140
|
+
# ELF + DWARF reader behind /sym.import of a build's .elf: symbols from
|
|
141
|
+
# the symbol table, C types from the debug info. Public domain, pure
|
|
142
|
+
# Python, no dependencies. Imported only inside the elf converter, so
|
|
143
|
+
# startup and the flag paths never load it. 0.33 is the floor tested
|
|
144
|
+
# (DWARF 2 from XC32, DWARF 5 from Clang).
|
|
145
|
+
"pyelftools>=0.33",
|
|
140
146
|
]
|
|
141
147
|
|
|
142
148
|
[project.optional-dependencies]
|
|
@@ -225,7 +231,7 @@ extra-paths = ["src/termapy/vendor", "scripts"]
|
|
|
225
231
|
# exclude mirrors [tool.ty.src]: don't LINT the vendored code, but it
|
|
226
232
|
# stays visible for import resolution.
|
|
227
233
|
extraPaths = ["src/termapy/vendor", "scripts"]
|
|
228
|
-
exclude = ["src/termapy/vendor", "src/termapy/html"]
|
|
234
|
+
exclude = ["src/termapy/vendor", "src/termapy/html", "src/termapy/boards/*/firmware"]
|
|
229
235
|
|
|
230
236
|
[tool.ty.src]
|
|
231
237
|
# The gate (.githooks/pre-commit, release_prep) runs `ty check` with no
|
|
@@ -236,7 +242,9 @@ exclude = ["src/termapy/vendor", "src/termapy/html"]
|
|
|
236
242
|
# modules (fcntl, termios, select.POLL*) in its platform shims, and ty
|
|
237
243
|
# flags every reference as unresolved on Windows. We still need the
|
|
238
244
|
# extra-paths above so `import serial` resolves from our own code.
|
|
239
|
-
|
|
245
|
+
# A dev board's starter firmware (boards/<board>/firmware/) runs on the
|
|
246
|
+
# board under MicroPython; its imports (machine) exist only there.
|
|
247
|
+
exclude = ["src/termapy/vendor/**", "src/termapy/boards/*/firmware/**"]
|
|
240
248
|
|
|
241
249
|
[tool.ruff]
|
|
242
250
|
# 100 (not the black-default 88) buys room for inline suppression reasons
|