Skip to content

v2026.5.24

Choose a tag to compare

@github-actions github-actions released this 24 May 11:50
· 361 commits to main since this release

@unbrained/pm-cli 2026.5.24

Source range: v2026.5.23...v2026.5.24

Changelog

Added

  • Contract tests now assert that the pm-changelog install, generate, and stage steps remain in run-release-pipeline.mjs, and that the Verify generated pm changelog step (pnpm changelog:pm:check) remains in release.yml, preventing silent regression if the integration is removed.
  • pm schema add-type <Name> registers a config-driven custom item type into .agents/pm/schema/types.json (shape { "definitions": [...] }) so agents can use pm create <Name> "..." for project-specific work categories without hand-editing settings (pm-e1va). Flags: --description, --default-status, --folder, repeatable --alias, plus --author/--force governance and --json. The command is an idempotent UPSERT keyed on the type name (case-insensitive, merges aliases, overrides supplied fields), refuses to redefine built-in types (Chore, Decision, Epic, Event, Feature, Issue, Meeting, Milestone, Plan, Reminder, Task), rejects aliases (or a new type name) that would collide with a built-in or another registered type so pm create --type never resolves ambiguously, and emits a machine envelope reporting the registered type and the file path.
  • pm create and pm update now accept named priority aliases (critical, high, medium, low, minimal) in addition to numeric 0..4, with one shared validation message for bad values (pm-fuat / pm-5k2w).
  • Unknown package-owned commands such as pm guide, pm templates, pm calendar, and pm cal now include concrete first-party install hints instead of only reporting an unknown command (pm-fuat / pm-5k2w).
  • The templates package now ships starter templates (bug, feature, spike, chore) so pm templates has a useful catalog immediately after installation; user-saved templates still override builtins by name (pm-fuat / pm-ypqp).
  • pm delete --dry-run previews the item file that would be deleted without mutating item storage or history, giving the single-item destructive path the same preview affordance as broader maintenance commands (pm-tobi / pm-5k2w).

Changed

  • Extract shared scanHistoryDrift core function to src/core/history/drift-scan.ts; health and validate commands compose format-specific outputs from the single scan (pm-qsk8)
  • Extract createLazyModule helper to src/core/shared/lazy-module.ts; replace nullable-promise-cache boilerplate in 5 CLI registration files (pm-c98b)
  • Replace 70-line inline copy of FRONT_MATTER_KEY_ORDER in shared-constants-errors.spec.ts with structural sentinel-ordering and uniqueness assertions that catch real contract changes without needing a manual update (pm-8fx3)
  • Extract shared resolveAuthor mutation-author helper to src/core/shared/author.ts; eliminate 10+ identical copies across command files (pm-xh0y)
  • Extract shared isPathWithinDirectory path-containment helper to src/core/fs/path-utils.ts; deduplicate across manifest, loader, extension, files, and search modules (pm-dpzc)
  • Update npm devDependencies to latest minor/patch: @sentry/cli 3.4.3, @toon-format/toon 2.3.0, @types/node 25.9.1, @vitest/coverage-v8 4.1.7, tsx 4.22.3, vitest 4.1.7 (pm-a2g6)
  • The invalid-type error from pm create/pm update now appends a discoverable hint pointing agents at the new registration command: To register a custom type, run: pm schema add-type "X" (writes .agents/pm/schema/types.json). (pm-e1va).
  • Daily release automation now fails loudly when source, package, script, or workflow changes exist since the last tag but CHANGELOG.md has an empty [Unreleased] section. The JSON result includes changelog_required_files and a deterministic release_changelog_required:source_or_package_changes_without_unreleased_entry warning so agents can fix the release blocker without reading the full workflow log.
  • pm init now prints a concise default summary while preserving the full settings tree behind --verbose; --json output is unchanged for machine consumers (pm-fuat / pm-5k2w).
  • Rendered text help now hides pure snake_case duplicates of kebab-case long flags while keeping those aliases parse-functional and present in machine-readable contracts/completions (pm-fuat / pm-5k2w).
  • pm gc help now states that cache artifacts are deleted by default unless --dry-run is passed; the runtime default is unchanged for compatibility (pm-tobi / pm-5k2w).
  • Extract shared isTerminalStatus/normalizeStatusForRegistry helpers to src/core/item/status.ts; deduplicate runtime terminal-status checks across the list, search, context, close, and dedupe-audit commands while preserving registry-aware normalization with raw-value fallback (pm-i04b).
  • Extract shared recurrence weekdayOrderIndex helper to src/types.ts; deduplicate four identical copies across item serialization, create/update parsing, and calendar expansion (pm-max1).
  • Extract shared item-type definition normalizer to src/core/item/item-type-definition.ts; single-source name/folder/alias/required-field/option/command-option-policy normalization and dedupe-sort semantics across the runtime registry and settings persistence, with the only layer-specific divergence (strict vs pass-through policy-command resolution) injected via an adapter (pm-v798).

Fixed

  • Recover 16 unreadable item files caused by an upstream @toon-format/toon 2.3.0 round-trip bug: its strict decoder mis-parses a quoted scalar value containing a bracketed token immediately followed by a colon (e.g. [Unreleased]:, [med]:) as a key+bracket+colon array header and throws Invalid array length, even though the library's own encoder emits that form. parseToonItemDocument now decodes via src/core/item/toon-decode.ts, which tries strict first and, only after failure, retries strict decoding with scalar-value brackets escaped so duplicate-key, array-length, and other strict protections remain enforced. Affected items load again across pm get/list/search with no item_list_item_read_failed warnings (pm-iqgj).

PM Tracker Evidence

Updated pm items in release window: 48
By type: Chore=27, Feature=4, Task=1, Plan=4, Issue=11, Decision=1
By status: in_progress=1, open=8, closed=39

Selected release-related tracker items:

  • pm-jpfc [Chore/in_progress] Release @unbrained/pm-cli 2026.5.24
  • pm-7811 [Task/closed] Install and validate pm-changelog package
  • pm-bu50 [Issue/closed] pm-changelog extension fails on large tracker JSON
  • pm-ot8r [Issue/closed] Auto daily release silently skips releasable commits when CHANGELOG [Unreleased] is empty