merry 2.3.0
merry: ^2.3.0 copied to clipboard
A script manager for Dart/Flutter — define script shortcuts in pubspec.yaml and run them with a single command.
2.3.0 - 2026-08-13 #
Fixed #
- Propagate fail-fast execution through referenced scripts, so a failed command in a referenced pre-hook stops its remaining commands instead of continuing
- Generate
build_runnerscripts without the removed--delete-conflicting-outputsoption inmerry init, and update the project scripts and examples to match
Internal #
- Upgrade Dart dependencies and Checkov, adapt
MerryErrorto Equatable 2.1, and regenerate Mockito mocks with the updated toolchain
2.2.0 - 2026-08-06 #
Added #
merry initwrites a starter script file for the current project and links it frompubspec.yaml. The generated scripts follow what the project declares: build targets come from the platform directories that exist,generatefrom abuild_runnerdependency, and a Flutter plugin'sdevscript runs itsexample/app. A project configured with inline scripts is left untouched, and an existing script file is replaced only after confirmation. The write target is constrained the way reading already constrains it — a path escaping the project, a symlink resolving out of it, a hard link to the manifest, orpubspec.yamlitself is refused before anything is written, and thepubspec.yamllink is appended (or inserted before a...document terminator) so comments and blank lines stay where their author put them
2.1.4 - 2026-07-30 #
Fixed #
- Run
merry upgradethrough the Dart SDK that launched the process instead of a shell command; the self-upgrade previously failed outright withCould not find package `pub`and resolveddartfromPATH - Report the running version from
merry --version, which had been stuck at 2.1.2 since the 2.1.3 release - Reject a circular
$scriptreference with an error naming the cycle, instead of looping until the process is killed - Constrain an external
scripts:file to the project directory. A value that escapes it — an absolute path such asscripts: /etc/hosts, or a symlink pointing outside — is now refused. In-project filenames likescripts: merry.yamlare unaffected, but a deliberatescripts: ../shared/merry.yamlno longer resolves
Internal #
- Run the test suite on pull requests and pushes to main; it previously ran only on a release tag, so a regression could reach main and surface at publish time
- Pin every workflow checkout to a commit SHA and stop it persisting a repository credential, with a test sweeping all workflows for both
- Upgrade trunk linters, and enable clippy, shellcheck and shfmt
2.1.3 - 2026-07-25 #
Fixed #
- Refuse to run a script when a substituted positional argument or
(variables)value contains shell-active characters, closing quote-context command injection - Reject cyclic YAML map aliases used as mapping keys instead of overflowing the stack and crashing commands such as
merry ls - Abort a script when its pre-hook fails, including list-valued pre-hooks whose later commands previously masked the failure
- Reject unknown
(execution)values instead of silently degrading tomultiple, restoring once-mode fail-fast execution, and expose the execution mode inmerry ls --output=json - Stop the remaining script list after Ctrl+C (SIGINT), and propagate a post-hook's SIGINT instead of reporting success
Internal #
- Harden the native blob workflow (pin rust-toolchain to stable alongside the SHA pin)
- Isolate pub publish credentials in the publishing workflow
2.1.2 - 2026-07-24 #
Fixed #
- Reject invalid CLI options and unexpected arguments with usage errors instead of crashing, including when the script configuration is empty
- Preserve quoting and argument boundaries for positional arguments and referenced scripts, including backslash escapes
- Keep interactive scripts attached to the terminal and reliably terminate their entire process group on Ctrl+C
- Preserve runnable command groups and surrounding metadata when listing or resolving platform-specific and default scripts
- Treat configured POSIX working directories as literal shell data so command substitutions are not evaluated
Internal #
- Bind checked-in native blobs to all tracked Cargo inputs, including symlinks, executable modes, workspace members, and repository Cargo configuration
- Restrict the OIDC publishing workflow to strict
vMAJOR.MINOR.PATCHtags
2.1.1 - 2026-04-25 #
Fixed #
- Processes terminated by a signal now report the conventional
128 + signal_numberexit code on Unix (e.g. 130 for Ctrl+C / SIGINT) instead of always returning 1 - Script definitions with a non-string, non-list
(scripts)value now throw a descriptiveArgumentErrorinstead of a cryptic runtime cast failure
Internal #
- FFI: close Ctrl+C race window between
SharedChild::spawnandCURRENT_CHILDstorage; add named return-code constants; swap four#[cfg]blocks for a single tuple expression; replace silent mutex-poison swallow withexpect() - Dart: parameterize
CommandRunnerand allCommandsubclasses as<int>; make everyrun()returnFuture<int>; add explicit type arguments throughout to satisfystrict-raw-typesandstrict-inferenceanalyzer options - Remove unused
consoleandcollectiondependencies - Remove Flutter-only lint rules from
analysis_options.yaml - Integrate Trunk.io for linting and formatting
- Upgrade Cargo dependencies and update precompiled native blobs
2.1.0 - 2026-04-25 #
Added #
merry ls --output=json— Machine-readable JSON output listing all scripts withname,commands,description,workdir,hooks, andhook_forfields; use--output=tree(default) for the existing human-readable tree
Changed #
- JSON output is indented with 2 spaces for readability
- FFI native library is now loaded once per process, reducing per-call overhead
Fixed #
run_scriptnow handles a null pointer and invalid UTF-8 gracefully instead of panicking, making script execution more resilientgetPaths()correctly includes a group key when all its sub-keys are metadata entries (e.g. a map containing only(description))
Internal #
- CI: migrate blob build runners away from retired GitHub-hosted images
- CI: add required workflow permissions
- Refactor
PubspecandScriptsRegistryto use instance fields instead of static state, improving isolation and testability - Refactor test suite to remove shared static state between test cases
- Free native UTF-8 buffer after FFI call to prevent memory leak
2.0.0 #
Merry is a maintained fork of derry by Frenco, which has been unmaintained since February 2023. All original functionality is preserved and the script definition format is fully compatible — only the CLI command name changes.
Breaking changes #
- Package renamed from
derrytomerry; CLI command is nowmerry - Minimum Dart SDK raised to
>=3.10.4 - Scripts definition file is now named
merry.yamlby convention (any filename is still accepted)
Bug fixes #
- Fix missing
awaitbefore main script execution, which caused post-hooks to run concurrently with the main script instead of after it - Fix Ctrl+C propagation: signals now reliably kill the child process across
multiple script executions; previously
ctrlc::set_handlerwas called once per script invocation, causing a panic on the second call - Fix CI blob build workflow:
ubuntu-20.04andmacos-13runners are retired; WindowsCOPYfailed with a file-lock error when the Dart runtime had the existing DLL open
New features #
-
(default)— Define a default script for a command group, executed when the group name is used without a sub-commandbuild: (default): flutter build apk web: flutter build web -
Positional arguments (
$1,$2, …) — Inject individual command-line arguments into a script by positiongreet: echo Hello $1 # merry greet World → echo Hello World -
(workdir)— Run a script in a specific working directorynative: (workdir): packages/native (scripts): cargo build --release -
Platform-specific scripts (
(linux),(macos),(windows)) — Select the right script automatically based on the current OS; falls back to(scripts)if no platform key matchesopen: (linux): xdg-open . (macos): open . (windows): explorer . -
(aliases)— Define short aliases for frequently-used commandsinstall: (aliases): [i, in] (scripts): dart pub get # merry i → merry install -
(variables)/${VAR}— Define reusable variables scoped to the scripts map; environment variables are used as a fallback for unknown names(variables): OUTPUT: build/release bundle: flutter build apk --output ${OUTPUT} -
merry ls --output=json— Machine-readable JSON output for tooling integration (e.g. VS Code extensions); use--output=tree(default) for the existing human-readable treemerry ls --output=json # {"name":"my_app","version":"1.0.0","scripts":[{"path":"build","commands":[...]},...]}
Migrating from derry #
- Deactivate derry and install merry:
dart pub global deactivate derry dart pub global activate merry - Replace all
derryinvocations withmerryin scripts, CI pipelines, and documentation - Optionally rename
derry.yaml→merry.yamland update thescripts:value inpubspec.yaml— existing filenames continue to work unchanged - No changes to script definitions are required
1.5.0 #
- Add support for M1 Macs
- Blob sizes are now much smaller
- Opted-in to sound null-safety
- Rewrite most of the existing codes to be more concise and clearer, and also more performant by reducing io reads as much as possible and by caching a lot
- Use meaningful error codes with better error messages
- Rename
subcommandstoreferences - Remove "execution type" which is useless and confusing
- Publishing is now done via GitHub Actions
1.4.3 #
- Bump version to correct
derry --version
1.4.2 #
- Fix a bug by correctly passing extra arguments to parsed subcommands
1.4.1 #
- Add description option usage to README documentation
1.4.0 #
- Add description option which can now be used by
derry ls -dcommand
1.3.0 #
- Update dependencies
- Refactor code with organized imports and typedefs according to new formatter rules
1.2.1 #
- Normalize absolute paths for
derry sourcecommand - Format old changelogs
1.2.0 #
- Enforce stricter linter rules and refactor according to it
- Support
pre&postscripts - Move native code into a separate directory
1.1.1 #
- Format according to
dartfmtto get better pub score
1.1.0 #
- Scripts now return exit codes
- Remove
--slientor-soption fromruncommand - Change info lines' styles
- Reduce exported API elements to only commands and version
1.0.5 #
- Update pub package description
1.0.4 #
- Refactor to not expose all APIs but only important ones so most library APIs will not be available
- Add more documentation comments
1.0.3 #
- Format error types in error messages to be uppercase
1.0.2 #
- Rename
derry updatecommand toderry upgrade - Fix type casting error on extra arguments
1.0.1 #
- Format changelogs according to pub.dev
1.0.0 #
- Today I learned how versioning system actually works
0.1.4 #
- Derry now uses
lintinstead ofpedanticas code linter & analyzer - Code base is now formatted according to the
lint's rules - Use
stdoutandstderrinstead ofprint
0.1.3 #
- Add support for nested subcommands like
$generate:envto run asderry generate env - Add support for
derry updatecommand - Sort output of
derry lstree - Remove alias list
0.1.2 #
- Now
runscripts can be used without using therunkeyword. For example,derry testcan be used instead ofderry run testwithout explicit implementations, for all scripts - Remove the old
buildandtestalias implementations - The derry commands no longer print the current directory on the script execution
0.1.1+1 #
- Update the pub link in README.md from
httptohttpsto get better pub score
0.1.1 #
- Refactor ffi directory to bindings directory
- Refactor usage lines to be all lowercase and with no period
- Adde
derry --versionoption
0.1.0 #
- Add support for
derry sourcecommand
0.0.9 #
- Add support for using subcommands with options/arguments/parameters
0.0.8+1 #
- Fix #20
MultipleHandlersError caused by #12 fix
0.0.8 #
- Fix #12 Ctrl-C Error
- Add
-sas abbrreviation for--silent
0.0.7+1 #
- Fix #14 error on not being able to use options caused by previous changes
0.0.7 #
- Add support for nested scripts
- Modify
Did you mean this?check andlscommands to work well with nested scripts - Breaking changes on
Advanced ConfigurationAPI for compatibility with nested scripts
0.0.6 #
- Add
Did you mean this?check by usingstring-similaritypackage - Fix null infoLine error
- Fix command not found unhandled exceptions
0.0.5 #
- Add
derry lscommand - Updat documentation
0.0.4 #
- Add support for
testandbuildaliases - Better and consistent error messages with an API
0.0.3+1 #
- Modify README to work correctly on pub.dev
0.0.3 #
- Add support for
--silent - Refactor Rust source code
- Start using derry for build
- Modify documentation
0.0.2 #
- Add support for subcommands
0.0.1 #
- Initial version, scaffolded by Stagehand
- Add support for list definitions
- Add support for configurable execution type
- Add support for win64, linux64, and (mac64)
- Add tests for helpers