@unbrained/pm-cli 2026.10.30 → 2026.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +41 -0
- package/README.md +1 -1
- package/dist/cli/commander-usage.js +2 -2
- package/dist/cli/error-guidance.d.ts +45 -5
- package/dist/cli/error-guidance.js +5 -3
- package/dist/cli/extension-command-help.d.ts +1 -0
- package/dist/cli/extension-command-help.js +2 -2
- package/dist/cli/main.d.ts +1 -5
- package/dist/cli/main.js +5 -5
- package/dist/cli/migration-gates.d.ts +1 -1
- package/dist/cli/migration-gates.js +1 -1
- package/dist/cli/preflight-warnings.d.ts +11 -0
- package/dist/cli/preflight-warnings.js +4 -0
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-operations.d.ts +3 -3
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/chunk-2GK2IVU5.js +8 -0
- package/dist/cli-bundle/chunks/chunk-5KW4WUAK.js +6 -0
- package/dist/cli-bundle/chunks/chunk-5WVE7XBS.js +114 -0
- package/dist/cli-bundle/chunks/chunk-6PKWKVS6.js +8 -0
- package/dist/cli-bundle/chunks/chunk-E74BORFX.js +128 -0
- package/dist/cli-bundle/chunks/chunk-F3ECOBKA.js +2 -0
- package/dist/cli-bundle/chunks/chunk-ICT6E4IW.js +2 -0
- package/dist/cli-bundle/chunks/chunk-MP2DQJH2.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-LWW4F4G2.js → chunk-MRUA2Z43.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UUQX3PFD.js → chunk-MTRIGD7M.js} +76 -76
- package/dist/cli-bundle/chunks/{chunk-S2U7ECUJ.js → chunk-N45IXPCA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-MVL27TAH.js → chunk-NILQ2ZMV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-GRABKNFL.js → chunk-O56O7NIE.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-O6TFUV6M.js +31 -0
- package/dist/cli-bundle/chunks/{chunk-TH5KPAN4.js → chunk-SBVX5CMV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-Y6NC3X3E.js → chunk-TMPO4CTZ.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-TYERATXH.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-EHBGHX55.js → chunk-UEEG47TU.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-UUN3WNMQ.js +20 -0
- package/dist/cli-bundle/chunks/chunk-WFBYKDB2.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-RZQNFHXO.js → chunk-WX25MU4N.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-4BQD5SW2.js → chunk-Y7CKVU56.js} +30 -30
- package/dist/cli-bundle/chunks/{indexed-receipt-blobs-LHLE7PSG.js → indexed-receipt-blobs-KGMJVFH2.js} +2 -2
- package/dist/cli-bundle/chunks/item-transaction-Q5S5YLEJ.js +2 -0
- package/dist/cli-bundle/chunks/{mutation-admission-TRGAVS7N.js → mutation-admission-BOOCJPCU.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-BH4F6M7Z.js → register-list-query-23OX36Q3.js} +3 -3
- package/dist/cli-bundle/chunks/register-mutation-JPJ5YNDX.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-IGR7ERY5.js +2 -0
- package/dist/cli-bundle/chunks/{register-setup-QPWSVHFZ.js → register-setup-BMIFKZZP.js} +2 -2
- package/dist/cli-bundle/chunks/{settlement-hook-MN3Y7LVX.js → settlement-hook-YWSWFOZY.js} +2 -2
- package/dist/cli-bundle/chunks/{stage-RTB6RAAO.js → stage-ON7CYYPM.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-POJPJX64.js → chunk-2Y77HWIX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SAT7IAEB.js → chunk-3NYWMUX3.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-3Z53POXU.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-5TWS5KOM.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-5WCQFH6D.js +12 -0
- package/dist/cli-bundle/focused-chunks/{chunk-S23ZUASN.js → chunk-6GMYW42K.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-YQUZL2CK.js → chunk-6OKPYCLU.js} +5 -5
- package/dist/cli-bundle/focused-chunks/chunk-7WJDRZOR.js +22 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3SRX77ES.js → chunk-AL7SOFUL.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-CIQ6YWCW.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RKPUQDWF.js → chunk-DFUTCKUF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-RYEZSZJ7.js → chunk-GE755ODZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-JCR32IAO.js +91 -0
- package/dist/cli-bundle/focused-chunks/{chunk-BPE6JTKL.js → chunk-JLXGRDTG.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-LVA76N27.js +6 -0
- package/dist/cli-bundle/focused-chunks/{chunk-YU7QOYYV.js → chunk-M22TI7LP.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-PAT6QF63.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-VFWCSQAG.js → chunk-RPUDOJVB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-SXZM4PSS.js +44 -0
- package/dist/cli-bundle/focused-chunks/chunk-UQIBGLDR.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RGQEJFXO.js → chunk-VFQAZLKO.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-BCIUAEWX.js → chunk-VS2ZFPXD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-FRFNGMAK.js → chunk-WX2RVS2Y.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-Z7GIVH6B.js +3 -0
- package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-VK2363JB.js → indexed-receipt-blobs-KHWT44EK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/item-transaction-7VLPA2SU.js +2 -0
- package/dist/cli-bundle/focused-chunks/{mutation-admission-7VUODEPJ.js → mutation-admission-2DH27R5Y.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{settlement-hook-OK6A7PG2.js → settlement-hook-SJV52ZTV.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{stage-S5RP5SZH.js → stage-FYOBWQA7.js} +2 -2
- package/dist/cli-bundle/main.js +26 -22
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +4 -4
- package/dist/cli-bundle/sdk-core.js +1 -1
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +57 -57
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +11 -11
- package/dist/core/config/nested-settings.js +1 -1
- package/dist/core/extensions/extension-hook-runtime.js +1 -1
- package/dist/core/extensions/extension-types.d.ts +4 -0
- package/dist/core/extensions/extension-types.js +1 -1
- package/dist/core/extensions/loader.js +1 -1
- package/dist/core/lock/lock.js +4 -4
- package/dist/core/output/mutation-projection.js +1 -1
- package/dist/core/output/output.js +3 -3
- package/dist/core/schema/fields-file.js +1 -1
- package/dist/core/sentry/helpers.d.ts +6 -0
- package/dist/core/sentry/helpers.js +1 -1
- package/dist/core/sentry/instrument.d.ts +1 -1
- package/dist/core/sentry/instrument.js +1 -1
- package/dist/core/shared/constants.js +1 -1
- package/dist/core/shared/errors.d.ts +6 -0
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/shared/output-unicode.d.ts +10 -0
- package/dist/core/shared/output-unicode.js +2 -0
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +1 -1
- package/dist/core/store/settings.js +1 -1
- package/dist/core/telemetry/policy.d.ts +8 -0
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/runtime.js +3 -3
- package/dist/sdk/agent/command-recovery.d.ts +15 -0
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/cli-bootstrap.js +1 -1
- package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +28 -0
- package/dist/sdk/cli-contracts/agent-output-contracts.js +2 -2
- package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.d.ts +2 -0
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +1 -1
- package/dist/sdk/completion/fish.js +4 -4
- package/dist/sdk/completion/zsh.js +3 -3
- package/dist/sdk/config.d.ts +1 -0
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/context-intent-contracts.d.ts +17 -0
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/core.d.ts +2 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/error-runtime.d.ts +9 -0
- package/dist/sdk/error-runtime.js +1 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/index.d.ts +3 -3
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/init-agent-guidance.js +2 -2
- package/dist/sdk/lifecycle/claim.d.ts +27 -0
- package/dist/sdk/lifecycle/claim.js +1 -1
- package/dist/sdk/lifecycle/close.js +1 -1
- package/dist/sdk/lifecycle/create.js +1 -1
- package/dist/sdk/lifecycle/mcp-actions.d.ts +1 -1
- package/dist/sdk/lifecycle/mcp-actions.js +1 -1
- package/dist/sdk/lifecycle/plan.d.ts +2 -3
- package/dist/sdk/lifecycle/plan.js +1 -1
- package/dist/sdk/lifecycle/repeated-terminal-state.d.ts +45 -0
- package/dist/sdk/lifecycle/repeated-terminal-state.js +2 -0
- package/dist/sdk/lifecycle/shared-unset-fields.d.ts +9 -0
- package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
- package/dist/sdk/lifecycle/task-composition.js +1 -1
- package/dist/sdk/lifecycle/update-many.d.ts +0 -1
- package/dist/sdk/lifecycle/update-many.js +1 -1
- package/dist/sdk/lifecycle/update.d.ts +29 -1
- package/dist/sdk/lifecycle/update.js +2 -2
- package/dist/sdk/output/list-envelope.d.ts +8 -0
- package/dist/sdk/output/list-envelope.js +1 -1
- package/dist/sdk/output/table-rows.d.ts +7 -1
- package/dist/sdk/output/table-rows.js +1 -1
- package/dist/sdk/output.d.ts +2 -1
- package/dist/sdk/output.js +2 -2
- package/dist/sdk/ownership-source.d.ts +18 -0
- package/dist/sdk/ownership-source.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/context.js +2 -2
- package/dist/sdk/query/get.d.ts +1 -1
- package/dist/sdk/query/get.js +1 -1
- package/dist/sdk/query/next-ranking-policy.d.ts +35 -0
- package/dist/sdk/query/next-ranking-policy.js +2 -0
- package/dist/sdk/query/next.d.ts +12 -2
- package/dist/sdk/query/next.js +2 -2
- package/dist/sdk/query/projection-contracts.d.ts +4 -0
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/read-output/surfaces.d.ts +27 -0
- package/dist/sdk/read-output/surfaces.js +2 -0
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/runtime/actions.js +1 -1
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.d.ts +1 -0
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime-public-contracts.d.ts +2 -0
- package/dist/sdk/runtime.d.ts +2 -2
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/start-task-status.d.ts +1 -1
- package/dist/sdk/start-task-status.js +1 -1
- package/dist/sdk/test/execution-receipts.d.ts +25 -0
- package/dist/sdk/test/execution-receipts.js +2 -2
- package/dist/sdk/test/execution.d.ts +5 -0
- package/dist/sdk/test/execution.js +2 -2
- package/dist/types.d.ts +2 -0
- package/dist/types.js +1 -1
- package/docs/AGENT_GUIDE.md +4 -4
- package/docs/AGENT_OUTPUT_ENCODINGS.md +12 -0
- package/docs/AGENT_UX_CONTRACTS.md +2 -1
- package/docs/COMMANDS.md +59 -5
- package/docs/COMMAND_NAMESPACES.md +1 -1
- package/docs/CONFIGURATION.md +48 -1
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +26 -0
- package/docs/LIFECYCLE_COMMANDS.md +19 -4
- package/docs/PACKED_FIRST_RUN.md +2 -1
- package/docs/READ_OUTPUT_CONTRACTS.md +24 -6
- package/docs/SDK.md +82 -3
- package/docs/SDK_ACTION_CONFORMANCE.md +21 -0
- package/docs/TESTING.md +38 -2
- package/docs/agent-task-token-baseline.json +1 -1
- package/docs/agent-task-transcripts.json +1 -1
- package/marketplace.json +1 -1
- package/package.json +1 -1
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/extensions/calendar/index.ts +1 -0
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-34MP7WKK.js +0 -6
- package/dist/cli-bundle/chunks/chunk-3KMYHYJV.js +0 -2
- package/dist/cli-bundle/chunks/chunk-42BHHNTL.js +0 -128
- package/dist/cli-bundle/chunks/chunk-I5O3XZOA.js +0 -2
- package/dist/cli-bundle/chunks/chunk-LEIVUGDH.js +0 -8
- package/dist/cli-bundle/chunks/chunk-OH7WPD42.js +0 -114
- package/dist/cli-bundle/chunks/chunk-OOD2A7AF.js +0 -20
- package/dist/cli-bundle/chunks/chunk-Q5V7P6NM.js +0 -2
- package/dist/cli-bundle/chunks/chunk-QLPFYBXN.js +0 -2
- package/dist/cli-bundle/chunks/chunk-SA5NYLPE.js +0 -8
- package/dist/cli-bundle/chunks/chunk-VHLAVTJN.js +0 -31
- package/dist/cli-bundle/chunks/chunk-XAOVJG52.js +0 -3
- package/dist/cli-bundle/chunks/chunk-XPQ4RTSF.js +0 -2
- package/dist/cli-bundle/chunks/item-transaction-WIOBZW4E.js +0 -2
- package/dist/cli-bundle/chunks/register-mutation-5V2NANIS.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-XSFRMUFX.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2V6NMNYN.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-ASHGXMX4.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-CKBN2D42.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-I642DXOT.js +0 -22
- package/dist/cli-bundle/focused-chunks/chunk-K7DKG5HM.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-NMQBXU7N.js +0 -44
- package/dist/cli-bundle/focused-chunks/chunk-PGM3ENGZ.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-QFNV4JTA.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-QVJCQMZY.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-R2TPPPVU.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-VJVJ2ZX2.js +0 -2
- package/dist/cli-bundle/focused-chunks/item-transaction-ZFDKJIP7.js +0 -2
package/docs/CONFIGURATION.md
CHANGED
|
@@ -110,7 +110,43 @@ capture an opaque boot/PID-namespace coordinate and the owner's process start
|
|
|
110
110
|
tick. A matching host can reclaim a provably dead original owner before TTL,
|
|
111
111
|
including when its PID has been reused. Foreign hosts, legacy receipts, denied
|
|
112
112
|
process probes and unavailable identity remain subject to the existing TTL
|
|
113
|
-
policy.
|
|
113
|
+
policy. A commit gate with a provably dead same-host owner can also be recovered
|
|
114
|
+
immediately, before its ordinary age threshold. Its original owner receipt is
|
|
115
|
+
retained in `locks/recoveries/gate-<generation-hash>/owner.json`. These nonempty
|
|
116
|
+
generation directories prevent concurrent recoverers from retiring a replacement
|
|
117
|
+
gate and must be retained while writers may still hold observations of that
|
|
118
|
+
generation. Recovery after the age grace requires a dead PID or verified PID
|
|
119
|
+
reuse for a readable owner, and uses the same retained generation protocol.
|
|
120
|
+
A live PID with unavailable start identity keeps its gate regardless of age;
|
|
121
|
+
elapsed time alone cannot safely distinguish a paused writer from abandonment.
|
|
122
|
+
Recorded host coordinates must be verified before recovery; a recorded foreign
|
|
123
|
+
host or unavailable recorded host evidence cannot be replaced by a local PID
|
|
124
|
+
comparison. Legacy receipts without `host_identity` use a local PID probe after
|
|
125
|
+
the grace period. On shared storage, that probe can retire a gate owned by a
|
|
126
|
+
writer on another host whose PID appears dead locally; these legacy receipts
|
|
127
|
+
do not provide cross-host recovery safety.
|
|
128
|
+
Non-missing owner-file read errors also retain the gate regardless of age.
|
|
129
|
+
Lock wait durations use a monotonic clock independently of the
|
|
130
|
+
wall-clock timestamps used for TTL policy. This recovery is tracked by
|
|
131
|
+
[pm-gh1609](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1609.toon)
|
|
132
|
+
(repository tracker record excluded from npm).
|
|
133
|
+
|
|
134
|
+
If a reboot, PID-namespace change or tracker relocation leaves an unverifiable
|
|
135
|
+
`locks/<lock-file>.stale-cleanup` gate, automatic age-based recovery intentionally
|
|
136
|
+
refuses it. `pm gc --scope locks` does not remove these gate directories.
|
|
137
|
+
For manual recovery, first stop every CLI, MCP server, watcher and service that
|
|
138
|
+
can write this tracker, including writers on other hosts when storage is shared.
|
|
139
|
+
Independently establish that the recorded original owner cannot still run; a
|
|
140
|
+
different host hash or an old timestamp alone is insufficient. While exclusive
|
|
141
|
+
access is maintained, preserve the complete gate directory and its `owner.json`
|
|
142
|
+
receipt by moving it to a unique backup location outside `locks`, without
|
|
143
|
+
overwriting any existing backup. Keep `locks/recoveries` evidence intact. Then
|
|
144
|
+
retry the original command, run `pm health --check-only`, and verify the affected
|
|
145
|
+
item's history with `pm history <id> --verify --strict-exit`. If exclusive access
|
|
146
|
+
or owner death cannot be established, retain the gate and investigate ownership.
|
|
147
|
+
This procedure does not override the remaining lease's TTL or ownership checks.
|
|
148
|
+
|
|
149
|
+
Early recovery writes an immutable `locks/recoveries/*.json` intent
|
|
114
150
|
receipt before removal; it records the original owner and is an attempted
|
|
115
151
|
recovery audit, not proof that a later mutation committed. Keep these local
|
|
116
152
|
runtime receipts out of version control.
|
|
@@ -390,6 +426,16 @@ pm get <id> --full --json
|
|
|
390
426
|
pm contracts --json
|
|
391
427
|
```
|
|
392
428
|
|
|
429
|
+
With JSON output, preflight advisories are deferred until the command outcome.
|
|
430
|
+
A failed command includes their stable codes in the error envelope's `warnings`
|
|
431
|
+
array on stderr, preserving one parseable error and its original exit code.
|
|
432
|
+
Additional explanatory or remediation text is retained in `warning_details`.
|
|
433
|
+
A successful command emits one `{ "type": "warning", "warnings": [...] }`
|
|
434
|
+
diagnostic on stderr when needed; its result remains on stdout. Human output
|
|
435
|
+
keeps immediate warning text. See
|
|
436
|
+
[pm-gh1602](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1602.toon)
|
|
437
|
+
(repository tracker record excluded from npm).
|
|
438
|
+
|
|
393
439
|
`--output-format json|toon` selects encoding on both reads and mutations.
|
|
394
440
|
Item collection and lifecycle commands accept `--format json|toon` as a
|
|
395
441
|
compatibility alias, before or after the command:
|
|
@@ -593,6 +639,7 @@ Useful commands:
|
|
|
593
639
|
|
|
594
640
|
```bash
|
|
595
641
|
pm config project set search_default_mode keyword
|
|
642
|
+
pm config project set context_next_ranking_policy weighted # pm next: priority_floor (default) or weighted
|
|
596
643
|
pm config project set search_mutation_refresh_policy cache_only
|
|
597
644
|
pm config project set search_embedding_corpus_max_characters 12000
|
|
598
645
|
pm config project set search_query_expansion_enabled true
|
|
@@ -130,6 +130,32 @@ patterns, absolute paths and invocation-relative anchoring remain supported.
|
|
|
130
130
|
The regression uses a real temporary directory and the same deeply nested input
|
|
131
131
|
that failed before the replacement. Audit errors remain mandatory failures.
|
|
132
132
|
|
|
133
|
+
## Redirect credential and glob amplification advisories
|
|
134
|
+
|
|
135
|
+
[pm-irviv0](../.agents/pm/issues/pm-irviv0.toon) tracks
|
|
136
|
+
[GHSA-mrwp-f3q8-3g9p](https://github.com/advisories/GHSA-mrwp-f3q8-3g9p)
|
|
137
|
+
(`follow-redirects` 1.16.0 through 1.16.1: cross-realm `sensitiveHeaders`
|
|
138
|
+
arrays are discarded, so custom credentials can follow redirects) and
|
|
139
|
+
[GHSA-g3hv-75wg-m249](https://github.com/advisories/GHSA-g3hv-75wg-m249)
|
|
140
|
+
(`minimatch` before 11.0.1: denial of service through glob-part
|
|
141
|
+
amplification). Both were published on October 30 and the registry feed
|
|
142
|
+
reported them from the next run on `main` while OSV was still clean, so the
|
|
143
|
+
advisory gate refused every PR and the scheduled release path until the lock
|
|
144
|
+
changed. `follow-redirects` is reached only through the CodSpeed benchmark
|
|
145
|
+
plugin's Axios client, and `minimatch` through ESLint and its config array
|
|
146
|
+
and as a direct dependency of `@stryker-mutator/core` (mutation testing); all
|
|
147
|
+
of these are development dependencies and none establishes a CLI or SDK
|
|
148
|
+
route. The pnpm overrides require `follow-redirects` 1.16.2 or a newer
|
|
149
|
+
1.x release and `minimatch` 11.0.1 or a newer 11.x release. `minimatch` 11
|
|
150
|
+
keeps dual CommonJS and ES module exports, so ESLint's `require` path is
|
|
151
|
+
unchanged and the full lint run passes; the override applies to the Stryker
|
|
152
|
+
path as well. Both releases satisfy pnpm's one-day
|
|
153
|
+
minimum release age without an exclusion; the seven-day Dependabot cooldown
|
|
154
|
+
is unchanged. The gate's catch-all refusal said that no feed success could be
|
|
155
|
+
inferred, which hid the real cause (a non-empty registry id list); read
|
|
156
|
+
`.cache/dependency-security/receipt.json` before treating that message as a
|
|
157
|
+
feed outage.
|
|
158
|
+
|
|
133
159
|
## CodSpeed 5.7.1 patch
|
|
134
160
|
|
|
135
161
|
CodSpeed's declared dependency previously resolved Axios 1.19.0, and both
|
|
@@ -33,9 +33,22 @@ stdin selection, dry runs, rollback behavior, and evidence flags. Put bulk flags
|
|
|
33
33
|
after `many`. Deletion recovery remains `pm history restore <id> <version>`.
|
|
34
34
|
|
|
35
35
|
Plain `claim`, `release`, `update`, and `close` keep their original semantics.
|
|
36
|
-
`claim --start`
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
`claim <id> --start` rejects `--if-available` before mutation. It claims
|
|
37
|
+
ownership, then moves the item to the configured in-progress status.
|
|
38
|
+
`claim --next --start` selects the next caller-available item with the same
|
|
39
|
+
filters, `--if-available` behavior, and race-loss walk as `claim --next`.
|
|
40
|
+
Ranking happens before any lock, so a candidate can change before it is
|
|
41
|
+
claimed. Each attempt re-reads the candidate under its item lock and then
|
|
42
|
+
claims it and moves it to the configured in-progress status in one locked
|
|
43
|
+
mutation and one `claim` history event. No other agent can therefore observe
|
|
44
|
+
the claimed item before it starts. Configured type workflows are enforced, a
|
|
45
|
+
terminal candidate is refused (`terminal_state_conflict`), and the receipt
|
|
46
|
+
carries `start: { from_status, to_status }`. A claim without an id or `--next`
|
|
47
|
+
is refused with `missing_required_argument`, and `claim <id> --next` with
|
|
48
|
+
`ambiguous_option_combination`; their next steps never tell the caller to pass
|
|
49
|
+
a flag that is already present. `claim <id> --start --next` (or
|
|
50
|
+
`--if-available`) is refused by the explicit-start composition with
|
|
51
|
+
`invalid_argument_value`, whose recovery names the flags to remove. `release --pause` moves work to the configured
|
|
39
52
|
open status, then releases ownership. `close --release-assignment` records the
|
|
40
53
|
close and its inline evidence, then releases ownership.
|
|
41
54
|
|
|
@@ -67,6 +80,7 @@ import { PmClient } from "@unbrained/pm-cli/sdk";
|
|
|
67
80
|
|
|
68
81
|
const pm = new PmClient({ pmRoot: "/project/.agents/pm" });
|
|
69
82
|
const started = await pm.claim("pm-example", { start: true });
|
|
83
|
+
const nextStarted = await pm.claimNext({ start: true }); // ranked selection, then one locked claim-and-start write
|
|
70
84
|
const paused = await pm.release("pm-example", { pause: true });
|
|
71
85
|
const closed = await pm.close("pm-example", "Acceptance verified", {
|
|
72
86
|
releaseAssignment: true,
|
|
@@ -84,7 +98,8 @@ Literal `true` options return typed `StartTaskResult`, `PauseTaskResult`, or
|
|
|
84
98
|
`runCloseTask` primitives expose the same SDK-owned compositions.
|
|
85
99
|
|
|
86
100
|
MCP actions remain `claim`, `release`, and `close`, using `start`, `pause`, and
|
|
87
|
-
`releaseAssignment`.
|
|
101
|
+
`releaseAssignment`. MCP `claim` with `next: true` and `start: true` uses the
|
|
102
|
+
same ranked selection and single locked claim-and-start write as `claim --next --start`. Action-specific discovery types claim's `start` as boolean;
|
|
88
103
|
scheduling actions retain string timestamps. For the broad provider tool schema,
|
|
89
104
|
pass the claim boolean through `options: { start: true }` because its shared flat
|
|
90
105
|
`start` property retains the scheduling string contract. Bulk action names remain
|
package/docs/PACKED_FIRST_RUN.md
CHANGED
|
@@ -6,7 +6,8 @@ Trackers: [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
|
|
|
6
6
|
[pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
|
|
7
7
|
|
|
8
8
|
CI globally installs one tarball in isolated npm prefixes on Ubuntu/macOS/Windows
|
|
9
|
-
with Node 22.18.0 and 24,
|
|
9
|
+
with Node 22.18.0 and 24, one `Packed runtime (<os>)` job per OS with a fresh
|
|
10
|
+
prefix, cache and home per Node version, runs the installed `pm` shim, then invokes:
|
|
10
11
|
|
|
11
12
|
```bash
|
|
12
13
|
node scripts/release/packed-first-run.mjs /path/to/installed/@unbrained/pm-cli
|
|
@@ -221,12 +221,30 @@ Read-option recovery is tracked by
|
|
|
221
221
|
use `--output-format toon|json` across read commands. Completeness uses
|
|
222
222
|
`--output-include full` on list, search and get; context detail depth uses
|
|
223
223
|
`--depth full`. These controls retain the normal row and token ceilings.
|
|
224
|
-
When
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
224
|
+
When a completeness spelling is refused on a read command that has an
|
|
225
|
+
equivalent spelling of its own, the error provides
|
|
226
|
+
`recovery.suggested_retry_args` for that same command. Examples are
|
|
227
|
+
`get/context --brief`, which becomes `--depth brief`, and
|
|
228
|
+
`list/search/history --depth full`, which becomes `--full`. The same applies to
|
|
229
|
+
`--toon` on list, search, context or get, which becomes `--output-format toon`.
|
|
230
|
+
The correction is derived from runtime contracts, not from a hand-maintained
|
|
231
|
+
list. A boolean `--<level>` maps to `--depth <level>` only when that command's
|
|
232
|
+
`--depth` flag contract declares the level in its `values` domain. A
|
|
233
|
+
`--depth <level>` maps to `--<level>` only when the level is one of the
|
|
234
|
+
command's declared read-output projection modes. `--depth standard` on a
|
|
235
|
+
command without `--depth` replays without the flag, because standard is every
|
|
236
|
+
command's default level. Aliased paths such as `deps` and `health` replay on
|
|
237
|
+
their canonical noun-first path (`pm item deps`, `pm ops health`). When a
|
|
238
|
+
command has no equivalent, for example `search --depth brief`, no retry is
|
|
239
|
+
guessed. The refusal instead lists the controls that command accepts: for
|
|
240
|
+
search, `Completeness controls accepted by pm search: --compact, --full.`
|
|
241
|
+
([pm-gh1626](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1626.toon);
|
|
242
|
+
repository-only tracker record excluded from npm). The SDK's
|
|
243
|
+
`resolveReadOptionRetryArgs` exposes the same token-preserving correction, and
|
|
244
|
+
`resolveReadCompletenessControls` returns each command's declared vocabulary.
|
|
245
|
+
Conflicting controls such as `--fields`, `--output-include`, `--section`, `--for`
|
|
246
|
+
or another completeness flag, and ambiguous operands, do not receive a guessed
|
|
247
|
+
retry.
|
|
230
248
|
An explicit `--json` conflicts with `--toon`, so that invocation receives no
|
|
231
249
|
encoding-changing retry. Non-conflicting TOON refusals include the corrected
|
|
232
250
|
command in human output without requiring JSON diagnostics.
|
package/docs/SDK.md
CHANGED
|
@@ -278,7 +278,17 @@ async function writePackageState(pmRoot: string, write: () => Promise<void>) {
|
|
|
278
278
|
```
|
|
279
279
|
|
|
280
280
|
The built-in provider automatically recovers a provably dead original Linux
|
|
281
|
-
owner before TTL
|
|
281
|
+
owner before TTL, including an owner killed inside its commit fence. Recovery
|
|
282
|
+
retains the gate generation as evidence so concurrent recoverers cannot
|
|
283
|
+
remove its replacement, including recovery after the age grace when a dead PID
|
|
284
|
+
or verified PID reuse establishes abandonment. A readable gate with a live PID
|
|
285
|
+
and unavailable start identity is retained regardless of age. An unreadable
|
|
286
|
+
gate owner is also retained; age and failed reads do not prove abandonment.
|
|
287
|
+
Recorded host coordinates must be verified; a local PID comparison cannot
|
|
288
|
+
authorize recovery of foreign or unverifiable host evidence.
|
|
289
|
+
Acquisition, commit-gate and release wait budgets use
|
|
290
|
+
a monotonic clock; wall-clock adjustments do not extend those budgets.
|
|
291
|
+
Unknown owners retain the existing lease policy. Conflicts
|
|
282
292
|
expose the lock identity, observed process state, `waited_ms`, observed
|
|
283
293
|
`owner_handoffs` and wait advice through `PmCliError.context`. The wait budget
|
|
284
294
|
is a fixed total by default. Pass `{ waitPolicy: "progress" }` in the options
|
|
@@ -675,7 +685,7 @@ import {
|
|
|
675
685
|
parseMutationReceipt,
|
|
676
686
|
estimatePmOutputTokens,
|
|
677
687
|
resolvePmCommandOutputBudget,
|
|
678
|
-
} from "@
|
|
688
|
+
} from "@unbrained/pm-cli/sdk/contracts";
|
|
679
689
|
|
|
680
690
|
const compactRead = definePmCommandOutputBudget({
|
|
681
691
|
command: "get",
|
|
@@ -2040,6 +2050,19 @@ contract compact and fail-safe for newly added flags. Use
|
|
|
2040
2050
|
package-authored query surface. `encodeQueryCursor`, `decodeQueryCursorState`, and
|
|
2041
2051
|
`paginateQueryRows` remain the transport-neutral continuation primitives.
|
|
2042
2052
|
|
|
2053
|
+
A flag with a closed value domain declares it in `CliFlagContract.values`. For
|
|
2054
|
+
example, `get` and `context` declare `--depth brief|standard|deep|full`, and
|
|
2055
|
+
`plan` declares `--depth brief|standard|deep`, so `pm contracts --command <c>
|
|
2056
|
+
--flags-only --json` shows the accepted spellings without parsing help prose.
|
|
2057
|
+
`resolveReadCompletenessControls(command)` combines that domain with the
|
|
2058
|
+
command's read-output projection modes. `resolveReadOptionRetryArgs` uses the
|
|
2059
|
+
result to correct a completeness spelling only into a flag the attempted
|
|
2060
|
+
command declares
|
|
2061
|
+
([pm-gh1626](../.agents/pm/issues/pm-gh1626.toon)). A flag that accepts a
|
|
2062
|
+
comma-separated value list declares `list: true`. `--unset` on create, update
|
|
2063
|
+
and update-many does, so repeated flags and comma lists reach the parser as the
|
|
2064
|
+
same field set ([pm-gh1633](../.agents/pm/issues/pm-gh1633.toon)).
|
|
2065
|
+
|
|
2043
2066
|
`decodeQueryCursorEnvelope`, `decodeQueryCursorState`, and
|
|
2044
2067
|
`resolveQueryCursorStart` accept an optional final `cursorFlag` argument
|
|
2045
2068
|
(`"--after"`, the default, or `"--cursor"`) so package-authored queries can
|
|
@@ -2117,7 +2140,15 @@ Custom agent hosts can import `projectPmBriefListEnvelope` from
|
|
|
2117
2140
|
`@unbrained/pm-cli/sdk` to apply the same brief-list presentation without
|
|
2118
2141
|
mutating the original result. It retains unchecked source status and actionable
|
|
2119
2142
|
continuation, and leaves partial, custom, or inconsistent envelopes intact.
|
|
2120
|
-
|
|
2143
|
+
`projectPmBriefSearchEnvelope` does the same for search pages. It drops
|
|
2144
|
+
`truncated` when it repeats `has_more` and a `filters.limit` echo of
|
|
2145
|
+
`applied_limit`, and it replaces the single default `projection_metadata`
|
|
2146
|
+
omission receipt with `details: "--full"`. For flat default lists, the list
|
|
2147
|
+
projection replaces the default ascending sort's legacy `sort`/`order` echo with
|
|
2148
|
+
one `effective_keys` comparator line, so the effective default order stays
|
|
2149
|
+
visible. Tree-mode lists carry no `effective_keys`, because hierarchy traversal
|
|
2150
|
+
overrides flat ordering; there the default sort echo is simply omitted.
|
|
2151
|
+
The CLI applies these projections only to TOON; ordinary JSON and SDK query
|
|
2121
2152
|
results retain their complete contracts. The public `encodePmTableRows` and
|
|
2122
2153
|
`decodePmTableRows` primitives distinguish explicit null and empty cells from
|
|
2123
2154
|
missing keys. TOON rendering preserves those row facts before selecting the
|
|
@@ -2341,6 +2372,13 @@ const signalRead = await store.readOrRebuild(itemsFromDerivedIndex, {
|
|
|
2341
2372
|
const report = await scoreContextCandidates(signalRead.candidates);
|
|
2342
2373
|
```
|
|
2343
2374
|
|
|
2375
|
+
`pm next` applies a ranking policy after scoring: `priority_floor` (the
|
|
2376
|
+
default, from `context.next_ranking_policy` or the `rankingPolicy` option)
|
|
2377
|
+
resumes in-progress work, then orders by priority tier with relevance inside a
|
|
2378
|
+
tier; `weighted` keeps the blended score order. The response discloses it as
|
|
2379
|
+
`filters.ranking_policy`, and the recommendation reasons name the disagreement
|
|
2380
|
+
when the score leader differs from the recommendation (GH-1618).
|
|
2381
|
+
|
|
2344
2382
|
Use `--explain-ranking --json` on `pm context` or `pm next` to include the model,
|
|
2345
2383
|
available signals, baseline rank, final rank, score, and per-signal
|
|
2346
2384
|
contributions. Explanation data is opt-in so default agent output stays bounded.
|
|
@@ -2849,6 +2887,19 @@ delivered to the registered positional arguments unchanged.
|
|
|
2849
2887
|
|
|
2850
2888
|
## Output Ownership
|
|
2851
2889
|
|
|
2890
|
+
Unicode output policy ([pm-gh1624](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1624.toon), tracker record excluded from npm):
|
|
2891
|
+
the built-in JSON and TOON formatters refuse unpaired UTF-16 surrogates in
|
|
2892
|
+
structured output values or object keys with `text_unpaired_surrogate` and a
|
|
2893
|
+
field path. Custom `toJSON()` values and boxed primitives are materialized once
|
|
2894
|
+
per render using their native JSON semantics; the resulting snapshot is validated
|
|
2895
|
+
and shared by both formatters. Valid astral characters and caller data are preserved. Extension
|
|
2896
|
+
producers can call `assertWellFormedOutputText(value)` before returning
|
|
2897
|
+
JSON-compatible data. When replacing malformed external text is intentional,
|
|
2898
|
+
use `toWellFormedText(text)` from `@unbrained/pm-cli/sdk/core` (also available from
|
|
2899
|
+
`@unbrained/pm-cli/sdk`); it replaces lone
|
|
2900
|
+
surrogates with U+FFFD without splitting valid pairs. Apply normalization before
|
|
2901
|
+
constructing object keys so the producer can handle possible key collisions.
|
|
2902
|
+
|
|
2852
2903
|
Command handlers should normally return structured data and let the host select
|
|
2853
2904
|
TOON, JSON, service, or registered renderer output. A renderer override returns a
|
|
2854
2905
|
string when it owns the matching payload and `null` to fall back to native
|
|
@@ -2915,6 +2966,34 @@ A typo fails activation with a did-you-mean hint (e.g. `type: "strnig"` →
|
|
|
2915
2966
|
`Did you mean "string"?`) instead of silently passing and failing opaquely at use
|
|
2916
2967
|
time.
|
|
2917
2968
|
|
|
2969
|
+
## Package Error Provenance
|
|
2970
|
+
|
|
2971
|
+
Expected package errors retain their structured `context` across separately
|
|
2972
|
+
bundled SDK copies. Use `createPmCliExpectedError` to declare an expected refusal.
|
|
2973
|
+
A custom exception carrying only `code`, `exitCode: 1` and `remediation` remains
|
|
2974
|
+
an unexpected fault. Sentry error attribution uses the same bounded source
|
|
2975
|
+
context as telemetry without requiring telemetry delivery or command tracing, with host version
|
|
2976
|
+
and the registered command owner's manifest version. Noninteractive traffic
|
|
2977
|
+
uses `automation`; explicit `test`/`dogfood` contexts retain their own environments.
|
|
2978
|
+
Error events and usage logs tagged `user` use `production`, including when CI was inferred at initialization.
|
|
2979
|
+
Early errors retain `--json` and `--quiet` automation attribution. Original
|
|
2980
|
+
extension causes remain available locally through the SDK; Sentry's extra error
|
|
2981
|
+
data integration does not copy cause payload fields into diagnostic contexts.
|
|
2982
|
+
Explicit `SENTRY_ENVIRONMENT`, consent and test isolation remain authoritative.
|
|
2983
|
+
Sequential commands clear previous extension attribution. Tracked by
|
|
2984
|
+
[pm-gh1625](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1625.toon)
|
|
2985
|
+
(tracker record excluded from npm).
|
|
2986
|
+
|
|
2987
|
+
`resolveTelemetrySourceAttribution(options?, env?, interactive?)` exposes that
|
|
2988
|
+
same pure attribution policy to custom SDK hosts without reading configuration,
|
|
2989
|
+
creating an installation identity, or sending data. Expected refusals use
|
|
2990
|
+
`createPmCliExpectedError`; unexpected handler failures retain their original
|
|
2991
|
+
non-enumerable `cause` in `CommandHandlerResult` and become
|
|
2992
|
+
`ExtensionCommandError` in the CLI host. The host preserves structured diagnostics
|
|
2993
|
+
and reports these faults as exceptions. An exception name alone cannot declare
|
|
2994
|
+
an expected refusal when the original error violates the public contract.
|
|
2995
|
+
SDK extension actions and delegated template reads retain the same failure kind.
|
|
2996
|
+
|
|
2918
2997
|
## Expected CLI Errors
|
|
2919
2998
|
|
|
2920
2999
|
`resolveLifecycleVerbRecovery(verb, availablePaths)` returns explicit argument
|
|
@@ -90,6 +90,27 @@ ceiling. For row-oriented `list` and `search` intents, pm reports:
|
|
|
90
90
|
- `binding_constraint` as `token_budget` or `explicit_limit`;
|
|
91
91
|
- `limit_reason` with the selection rationale.
|
|
92
92
|
|
|
93
|
+
When the intent budget reduces an explicit `--limit`, as with
|
|
94
|
+
`pm context --for orient --limit 10` (the 3000-token orient budget carries 3
|
|
95
|
+
rows), the reduction is never silent. `context_intent.limit_override` records the
|
|
96
|
+
reduced `flag` (`"--limit"`), `requested`, `effective`, the
|
|
97
|
+
`token_budget_for_requested` that would carry the
|
|
98
|
+
request, and `restore_with`: the flag to add to (or replace in) the original
|
|
99
|
+
command, so every original positional, inline filter, and option is kept. Both
|
|
100
|
+
fields are omitted when no safe-integer budget can carry the request. `filters.requested_limit` sits beside the
|
|
101
|
+
effective `filters.limit`, and `warnings` carries
|
|
102
|
+
`limit_overridden_by_intent:--limit <requested>-><effective>`. The same applies
|
|
103
|
+
to `context`, `list`, and `search` intents.
|
|
104
|
+
|
|
105
|
+
MCP read tools (`pm_context`, `pm_get`, `pm_list`, `pm_next`, `pm_search`)
|
|
106
|
+
accept every optional parameter their action contract declares either flat or
|
|
107
|
+
under `options`. The runtime derives the flat-to-options mapping from
|
|
108
|
+
`PM_TOOL_ACTION_PARAMETER_CONTRACTS`, so a declared argument such as `for`,
|
|
109
|
+
`depth`, `limit`, or `tokenBudget` is never silently ignored; nested `options`
|
|
110
|
+
win when both are present. Positional operands stay top-level like `pm_get`'s
|
|
111
|
+
`id`: `pm_search` reads `query` (or its declared alias `keywords`) only from the
|
|
112
|
+
top-level arguments.
|
|
113
|
+
|
|
93
114
|
Default intent budgets retain the ordinary page cap. Explicit budgets may
|
|
94
115
|
derive larger pages; recursive compaction and resumable cursor safeguards still
|
|
95
116
|
enforce the final serialized token ceiling.
|
package/docs/TESTING.md
CHANGED
|
@@ -58,6 +58,14 @@ node scripts/run-tests.mjs test
|
|
|
58
58
|
node scripts/run-tests.mjs coverage
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
The Linux killed-owner integration suite always exercises Node. Its additional
|
|
62
|
+
Bun case runs locally when `bun --version` succeeds; CI requires Bun and retains
|
|
63
|
+
the case even when the executable is missing, so a broken CI setup fails visibly.
|
|
64
|
+
Install Bun before claiming local Node-and-Bun recovery coverage. This fixture
|
|
65
|
+
policy is tracked by
|
|
66
|
+
[pm-gh1609](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1609.toon)
|
|
67
|
+
(repository tracker record excluded from npm).
|
|
68
|
+
|
|
61
69
|
For the exact ordered local preflight used to make release-readiness claims,
|
|
62
70
|
run the registry-owned entrypoint:
|
|
63
71
|
|
|
@@ -264,6 +272,26 @@ node scripts/run-tests.mjs test -- tests/integration/cli.integration.spec.ts
|
|
|
264
272
|
|
|
265
273
|
Use focused runs while iterating, then run coverage before closure when risk or scope warrants it.
|
|
266
274
|
|
|
275
|
+
## CI Job Layout and Runner Budget
|
|
276
|
+
|
|
277
|
+
Every pull-request push draws from the account-wide hosted-runner pool (20
|
|
278
|
+
concurrent jobs, 5 on macOS, shared by every repository on the account), so the
|
|
279
|
+
required CI asks for as few runners as the proofs allow
|
|
280
|
+
([pm-m6ig79](../.agents/pm/issues/pm-m6ig79.toon)):
|
|
281
|
+
|
|
282
|
+
| Job | Runs |
|
|
283
|
+
| --- | --- |
|
|
284
|
+
| `Build foundation (Ubuntu, Node 24)` | Build, `dist` artifact, packed tarball. |
|
|
285
|
+
| `Packed runtime (<os>)` × 3 | Packed first run on Node 22.18.0 and 24 in isolated prefixes, dist version smoke; Ubuntu adds the Node 22 telemetry and snapshot regressions, macOS the native shell and portability checks, Windows the full npm npx and Bun bunx acceptance. |
|
|
286
|
+
| `Gates (static)` | Typecheck, version, changelog, secret scan, `pnpm lint` (`quality:static`), package artifact, token budgets, tracker merge-safety and assurance gates. |
|
|
287
|
+
| `Gates (smokes)` | Shell completion, npx/plugin smokes, host isolation, context evaluation, compatibility migration and published workspace compatibility. |
|
|
288
|
+
| `Coverage shard N/4` × 4, `Gates (coverage)` | Sharded coverage, then the merged 100% threshold. |
|
|
289
|
+
| `Windows regression cohort` × 3, `Windows regression (Node 24)` | Script and native Windows cohorts, all running at once, then their aggregate. |
|
|
290
|
+
|
|
291
|
+
Add a proof as a step inside the job that owns its platform and runtime rather
|
|
292
|
+
than as a new job: a sub-minute job still waits in the shared queue before it
|
|
293
|
+
starts.
|
|
294
|
+
|
|
267
295
|
## CI Retry and Timeout Diagnostics
|
|
268
296
|
|
|
269
297
|
The required `Gates (coverage)` job runs after the coverage matrix settles and
|
|
@@ -759,8 +787,9 @@ pm test <item-id> --run --workspace-context snapshot --override-linked-workspace
|
|
|
759
787
|
Node 24 releases retain the same dangling-link behavior; the async `stat`
|
|
760
788
|
`throwIfNoEntry` option was added in
|
|
761
789
|
[Node 24.15](https://nodejs.org/download/release/v24.20.0/docs/api/fs.html#fspromisesstatpath-options).
|
|
762
|
-
The real filesystem and CLI snapshot suite runs in the required
|
|
763
|
-
|
|
790
|
+
The real filesystem and CLI snapshot suite runs on Node 22 in the required
|
|
791
|
+
`Packed runtime (ubuntu-latest)` job and in the native Windows regression job
|
|
792
|
+
before merge.
|
|
764
793
|
|
|
765
794
|
Windows execution is tracked by [pm-bj7rq0](../.agents/pm/issues/pm-bj7rq0.toon).
|
|
766
795
|
Script and native keeper cohorts run independently on Windows Node 24. Their
|
|
@@ -878,6 +907,13 @@ pm test <item-id> --run --only-index 2
|
|
|
878
907
|
pm test <item-id> --run --only-last
|
|
879
908
|
```
|
|
880
909
|
|
|
910
|
+
A selective run's receipt lists only the tests it selected. When the
|
|
911
|
+
receipt includes `tests_omitted`, copy and run the complete
|
|
912
|
+
`tests_omitted.restore_with` command to read the whole stored collection. It
|
|
913
|
+
keeps the invocation's `--pm-path` (including a tracker chosen through
|
|
914
|
+
`PM_PATH`) and `--no-extensions`, which a bare `pm test <item-id> --list` would
|
|
915
|
+
drop.
|
|
916
|
+
|
|
881
917
|
Linked-command stdout and stderr are captured through temporary regular files,
|
|
882
918
|
then read back with the 20 MiB per-stream retention bound. This keeps inherited
|
|
883
919
|
descriptors blocking for Bun, Rust, and other runtimes that treat `EAGAIN` on a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":5,"transcript_version":2,"transcript_digest":"sha256:
|
|
1
|
+
{"version":5,"transcript_version":2,"transcript_digest":"sha256:b4b151f3d36860e73cd535d0520e9f03b4ecec4444ee81a8b868896b5b0bba47","estimator":"ceil(utf8_bytes / 4)","comparison_scope":"plan_recovery_tracker_root_canonicalized","measurement_scope":"output_before_token_accounting","published_with_release":true,"orientation":{"canonical_task_id":"orientation-context-intent","required_capabilities":["actionable_work","active_ownership","workspace_state"],"measured_winner_tokens":1051,"protocols":[{"task_id":"orientation-context-intent","command_count":1,"estimated_tokens":1051,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"context","field_path":"hierarchy"}],"active_ownership":[{"step_id":"context","field_path":"activity"}],"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}]}},{"task_id":"orientation-operating-rules","command_count":4,"estimated_tokens":2067,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"open","field_path":"items"}],"active_ownership":[{"step_id":"in-progress","field_path":"items"}],"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}]}},{"task_id":"orientation-contracts-next","command_count":2,"estimated_tokens":5213,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"next","field_path":"recommended.id"}],"active_ownership":[{"step_id":"next","field_path":"held_by_others"}],"workspace_state":[{"step_id":"next","field_path":"summary.in_progress"}]}}]},"tasks":[{"id":"orientation-context-intent","max_estimated_tokens":1051,"steps":[{"id":"context","max_estimated_tokens":1051,"accounting_mode":"self_reported"}]},{"id":"orientation-contracts-next","max_estimated_tokens":5213,"steps":[{"id":"contracts","max_estimated_tokens":4481,"accounting_mode":"self_reported"},{"id":"next","max_estimated_tokens":732,"accounting_mode":"self_reported"}]},{"id":"orientation-operating-rules","max_estimated_tokens":2067,"steps":[{"id":"context","max_estimated_tokens":1015,"accounting_mode":"self_reported"},{"id":"search","max_estimated_tokens":164,"accounting_mode":"self_reported"},{"id":"open","max_estimated_tokens":712,"accounting_mode":"self_reported"},{"id":"in-progress","max_estimated_tokens":176,"accounting_mode":"self_reported"}]},{"id":"context-bootstrap","max_estimated_tokens":2005,"steps":[{"id":"triage","max_estimated_tokens":619,"accounting_mode":"self_reported"},{"id":"orient","max_estimated_tokens":1015,"accounting_mode":"self_reported"},{"id":"inspect","max_estimated_tokens":371,"accounting_mode":"self_reported"}]},{"id":"closed-domain-recovery","max_estimated_tokens":630,"steps":[{"id":"refuse-intent","max_estimated_tokens":259,"accounting_mode":"self_reported"},{"id":"retry-intent","max_estimated_tokens":371,"accounting_mode":"self_reported"}]},{"id":"unknown-option-recovery","max_estimated_tokens":596,"steps":[{"id":"refuse-option","max_estimated_tokens":433,"accounting_mode":"self_reported"},{"id":"retry-option","max_estimated_tokens":163,"accounting_mode":"self_reported"}]},{"id":"lifecycle-mutation","max_estimated_tokens":873,"steps":[{"id":"create","max_estimated_tokens":20,"accounting_mode":"self_reported"},{"id":"inspect-open","max_estimated_tokens":363,"accounting_mode":"self_reported"},{"id":"close","max_estimated_tokens":92,"accounting_mode":"self_reported"},{"id":"inspect-closed","max_estimated_tokens":398,"accounting_mode":"self_reported"}]},{"id":"bulk-effect-outcomes","max_estimated_tokens":392,"steps":[{"id":"create-bulk-target","max_estimated_tokens":20,"accounting_mode":"self_reported"},{"id":"partial-effect","max_estimated_tokens":240,"accounting_mode":"self_reported"},{"id":"no-effect","max_estimated_tokens":132,"accounting_mode":"self_reported"}]},{"id":"plan-execution-mutations","max_estimated_tokens":806,"steps":[{"id":"create-plan","max_estimated_tokens":21,"accounting_mode":"self_reported"},{"id":"add-step","max_estimated_tokens":254,"accounting_mode":"self_reported"},{"id":"complete-step","max_estimated_tokens":253,"accounting_mode":"self_reported"},{"id":"inspect-plan","max_estimated_tokens":278,"accounting_mode":"self_reported"}]}],"composite_max_estimated_tokens":13633}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":2,"orientation":{"canonical_task_id":"orientation-context-intent","required_capabilities":["workspace_state","active_ownership","actionable_work"],"protocols":[{"task_id":"orientation-context-intent","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}],"active_ownership":[{"step_id":"context","field_path":"activity"}],"actionable_work":[{"step_id":"context","field_path":"hierarchy"}]}},{"task_id":"orientation-contracts-next","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"next","field_path":"summary.in_progress"}],"active_ownership":[{"step_id":"next","field_path":"held_by_others"}],"actionable_work":[{"step_id":"next","field_path":"recommended.id"}]}},{"task_id":"orientation-operating-rules","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}],"active_ownership":[{"step_id":"in-progress","field_path":"items"}],"actionable_work":[{"step_id":"open","field_path":"items"}]}}]},"tasks":[{"id":"orientation-context-intent","description":"Build sufficient cold-start workspace, ownership, and actionable-work context with the bounded orientation intent.","steps":[{"id":"context","args":["context","--for","orient"
|
|
1
|
+
{"version":2,"orientation":{"canonical_task_id":"orientation-context-intent","required_capabilities":["workspace_state","active_ownership","actionable_work"],"protocols":[{"task_id":"orientation-context-intent","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}],"active_ownership":[{"step_id":"context","field_path":"activity"}],"actionable_work":[{"step_id":"context","field_path":"hierarchy"}]}},{"task_id":"orientation-contracts-next","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"next","field_path":"summary.in_progress"}],"active_ownership":[{"step_id":"next","field_path":"held_by_others"}],"actionable_work":[{"step_id":"next","field_path":"recommended.id"}]}},{"task_id":"orientation-operating-rules","capabilities":["workspace_state","active_ownership","actionable_work"],"capability_evidence":{"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}],"active_ownership":[{"step_id":"in-progress","field_path":"items"}],"actionable_work":[{"step_id":"open","field_path":"items"}]}}]},"tasks":[{"id":"orientation-context-intent","description":"Build sufficient cold-start workspace, ownership, and actionable-work context with the bounded orientation intent.","steps":[{"id":"context","args":["context","--for","orient"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["summary.active_items","hierarchy","activity"]}]},{"id":"orientation-contracts-next","description":"Compare the proposed contracts-summary plus next cold-start protocol on the same fixed workspace.","steps":[{"id":"contracts","args":["contracts","--summary"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["commands"]},{"id":"next","args":["next","--for","execute","--ready-only","--limit","3"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["summary.in_progress","held_by_others","recommended.id"]}]},{"id":"orientation-operating-rules","description":"Compare the historical context, search, open-list, and in-progress-list orientation sequence.","steps":[{"id":"context","args":["context","--for","orient"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["summary.active_items","hierarchy","activity"]},{"id":"search","args":["search","agent task","--status","all","--limit","10"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["items"]},{"id":"open","args":["list","--status","open","--limit","20"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["items"]},{"id":"in-progress","args":["list","--status","in_progress","--limit","20"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["items"]}]},{"id":"context-bootstrap","description":"Orient in a scaled workspace and inspect the canonical focus item.","steps":[{"id":"triage","args":["list","--for","triage","--limit","2"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["items"]},{"id":"orient","args":["context","--for","orient"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["summary.active_items","hierarchy","activity"]},{"id":"inspect","args":["get","$ANCHOR_ID","--for","inspect"],"expected_exit_code":0,"expected_output_kind":"entity","expected_accounting_mode":"self_reported","required_fields":["item.id"]}]},{"id":"closed-domain-recovery","description":"Reject an invalid context intent and execute the advertised shell-free retry.","steps":[{"id":"refuse-intent","args":["get","$ANCHOR_ID","--for","invalid-agent-intent"],"expected_exit_code":2,"expected_output_kind":"refusal","expected_accounting_mode":"self_reported","required_fields":["code","refusal","recovery"],"expected_error_code":"unknown_context_intent","expected_field_values":{"recovery.recovery_mode":"compact"},"expected_refusal_surface":"--for"},{"id":"retry-intent","args":["get","$ANCHOR_ID","--for","inspect"],"expected_exit_code":0,"expected_output_kind":"entity","expected_accounting_mode":"self_reported","required_fields":["item.id"],"recovery_for":"refuse-intent"}]},{"id":"unknown-option-recovery","description":"Identify an unsupported option after valid flags and continue with the corrected command.","steps":[{"id":"refuse-option","args":["search","agent task","--status","open","--limit","5","--include-body"],"expected_exit_code":2,"expected_output_kind":"refusal","expected_accounting_mode":"self_reported","required_fields":["code","refusal","recovery"],"expected_error_code":"unknown_option","expected_refusal_surface":"--include-body"},{"id":"retry-option","args":["search","agent task","--status","open","--limit","5"],"expected_exit_code":0,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["items"],"recovery_for":"refuse-option"}]},{"id":"lifecycle-mutation","description":"Create, inspect, close, and confirm a project item through public CLI receipts.","steps":[{"id":"create","args":["create","--id","$LIFECYCLE_ID","--title","Transcript lifecycle item","--description","Golden multi-step lifecycle task","--type","Task","--status","open","--create-mode","progressive"],"expected_exit_code":0,"expected_output_kind":"mutation_receipt","expected_accounting_mode":"self_reported","required_fields":["id","changed_field_count"]},{"id":"inspect-open","args":["get","$LIFECYCLE_ID","--for","inspect"],"expected_exit_code":0,"expected_output_kind":"entity","expected_accounting_mode":"self_reported","required_fields":["item.id","item.status"],"expected_field_values":{"item.status":"open"}},{"id":"close","args":["close","$LIFECYCLE_ID","Golden task completed"],"expected_exit_code":0,"expected_output_kind":"mutation_receipt","expected_accounting_mode":"self_reported","required_fields":["id","status","close_reason","completion.timestamp","completion.source","completion.hint"],"expected_field_values":{"completion.source":"close_time"}},{"id":"inspect-closed","args":["get","$LIFECYCLE_ID","--for","inspect"],"expected_exit_code":0,"expected_output_kind":"entity","expected_accounting_mode":"self_reported","required_fields":["item.id","item.status"],"expected_field_values":{"item.status":"closed"}}]},{"id":"bulk-effect-outcomes","description":"Preserve successful partial-effect and no-effect outcomes across a bulk lifecycle task.","steps":[{"id":"create-bulk-target","args":["create","--id","$BULK_ID","--title","Transcript bulk effect target","--description","Golden bulk outcome transcript target","--type","Task","--status","open","--create-mode","progressive"],"expected_exit_code":0,"expected_output_kind":"mutation_receipt","expected_accounting_mode":"self_reported","required_fields":["id","status","changed_field_count"]},{"id":"partial-effect","args":["close-many","--ids","$BULK_ID,pm-transcript-missing","--reason","Golden partial-effect transcript","--validate-close","off","--no-checkpoint"],"expected_exit_code":7,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["rows","outcome","exit_code","rows.0.completion.timestamp","rows.0.completion.source","rows.0.completion.hint"],"expected_field_values":{"outcome":"partial_effect","rows.0.completion.source":"close_time"}},{"id":"no-effect","args":["close-many","--ids","$BULK_ID","--reason","Golden no-effect transcript","--validate-close","off","--no-checkpoint"],"expected_exit_code":6,"expected_output_kind":"collection","expected_accounting_mode":"self_reported","required_fields":["rows","outcome","exit_code"],"expected_field_values":{"outcome":"no_effect"}}]},{"id":"plan-execution-mutations","description":"Create a Plan, add and complete a step, then inspect its durable evidence without echoing the full Plan on each mutation.","steps":[{"id":"create-plan","args":["create","--id","pm-transcript-plan","--type","Plan","--title","Transcript execution Plan","--create-mode","progressive"],"expected_exit_code":0,"expected_output_kind":"mutation_receipt","expected_accounting_mode":"self_reported","required_fields":["id","status"]},{"id":"add-step","args":["plan","add-step","pm-transcript-plan","--step-title","Verify result","--step-body","Durable execution context retained for later inspection."],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["id","step.id","steps_summary.total","inspection_command"],"expected_field_values":{"kind":"plan_mutation","steps_summary.total":1}},{"id":"complete-step","args":["plan","complete-step","pm-transcript-plan","plan-step-001","--step-evidence","Verified result"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["id","step.status","steps_summary.completed","omission_receipt"],"expected_field_values":{"step.status":"completed","steps_summary.completed":1}},{"id":"inspect-plan","args":["plan","show","pm-transcript-plan","--depth","deep"],"expected_exit_code":0,"expected_output_kind":"diagnostic","expected_accounting_mode":"self_reported","required_fields":["plan.steps","plan.steps_summary.completed"],"expected_field_values":{"plan.steps_summary.completed":1}}]}]}
|
package/marketplace.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.
|
|
1
|
+
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.11.1","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.11.1","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-beads","version":"2026.
|
|
1
|
+
{"name":"@unbrained/pm-beads","version":"2026.11.1","private":true,"type":"module","description":"First-party pm package for importing Beads JSONL records.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-beads"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","beads"],"pm":{"aliases":["beads"],"extensions":["extensions/beads"],"catalog":{"display_name":"Beads Import","category":"migration","summary":"Import Beads JSONL records into pm while preserving source IDs.","tags":["migration","beads","import"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -20,6 +20,7 @@ const CALENDAR_VIEW_NAMES = ["agenda", "day", "week", "month"] as const;
|
|
|
20
20
|
// not leak into Sentry as crashes.
|
|
21
21
|
class PmCliError extends Error {
|
|
22
22
|
exitCode: number;
|
|
23
|
+
context: Record<string, unknown> = {};
|
|
23
24
|
constructor(message: string, exitCode: number) {
|
|
24
25
|
super(message);
|
|
25
26
|
this.name = "PmCliError";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-calendar","version":"2026.
|
|
1
|
+
{"name":"@unbrained/pm-calendar","version":"2026.11.1","private":true,"type":"module","description":"First-party pm package for calendar and agenda views.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-calendar"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","calendar","agenda"],"pm":{"aliases":["calendar"],"extensions":["extensions/calendar"],"catalog":{"display_name":"Calendar Views","category":"workflow","summary":"Show agenda, day, week, and month views for deadlines, reminders, and scheduled events.","tags":["calendar","agenda","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-command-kit","version":"2026.
|
|
1
|
+
{"name":"@unbrained/pm-command-kit","version":"2026.11.1","private":true,"type":"module","description":"First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-command-kit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","commands","exemplar"],"pm":{"aliases":["command-kit"],"extensions":["extensions/command-kit"],"catalog":{"display_name":"Command Kit Exemplar","category":"sdk","summary":"Copy-paste-able exemplar for registerCommand, registerFlags, and registerParser.","tags":["sdk","commands","parser","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-digital-twin","version":"2026.
|
|
1
|
+
{"name":"@unbrained/pm-digital-twin","version":"2026.11.1","private":true,"type":"module","description":"Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-digital-twin"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","digital-twin","event-sourcing","temporal-graph","exemplar"],"pm":{"aliases":["digital-twin","twin"],"extensions":["extensions/digital-twin"],"catalog":{"display_name":"Digital Twin SDK Exemplar","category":"sdk","summary":"Temporal facility graph proving event replay, point-in-time state, invariants, federation, checkpoints, and compact exports through public SDK contracts.","tags":["sdk","digital-twin","event-sourcing","graph","offline-first","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|