Tree @master (Download .tar.gz)
CHANGELOG.md @master — view markup · raw · history · blame
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
This project adheres to Semantic Versioning for its CLI (Command-Line Interface), i.e. for the moulti command.
Although Moulti's Python packages, modules and functions are obviously available, they do not constitute a public API yet.
[1.34.1] - 2025-08-09
Fixed
- Fix rare "unknown action" error message.
- Fix partial line handling.
[1.34.0] - 2025-03-16
Changed
- Unless
MOULTI_NAME_THREADS=nois set, system threads get assigned meaningful names:moulti:main,network-loop,exec-command,export-to-dir,|step_name,>step_name,thread-pool.
[1.33.0] - 2025-02-26
Changed
- moulti.run is the new official documentation. It replaces
Documentation.md.
Fixed
- Running
moultiwithout any argument used to crash since v1.30.0.
[1.32.0] - 2025-02-13
Changed
moulti run:MOULTI_RUN_OUTPUT=harvestis now the default behaviour instead ofignore.
Fixed
moulti run: make output harvesting more reactive.
[1.31.0] - 2025-02-03
This release finally fixes a bug initially reported in August 2024. It took significant efforts to diagnose the root cause. Special thanks go to huyz, whose thorough cooperation made it possible to tackle this issue.
Added
- Ansible callback plugin: the
MOULTI_ANSIBLE_WRITE_MODEenvironment variable defines whether to usemoulti passormoulti step append
Fixed
- Ansible callback plugin: fix a major bug that used to block the display at arbitrary points in a playbook
[1.30.1] - 2025-01-28
Fixed
- Fix a race condition that was liable to generate (innocuous) error messages in the Moulti console after running
moulti pass: Invalid file descriptor: -1- '
is not registered' moulti pass step_id < empty_regular_fileused to block on macOS;moulti loadwas also affected.- Handle EMSGSIZE when sending file descriptors.
[1.30.0] - 2025-01-23
Changed
moulti runnow suffixes the instance name with its process id (e.g.default-1234instead ofdefault). This helps prevent clashes and makes it possible to run various tools concurrently without having to worry about such details. This behaviour can be prevented by setting theMOULTI_RUN_NO_SUFFIXenvironment variable or using the-n/--no-suffixcommand-line option. The behaviour ofmoulti initremains unchanged.moulti run,moulti diff run,moulti manpage run: it is no longer mandatory to use--to separate Moulti arguments and the command to be run.
Fixed
moulti-scoreboard.bashexample script: make scoreboard control path instance-specific.
[1.29.0] - 2025-01-12
Changed
- console: abridge message strings longer than 100 characters
Fixed
- diff, load, manpage, step delete: improve pipelining so as to prevent deadlocks
- server-side networking: use non-blocking methods to deal with non-blocking sockets
moulti run path/to/non_executable_scriptused to crash
[1.28.0] - 2024-12-29
Changed
- Moulti now requires Textual 1.0.x
- When searching text, the
[esc] Cancelkeybinding, which used to be shown in 1st position in the footer, is now shown in 3rd position Ctrl+cno longer exits Moulti: useCtrl+qinstead;qstill works- Input fields now support:
- text selection through mouse or Shift+left/right; Ctrl+Shift+left/right works too
- copy/paste through Ctrl+x/c/v
[1.27.0] - 2024-12-28
Changed
- Moulti now requires Textual 0.89.1
[1.26.0] - 2024-12-27
Changed
- Moulti now requires Textual 0.88.1
[1.25.0] - 2024-12-26
Added
MOULTI_CUSTOM_CSSusers: combined withoffset,position: absoluteenables various interesting hacks (e.g. multiple steps per row)- New example script:
moulti-scoreboard.bash
Changed
- Moulti now requires Textual 0.87.1
[1.24.0] - 2024-12-19
Changed
- Moulti now requires Textual 0.86.3
- Minor color changes: input fields, buttons, progress bar, some texts in light mode.
MOULTI_CUSTOM_CSSusers: specify& CollapsibleTitle { color: ...; }to alter the default step title color; an example is available in the documentation.
[1.23.2] - 2024-12-17
Fixed
- Fixed a double-close issue liable to affect any file descriptor inside a given Python process after a Moulti instance exited.
- Introduced snapshot testing and continuous integration.
[1.23.1] - 2024-11-17
Fixed
moulti initnow exits with a non-zero return code when it cannot listen to clients.- Ansible callback plugin: fix
unexpected keyword argument 'caplevel'warning
[1.23.0] - 2024-10-31
Changed
- Moulti now requires Textual == 0.83.0
Fixed
- Focus indicators: fix rendering issue induced by Textual 0.84.0
[1.22.0] - 2024-10-27
Changed
- Moulti now requires Textual >= 0.83.0
Fixed
moulti initused to crash with Textual >= 0.83.0:Screen.ALLOW_IN_MAXIMIZED_VIEW = '#header,SearchInputWidget,' + Screen.ALLOW_IN_MAXIMIZED_VIEW ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TypeError: can only concatenate str (not "NoneType") to str
[1.21.0] - 2024-09-29
Changed
moulti runnow setsANSIBLE_FORCE_COLOR=yeswhen Ansible is detected, thus generating colors in "PLAY RECAP" and diff (-Dcommand-line option)
Fixed
- The console is now based on Textual's
Logwidget instead ofRichLog; this prevents a bug introduced in Textual 0.80.0 that affects the console when it becomes visible for the first time.
[1.20.0] - 2024-09-22
Added
moulti difflists generated widgets if the environment variableMOULTI_DIFF_VERBOSEis setmoulti manpagelists generated widgets if the environment variableMOULTI_MANPAGE_VERBOSEis set- the environment variable
MOULTI_QUIT_POLICYdefines how Moulti should behave upon quitting - steps can now be assigned the
inactiveclass, which turns them gray
Changed
- Ansible callback plugin: steps with "skipping" and "included" lines are affected the new
inactiveclass
[1.19.0] - 2024-09-15
Added
moulti diff: delta integrationmoulti diff: display number of added (+) and removed (-) lines for each hunkdeletecommands now accept multiple ids, e.g.moulti step delete step_1 step_2 step_3- Pressing
fmaximizes the currently focused step log (similar to zoom pane in tmux)
Changed
- Moulti now requires Textual >= 0.79.0
- pipeline() now writes errors on stderr; this affects moulti
load,diffandmanpagecommands.
[1.18.1] - 2024-09-09
Fixed
moulti-manandmoulti manpageused to ignore the last section of all manpages.
[1.18.0] - 2024-09-08
Added
- Text search: it is now possible to search steps (+ the title) for a given pattern (plain or regex, case-sensitive or not).
- The search widget offers an in-memory, non-persistent history.
Changed
- The console is now shown or hidden using
zinstead ofn. - The console now grabs the focus, which makes it easier to scroll.
Fixed
- Help screen: mention
ctrl+pgupandctrl+pgdn.
[1.17.0] - 2024-08-25
Added
- the environment variable
MOULTI_ASKPASS_DEFAULT_PROMPTdefines the prompt shown bymoulti-askpassif none was passed on the command line - Ansible-specific variants of
moulti-askpass: moulti-askpass-become-passwordmoulti-askpass-connection-passwordmoulti-askpass-vault-client
Fixed
- Ansible callback plugin: override these
ansible-playbookcommand-line options to prevent it from reading passwords through the current tty: -k,-ask-pass-K,--ask-become-pass-J,--ask-vault-pass,--ask-vault-password
[1.16.0] - 2024-08-23
Added
moulti step: add options--auto-scrolland--no-auto-scrollto control inner auto-scrollingmoulti pass: significant performance improvements- the environment variable
MOULTI_TAB_SIZEcontrols the expansion of tab characters passed to steps
Fixed
- Steps with a horizontal scrollbar had an extra line above it
[1.15.0] - 2024-08-11
Added
Ctrl+t/Ctrl+yjumps to the previous/next unanswered questionO/Xcollapses/expands new steps- the environment variable
MOULTI_ENFORCE_COLLAPSIBLEdoes the same as soon as Moulti starts Ctrl+o/Ctrl+xcollapses/expands both existing and new steps- Ansible callback plugin: the environment variable
MOULTI_ANSIBLE_COLLAPSEspecifies parts that should appear collapsed
Changed
- Moulti now requires Textual >= 0.76.0
- Footer: the
Dark/Lightkeybinding now displays either "Dark" or "Light" - Footer: the
Lock scrollkeybinding now displays either "Lock scroll" or "Unlock scroll"
Fixed
moulti question add id --button value invalid_style labelnow returns an error
[1.14.0] - 2024-08-04
Added
- CLI command
moulti question {add,update,get-answer,delete} - Ansible callback plugin: support
prompt_until()and thepausemodule - quit dialog: buttons now feature keyboard accelerators
Changed
moulti pass --read-sizenow defaults to8192.moulti run: hittingCtrl+cmultiple times now navigates through the quit dialog and eventually terminates the process before exiting.
Fixed
moulti run:MOULTI_RUN_OUTPUT=harvest moulti run -- bash -c 'echo a; sleep 3600'would block upon selecting "Quit and leave the process running in the background".
[1.13.0] - 2024-07-21
Added
- help screen (
h) - Ansible callback plugin: handle
vars_promptusing inputquestion widgets.
Changed
- the quit dialog is now more keyboard-friendly
Fixed
- ensure only one instance of the quit dialog is shown at any time.
- Ansible callback plugin: do not try to pass text to a divider.
[1.12.1] - 2024-06-27
Fixed
- Ansible callback plugin: handle Ansible >= 2.17
[1.12.0] - 2024-06-23
Added
moulti-man,moulti manpage: load man pages into Moulti.
Fixed
moulti_process_lines(): preventmoulti passprocesses from piling on.
[1.11.0] - 2024-06-11
Added
- copy to clipboard: support OSC 52 and introduce the environment variable
MOULTI_CLIPBOARD_COPY.
Changed
- in some situations (e.g. SSH and terminal lacking support for OSC 52), Moulti may fail to copy data to the clipboard AND fail to detect and report that failure.
Fixed
- footer: fix key text color in light mode.
[1.10.0] - 2024-05-26
Changed
- performance: throttle calls to step.append(buffer).
Fixed
- footer: restore the usual look'n feel for Textual >= 0.63.0
[1.9.0] - 2024-05-19
Added
- bash functions:
moulti_process_lines()helps to turn arbitrary output into Moulti stepsmoulti_check_requirements()helps to ensure required commands are availablestdbuf()replaces thestdbufutility on NetBSD and OpenBSD
Changed
- bash functions:
- pip/pipx deploys
moulti-functions.bash moulti_iso_date()leverages either GNU date, Perl or Python
[1.8.1] - 2024-05-12
Fixed
- moulti no longer systematically loads the
unidiffmodule - bash functions:
- detect "python3.x" executables
- no longer depend on GNU date.
- stick to short, non-GNU mktemp command-line options
[1.8.0] - 2024-05-05
Added
- Ansible callback plugin:
ansible/moulti.py moulti runsets the adequate environment variables to enable the Ansible callback plugin.moulti diff: load diff data into Moulti.
[1.7.0] - 2024-04-28
Added
moulti-askpass, an askpass helper for Moultimoulti runautomatically setsSSH_ASKPASS,SSH_ASKPASS_REQUIREandSUDO_ASKPASSenvironment variables so as to leveragemoulti-askpass.moulti run --print-envoutputs all environment variables set bymoulti run.moulti run: the environment variableMOULTI_RUN_OUTPUTprovides better control on unexpected output.- dividers: non-collapsible steps that simply display text.
[1.6.0] - 2024-04-18
Added
moulti set --step-position=bottommoulti set --step-direction=up- Programmatic scrolling:
moulti scroll step_id offsetmoulti step add --scroll-on-actvity=-1moulti step update --scroll-on-actvity=false- "Lock scroll" action to prevent programmatic scrolling
Fixed
- The "Save" feature now exports the progress bar.
[1.5.1] - 2024-03-31
Fixed
- Fix a pipelining issue causing
moulti loadto emit a traceback.
[1.5.0] - 2024-03-18
Added
- Environment variables
MOULTI_ANSIandMOULTI_ANSI_THEME_*provide full control over ANSI color themes. tools/gogh2moulti.bashconverts Gogh themes intoMOULTI_ANSI_THEME_*variables.- Shell completion based on the argcomplete library.
- Bash functions: moulti_exec(): compute and display step duration.
- Tooltips on the Moulti header and step titles.
- Progress bar:
moulti set --progress-bar --progress-target=100 --progress=80
Changed
- By default, Moulti no longer alters ANSI colors; the previous behavior can be restored by setting
MOULTI_ANSI=textual_default. - Use non-ANSI colors in the console.
- Moulti requires textual >= 0.53.
Fixed
- Fix "next line color" heuristic for step widgets.
- Fix detection of markup errors.
- New layout for button questions: there should no longer be any hidden/unreachable button.
MOULTI_CUSTOM_CSS= moulti init/runno longer results in a traceback.
Removed
- Textual Command Palette (never advertised and offered very little).
[1.4.0] - 2024-03-03
Added
- Ability to copy step/question/console contents to clipboard, with or without colors/styles.
- Focus indicators, i.e. visual hints reflecting what part of the UI currently holds focus.
- Highlighting in the console.
Changed
- Windows: show explanatory message instead of crashing at startup.
- The key binding to toggle the console is now
ninstead ofc(which now means "Copy"). - Make it easier to scroll around answered
buttonquestionwidgets. - Revamp the console by making it a proper widget, as opposed to a refurbished step.
Fixed
- Handle Rich Markup errors and return a suitable error message to clients.
- Fix
moulti passon FreeBSD and NetBSD.
[1.3.0] - 2024-02-25
Added
- TUI action "Save" that exports step properties and logs to files.
- CLI command
moulti loadthat imports step properties and logs from files. - Environment variable
MOULTI_SAVE_PATHdefines where Moulti (TUI) saves files. - Show a modal dialog when users attempt to quit Moulti while the process launched by
moulti runis still running. This dialog allows users to terminate the process or leave it running in the background. - Environment variable
MOULTI_MODE=lightstarts Moulti with dark mode disabled. moulti runnow sets environment variableMOULTI_INSTANCE_PID.- CLI command
moulti --version - Documentation: add section "moulti run: dealing with stdin, stdout, stderr"
Changed
- Examples: improve
moulti runcommands by using--. - Update documentation.
[1.2.0] - 2024-02-18
Added
- CLI command
moulti buttonquestion {add,update,get-answer,delete} - CLI command
moulti inputquestion {add,update,get-answer,delete}
Changed
moulti(CLI) now writes error messages on stderr, not stdout.- Examples: upgrade-system.bash now showcases buttonquestion.
- Update documentation.
[1.1.0] - 2024-02-12
Added
MOULTI_INSTANCEenvironment variable.MOULTI_PASS_CONCURRENCYenvironment variable.moulti-pass-concurrency.bashexample script.
Changed
moulti waitnow sends a "ping" command.- Update documentation.
- Examples: use
MOULTI_INSTANCEinstead ofMOULTI_SOCKET_PATH.
Fixed
- Improve behavior on platforms that do not support abstract Unix sockets (e.g. MacOS).
- Improve behavior on hosts with few CPUs.
[1.0.0] - 2024-02-10
Added
- CLI command
moulti init - CLI command
moulti run - CLI command
moulti wait --verbose --delay --max-attempts - CLI command
moulti set --title - CLI command
moulti step {add,update,delete,clear,append} - CLI command
moulti pass --append --read-size moulticonsiders environment variablesMOULTI_SOCKET_PATH,MOULTI_ALLOWED_UID,MOULTI_ALLOWED_GIDandMOULTI_CUSTOM_CSSmoulti runsets environment variablesMOULTI_RUNandMOULTI_SOCKET_PATH- Documentation
- Examples