Milo 0.1.1

Reducer combinators, Bubbletea-inspired effects, CLI polish, and developer experience improvements.

Patch release focused on Elm Architecture ergonomics, Bubbletea-inspired effect patterns, CLI table-stakes features, and internal code health.

Highlights

  • Reducer combinatorsquit_on, with_cursor, with_confirmdecorators stack to eliminate boilerplate key/cursor/confirm handling
  • Cmd effects — LightweightCmd thunks as a simpler alternative to sagas for one-shot side effects, with Batch (concurrent) and Sequence(serial) combinators
  • TickCmd — Self-sustaining tick pattern with per-component, dynamic tick control
  • ViewState — Declarative terminal state management (alt_screen, cursor_visible, window_title, mouse_mode) with diff-based rendering
  • Message filterApp(filter=fn)intercepts actions before dispatch to drop or transform them
  • Shell completionsinstall_completions()generates bash, zsh, and fish completions from CLI definitions
  • Doctor diagnosticsrun_doctor() validates environment, dependencies, and config health with structured Checkspecs
  • Version checking — automatic PyPI upgrade notices (respectsNO_UPDATE_CHECKenv var)
  • App.from_dir() — automatic template directory discovery, no manual loader setup
  • Context.run_app() — bridge CLI command handlers to interactive Elm Architecture apps
  • Built-in template macrosselectable_list, scrollable_list, format_time in components/_defs.kida

CLI polish

  • Structured error handling withMiloErrorcode + hint display
  • Command examples render in help output andgenerate_help_all()
  • Did-you-mean fuzzy suggestions on unknown commands
  • Before/after hooks viaHookRegistry
  • Confirm gates for destructive commands
  • Dry-run and output-file global option flags
  • Progress bars viaCLIProgress
  • Context.log()with leveled stderr output
  • Config.validate()type-checks against spec defaults
  • Config.init()scaffolds starter config files
  • invoke()test helper splits stdout/stderr
  • Retrysaga effect with backoff
  • Saga/Cmd error recovery — unhandled exceptions dispatch@@SAGA_ERROR/@@CMD_ERRORinstead of being swallowed

Internal improvements

  • Extracted_command_defs.py, _cli_help.py, _jsonrpc.py, and _mcp_router.pyfrom monolithic modules
  • Unified command registration between CLI and Group via_make_command_def
  • Middleware wired intoCLI.run() and CLI.call()dispatch paths
  • Parallelized health checks and gateway discovery withThreadPoolExecutor
  • Lazywalk_commandsgenerators avoid eager materialization
  • Pre-computed property sets in workflow detection eliminate O(n²) work
  • Fixed registry N+1 file reads in doctor checks
  • Cached_list_toolsin MCP server to avoid per-request recomputation
  • Fixedexecution_order()set rebuild performance
  • Bulletproof terminal cleanup — each step inApp.run()finally block is individually guarded

Bug fixes

  • HelpRenderer now wired as default formatter inCLI.build_parser()and subparsers
  • Action group capture in help uses formatter lifecycle instead of parser attributes
  • Docstring descriptions propagate through schema to argparse help text
  • components/*.kidaincluded in package data
  • --versionrendering guards template path when no action groups are captured
  • Fixed unclosed backtick ingenerate_help_allglobal options
  • uv detection for version upgrade notices
  • Version string drift — all modules now use__version__ from __init__.py
  • ViewState merging incombine_reducers— fields from multiple reducers are merged, not overwritten
  • Message filter + Ctrl+C — filtered@@QUITno longer locks out subsequent Ctrl+C
  • CLI.call() provides a proper Context to middleware instead of None
  • Gateway child I/O enforces a 30-second read timeout to prevent deadlocks
  • Store.shutdown()waits for pending work; Batch uses a 60-second timeout
  • Failed@@SAGA_ERROR/@@CMD_ERRORdispatches are logged instead of silently swallowed
  • Before/after hook errors are caught and reported instead of crashing

New examples

  • devtool— showcases doctor diagnostics, hooks, command examples in help, structured errors, and shell completions
  • spinner — showcases Cmd, Batch, TickCmd, and ViewStatepatterns