From 61885eb801e3baf42e3035d2ba2caf0005ec25e1 Mon Sep 17 00:00:00 2001 From: Lawrence Lane Date: Fri, 10 Apr 2026 16:34:51 -0400 Subject: [PATCH 1/4] Prep 0.2.1 patch release: bump version, compile changelog, add release notes Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 6 ++++++ changelog.d/+group-help-fix.fixed.md | 1 - pyproject.toml | 2 +- site/content/releases/0.2.1.md | 17 +++++++++++++++++ src/milo/__init__.py | 2 +- uv.lock | 2 +- 6 files changed, 26 insertions(+), 4 deletions(-) delete mode 100644 changelog.d/+group-help-fix.fixed.md create mode 100644 site/content/releases/0.2.1.md diff --git a/CHANGELOG.md b/CHANGELOG.md index ada10f9..c671683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to Milo are documented here. +## 0.2.1 — 2026-04-10 + +### Fixed + +- Fixed group bare invocation showing "Unknown command" instead of group help, and help output now lists subcommands by name instead of raw argparse internals. + ## 0.2.0 — 2026-04-10 ### Added diff --git a/changelog.d/+group-help-fix.fixed.md b/changelog.d/+group-help-fix.fixed.md deleted file mode 100644 index ddc90e4..0000000 --- a/changelog.d/+group-help-fix.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Fixed group bare invocation showing "Unknown command" instead of group help, and help output now lists subcommands by name instead of raw argparse internals. diff --git a/pyproject.toml b/pyproject.toml index 4e5b8d6..56f0bee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "milo-cli" -version = "0.2.0" +version = "0.2.1" description = "Template-driven CLI applications for free-threaded Python" readme = "README.md" requires-python = ">=3.14" diff --git a/site/content/releases/0.2.1.md b/site/content/releases/0.2.1.md new file mode 100644 index 0000000..ce8899b --- /dev/null +++ b/site/content/releases/0.2.1.md @@ -0,0 +1,17 @@ +--- +title: Milo 0.2.1 +description: Fix group help display and subcommand listing. +type: changelog +date: 2026-04-10 +draft: false +lang: en +tags: [release, changelog] +keywords: [release, 0.2.1] +category: changelog +--- + +Patch release fixing group command help display. + +## Fixed + +- **Group help display** — Bare invocation of a command group now correctly shows group help instead of "Unknown command". Help output lists subcommands by name instead of raw argparse internals. diff --git a/src/milo/__init__.py b/src/milo/__init__.py index 56765bd..af5233e 100644 --- a/src/milo/__init__.py +++ b/src/milo/__init__.py @@ -154,7 +154,7 @@ def _Py_mod_gil() -> int: # noqa: N802 return 0 -__version__ = "0.2.0" +__version__ = "0.2.1" __all__ = [ "BUILTIN_ACTIONS", "CLI", diff --git a/uv.lock b/uv.lock index 205f744..a2ef2cd 100644 --- a/uv.lock +++ b/uv.lock @@ -478,7 +478,7 @@ wheels = [ [[package]] name = "milo-cli" -version = "0.2.0" +version = "0.2.1" source = { editable = "." } dependencies = [ { name = "kida-templates" }, From 0da554a44e650debbf7afffdfac0f919b1aa8a9d Mon Sep 17 00:00:00 2001 From: Lawrence Lane Date: Fri, 10 Apr 2026 16:40:30 -0400 Subject: [PATCH 2/4] Add changelog fragment to satisfy CI for release PR Co-Authored-By: Claude Opus 4.6 --- changelog.d/+release-0.2.1.changed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/+release-0.2.1.changed.md diff --git a/changelog.d/+release-0.2.1.changed.md b/changelog.d/+release-0.2.1.changed.md new file mode 100644 index 0000000..b7db473 --- /dev/null +++ b/changelog.d/+release-0.2.1.changed.md @@ -0,0 +1 @@ +Version bump to 0.2.1. From d96128c2ec67df1976da068f25a7779631203730 Mon Sep 17 00:00:00 2001 From: Lawrence Lane Date: Fri, 10 Apr 2026 16:41:42 -0400 Subject: [PATCH 3/4] Align towncrier title_format with established changelog heading style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses PR feedback: the towncrier config produced headers like "## [0.2.1] - 2026-04-10" but all existing entries use "## 0.2.1 — 2026-04-10". Updated title_format to match. Co-Authored-By: Claude Opus 4.6 --- changelog.d/+release-0.2.1.changed.md | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/changelog.d/+release-0.2.1.changed.md b/changelog.d/+release-0.2.1.changed.md index b7db473..81c292a 100644 --- a/changelog.d/+release-0.2.1.changed.md +++ b/changelog.d/+release-0.2.1.changed.md @@ -1 +1 @@ -Version bump to 0.2.1. +Towncrier `title_format` updated to match established changelog heading style (`## version — date`). diff --git a/pyproject.toml b/pyproject.toml index 56f0bee..6c26f1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -136,7 +136,7 @@ directory = "changelog.d" filename = "CHANGELOG.md" package = "milo" package_dir = "src" -title_format = "## [{version}] - {project_date}" +title_format = "## {version} — {project_date}" issue_format = "[#{issue}](https://github.com/lbliii/milo-cli/issues/{issue})" underlines = ["", "", ""] From 580b15048fc25e18f34b2d1b44eaf12d682a0040 Mon Sep 17 00:00:00 2001 From: Lawrence Lane Date: Fri, 10 Apr 2026 16:49:59 -0400 Subject: [PATCH 4/4] Increase debounce retrigger test timeouts for CI reliability The test_debounce_retrigger_resets_timer test was flaky on macOS CI due to tight timing margins. Increased debounce delay from 0.15s to 0.2s, inner delay from 0.3s to 0.5s, and outer sleep from 0.6s to 1.0s to accommodate thread scheduling variance. Co-Authored-By: Claude Opus 4.6 --- tests/test_effects.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_effects.py b/tests/test_effects.py index bdd404a..8c2cfb7 100644 --- a/tests/test_effects.py +++ b/tests/test_effects.py @@ -992,14 +992,14 @@ def inner_saga(): yield Put(Action("DEBOUNCED_FIRE")) def parent(): - # First debounce — 0.15s - yield Debounce(seconds=0.15, saga=inner_saga) + # First debounce — 0.2s + yield Debounce(seconds=0.2, saga=inner_saga) # Wait a bit, then retrigger before first fires yield Delay(seconds=0.05) # Second debounce — resets the timer - yield Debounce(seconds=0.15, saga=inner_saga) + yield Debounce(seconds=0.2, saga=inner_saga) # Wait long enough for second to fire - yield Delay(seconds=0.3) + yield Delay(seconds=0.5) def reducer(state, action): actions.append(action.type) @@ -1007,7 +1007,7 @@ def reducer(state, action): store = Store(reducer, None) store.run_saga(parent()) - time.sleep(0.6) + time.sleep(1.0) store._executor.shutdown(wait=True) # Should fire exactly once (first timer cancelled, second fires)