v2026.5.24
·
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-changeloginstall, generate, and stage steps remain inrun-release-pipeline.mjs, and that theVerify generated pm changelogstep (pnpm changelog:pm:check) remains inrelease.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 usepm create <Name> "..."for project-specific work categories without hand-editing settings (pm-e1va). Flags:--description,--default-status,--folder, repeatable--alias, plus--author/--forcegovernance 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 sopm create --typenever resolves ambiguously, and emits a machine envelope reporting the registered type and the file path.pm createandpm updatenow accept named priority aliases (critical,high,medium,low,minimal) in addition to numeric0..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, andpm calnow 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) sopm templateshas a useful catalog immediately after installation; user-saved templates still override builtins by name (pm-fuat / pm-ypqp). pm delete --dry-runpreviews 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
scanHistoryDriftcore function tosrc/core/history/drift-scan.ts; health and validate commands compose format-specific outputs from the single scan (pm-qsk8) - Extract
createLazyModulehelper tosrc/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_ORDERinshared-constants-errors.spec.tswith structural sentinel-ordering and uniqueness assertions that catch real contract changes without needing a manual update (pm-8fx3) - Extract shared
resolveAuthormutation-author helper tosrc/core/shared/author.ts; eliminate 10+ identical copies across command files (pm-xh0y) - Extract shared
isPathWithinDirectorypath-containment helper tosrc/core/fs/path-utils.ts; deduplicate across manifest, loader, extension, files, and search modules (pm-dpzc) - Update npm devDependencies to latest minor/patch:
@sentry/cli3.4.3,@toon-format/toon2.3.0,@types/node25.9.1,@vitest/coverage-v84.1.7,tsx4.22.3,vitest4.1.7 (pm-a2g6) - The invalid-type error from
pm create/pm updatenow 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.mdhas an empty[Unreleased]section. The JSON result includeschangelog_required_filesand a deterministicrelease_changelog_required:source_or_package_changes_without_unreleased_entrywarning so agents can fix the release blocker without reading the full workflow log. pm initnow prints a concise default summary while preserving the full settings tree behind--verbose;--jsonoutput 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 gchelp now states that cache artifacts are deleted by default unless--dry-runis passed; the runtime default is unchanged for compatibility (pm-tobi / pm-5k2w).- Extract shared
isTerminalStatus/normalizeStatusForRegistryhelpers tosrc/core/item/status.ts; deduplicate runtime terminal-status checks across thelist,search,context,close, anddedupe-auditcommands while preserving registry-aware normalization with raw-value fallback (pm-i04b). - Extract shared recurrence
weekdayOrderIndexhelper tosrc/types.ts; deduplicate four identical copies across item serialization,create/updateparsing, 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/toon2.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 akey+bracket+colon array header and throwsInvalid array length, even though the library's own encoder emits that form.parseToonItemDocumentnow decodes viasrc/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 acrosspm get/list/searchwith noitem_list_item_read_failedwarnings (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