@unbrained/pm-cli 2026.10.30 → 2026.10.31
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +32 -0
- 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-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/chunk-24J6TNYE.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-EHBGHX55.js → chunk-2AHSPMKJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-MVL27TAH.js → chunk-35Q2B2GJ.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-43R7UTWV.js +2 -0
- package/dist/cli-bundle/chunks/chunk-6PSDQ7T7.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-UUQX3PFD.js → chunk-BS2KXT24.js} +70 -70
- package/dist/cli-bundle/chunks/{chunk-Y6NC3X3E.js → chunk-GMBDZID5.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-HSBTITO4.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-LWW4F4G2.js → chunk-MRUA2Z43.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-P3LNMWL2.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-S2U7ECUJ.js → chunk-PT7TS6E7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TH5KPAN4.js → chunk-SBVX5CMV.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4BQD5SW2.js → chunk-TL3O5GZA.js} +30 -30
- package/dist/cli-bundle/chunks/chunk-U7JXZMU5.js +6 -0
- package/dist/cli-bundle/chunks/{chunk-GRABKNFL.js → chunk-V6EWBTNH.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-VC7TA67O.js +20 -0
- package/dist/cli-bundle/chunks/chunk-WNF6FOL7.js +31 -0
- package/dist/cli-bundle/chunks/chunk-WRXQAW7Q.js +114 -0
- package/dist/cli-bundle/chunks/{chunk-RZQNFHXO.js → chunk-WX25MU4N.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-XDDPSWIW.js +2 -0
- package/dist/cli-bundle/chunks/chunk-YT5D5HNG.js +2 -0
- package/dist/cli-bundle/chunks/chunk-ZTJVOBDU.js +128 -0
- package/dist/cli-bundle/chunks/{indexed-receipt-blobs-LHLE7PSG.js → indexed-receipt-blobs-KGMJVFH2.js} +2 -2
- package/dist/cli-bundle/chunks/item-transaction-UWV6UNSV.js +2 -0
- package/dist/cli-bundle/chunks/{mutation-admission-TRGAVS7N.js → mutation-admission-I4RHIT3Q.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-BH4F6M7Z.js → register-list-query-MVDL5EXG.js} +3 -3
- package/dist/cli-bundle/chunks/register-mutation-GAF7LXRB.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-JLFRL36Q.js +2 -0
- package/dist/cli-bundle/chunks/{register-setup-QPWSVHFZ.js → register-setup-MZN6ONB3.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-2ZORTOF6.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-S23ZUASN.js → chunk-2J7T2UCH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-4QPGJO2G.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-YU7QOYYV.js → chunk-57HPXGOQ.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-5MCGYBOQ.js +91 -0
- package/dist/cli-bundle/focused-chunks/chunk-6F6APBCX.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-AFVN2KCP.js +44 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RKPUQDWF.js → chunk-DFUTCKUF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-EA65HVBO.js +12 -0
- package/dist/cli-bundle/focused-chunks/chunk-GP2WU43K.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-YQUZL2CK.js → chunk-HPWT3RBG.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-HSAEEWSI.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-BPE6JTKL.js → chunk-JLXGRDTG.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-FRFNGMAK.js → chunk-JNKRUCVZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-BCIUAEWX.js → chunk-KH5QJXY7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-KKRIFBSL.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RGQEJFXO.js → chunk-MW77Q3AQ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-NOKG4RFN.js +22 -0
- package/dist/cli-bundle/focused-chunks/{chunk-POJPJX64.js → chunk-NRBUMDLF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-3SRX77ES.js → chunk-PC3R5CJV.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-RYEZSZJ7.js → chunk-PFBQOZPK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SAT7IAEB.js → chunk-QFMJGQGO.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-VFWCSQAG.js → chunk-SFQKCA5K.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-WHIE2C6Q.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-Y6UYRMVG.js +6 -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-LU75EG7D.js +2 -0
- package/dist/cli-bundle/focused-chunks/{mutation-admission-7VUODEPJ.js → mutation-admission-KDJ7SCPA.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-R4KEBO37.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/output.js +2 -2
- 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.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/core.d.ts +1 -0
- 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 +2 -2
- package/dist/sdk/index.js +1 -1
- 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/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/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/table-rows.d.ts +7 -1
- package/dist/sdk/output/table-rows.js +1 -1
- package/dist/sdk/output.d.ts +1 -0
- 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/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-primitives.d.ts +1 -0
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime.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 +1 -1
- package/docs/AGENT_OUTPUT_ENCODINGS.md +12 -0
- package/docs/AGENT_UX_CONTRACTS.md +2 -1
- package/docs/COMMANDS.md +58 -5
- package/docs/CONFIGURATION.md +48 -1
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +26 -0
- package/docs/PACKED_FIRST_RUN.md +2 -1
- package/docs/READ_OUTPUT_CONTRACTS.md +24 -6
- package/docs/SDK.md +73 -2
- package/docs/TESTING.md +38 -2
- package/docs/agent-task-token-baseline.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
|
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
|
|
@@ -2341,6 +2364,13 @@ const signalRead = await store.readOrRebuild(itemsFromDerivedIndex, {
|
|
|
2341
2364
|
const report = await scoreContextCandidates(signalRead.candidates);
|
|
2342
2365
|
```
|
|
2343
2366
|
|
|
2367
|
+
`pm next` applies a ranking policy after scoring: `priority_floor` (the
|
|
2368
|
+
default, from `context.next_ranking_policy` or the `rankingPolicy` option)
|
|
2369
|
+
resumes in-progress work, then orders by priority tier with relevance inside a
|
|
2370
|
+
tier; `weighted` keeps the blended score order. The response discloses it as
|
|
2371
|
+
`filters.ranking_policy`, and the recommendation reasons name the disagreement
|
|
2372
|
+
when the score leader differs from the recommendation (GH-1618).
|
|
2373
|
+
|
|
2344
2374
|
Use `--explain-ranking --json` on `pm context` or `pm next` to include the model,
|
|
2345
2375
|
available signals, baseline rank, final rank, score, and per-signal
|
|
2346
2376
|
contributions. Explanation data is opt-in so default agent output stays bounded.
|
|
@@ -2849,6 +2879,19 @@ delivered to the registered positional arguments unchanged.
|
|
|
2849
2879
|
|
|
2850
2880
|
## Output Ownership
|
|
2851
2881
|
|
|
2882
|
+
Unicode output policy ([pm-gh1624](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1624.toon), tracker record excluded from npm):
|
|
2883
|
+
the built-in JSON and TOON formatters refuse unpaired UTF-16 surrogates in
|
|
2884
|
+
structured output values or object keys with `text_unpaired_surrogate` and a
|
|
2885
|
+
field path. Custom `toJSON()` values and boxed primitives are materialized once
|
|
2886
|
+
per render using their native JSON semantics; the resulting snapshot is validated
|
|
2887
|
+
and shared by both formatters. Valid astral characters and caller data are preserved. Extension
|
|
2888
|
+
producers can call `assertWellFormedOutputText(value)` before returning
|
|
2889
|
+
JSON-compatible data. When replacing malformed external text is intentional,
|
|
2890
|
+
use `toWellFormedText(text)` from `@unbrained/pm-cli/sdk/core` (also available from
|
|
2891
|
+
`@unbrained/pm-cli/sdk`); it replaces lone
|
|
2892
|
+
surrogates with U+FFFD without splitting valid pairs. Apply normalization before
|
|
2893
|
+
constructing object keys so the producer can handle possible key collisions.
|
|
2894
|
+
|
|
2852
2895
|
Command handlers should normally return structured data and let the host select
|
|
2853
2896
|
TOON, JSON, service, or registered renderer output. A renderer override returns a
|
|
2854
2897
|
string when it owns the matching payload and `null` to fall back to native
|
|
@@ -2915,6 +2958,34 @@ A typo fails activation with a did-you-mean hint (e.g. `type: "strnig"` →
|
|
|
2915
2958
|
`Did you mean "string"?`) instead of silently passing and failing opaquely at use
|
|
2916
2959
|
time.
|
|
2917
2960
|
|
|
2961
|
+
## Package Error Provenance
|
|
2962
|
+
|
|
2963
|
+
Expected package errors retain their structured `context` across separately
|
|
2964
|
+
bundled SDK copies. Use `createPmCliExpectedError` to declare an expected refusal.
|
|
2965
|
+
A custom exception carrying only `code`, `exitCode: 1` and `remediation` remains
|
|
2966
|
+
an unexpected fault. Sentry error attribution uses the same bounded source
|
|
2967
|
+
context as telemetry without requiring telemetry delivery or command tracing, with host version
|
|
2968
|
+
and the registered command owner's manifest version. Noninteractive traffic
|
|
2969
|
+
uses `automation`; explicit `test`/`dogfood` contexts retain their own environments.
|
|
2970
|
+
Error events and usage logs tagged `user` use `production`, including when CI was inferred at initialization.
|
|
2971
|
+
Early errors retain `--json` and `--quiet` automation attribution. Original
|
|
2972
|
+
extension causes remain available locally through the SDK; Sentry's extra error
|
|
2973
|
+
data integration does not copy cause payload fields into diagnostic contexts.
|
|
2974
|
+
Explicit `SENTRY_ENVIRONMENT`, consent and test isolation remain authoritative.
|
|
2975
|
+
Sequential commands clear previous extension attribution. Tracked by
|
|
2976
|
+
[pm-gh1625](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1625.toon)
|
|
2977
|
+
(tracker record excluded from npm).
|
|
2978
|
+
|
|
2979
|
+
`resolveTelemetrySourceAttribution(options?, env?, interactive?)` exposes that
|
|
2980
|
+
same pure attribution policy to custom SDK hosts without reading configuration,
|
|
2981
|
+
creating an installation identity, or sending data. Expected refusals use
|
|
2982
|
+
`createPmCliExpectedError`; unexpected handler failures retain their original
|
|
2983
|
+
non-enumerable `cause` in `CommandHandlerResult` and become
|
|
2984
|
+
`ExtensionCommandError` in the CLI host. The host preserves structured diagnostics
|
|
2985
|
+
and reports these faults as exceptions. An exception name alone cannot declare
|
|
2986
|
+
an expected refusal when the original error violates the public contract.
|
|
2987
|
+
SDK extension actions and delegated template reads retain the same failure kind.
|
|
2988
|
+
|
|
2918
2989
|
## Expected CLI Errors
|
|
2919
2990
|
|
|
2920
2991
|
`resolveLifecycleVerbRecovery(verb, availablePaths)` returns explicit argument
|
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:83d4523ca528ad5e8801cf5c7c02dcebbf2b87dc72422d4b8e648755dcdc36c2","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":
|
|
1
|
+
{"version":5,"transcript_version":2,"transcript_digest":"sha256:83d4523ca528ad5e8801cf5c7c02dcebbf2b87dc72422d4b8e648755dcdc36c2","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}
|
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.10.
|
|
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.10.31","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.10.31","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.10.
|
|
1
|
+
{"name":"@unbrained/pm-beads","version":"2026.10.31","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.10.
|
|
1
|
+
{"name":"@unbrained/pm-calendar","version":"2026.10.31","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.10.
|
|
1
|
+
{"name":"@unbrained/pm-command-kit","version":"2026.10.31","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.10.
|
|
1
|
+
{"name":"@unbrained/pm-digital-twin","version":"2026.10.31","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"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-governance-audit","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-governance-audit","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for governance audit and normalization workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-governance-audit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","governance","audit","normalize","hooks"],"pm":{"aliases":["governance-audit","audit"],"extensions":["extensions/governance-audit"],"catalog":{"display_name":"Governance Audit","category":"governance","summary":"Run dedupe audits, comments audits, and normalize sweeps as package-owned workflows.","tags":["governance","audit","normalize","hooks"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-guide-shell","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-guide-shell","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for guide and shell completion workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-guide-shell"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","guide","completion","shell"],"pm":{"aliases":["guide-shell"],"extensions":["extensions/guide-shell"],"catalog":{"display_name":"Guide + Shell UX","category":"workflow","summary":"Restore guide documentation and shell completion commands as package-owned UX surfaces.","tags":["guide","completion","shell"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-kanban","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-kanban","version":"2026.10.31","private":true,"type":"module","description":"First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-kanban"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","profile","archetype","kanban","exemplar"],"pm":{"aliases":["kanban"],"extensions":["extensions/kanban"],"catalog":{"display_name":"Kanban Archetype","category":"sdk","summary":"Installable Kanban continuous-flow archetype: Card item type, flow fields, and a ProjectProfileDefinition built on public SDK primitives.","tags":["sdk","profile","archetype","kanban","schema","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package demonstrating safe lifecycle hook registration.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-lifecycle-hooks"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","hooks","lifecycle","sdk"],"pm":{"aliases":["lifecycle-hooks"],"extensions":["extensions/lifecycle-hooks"],"catalog":{"display_name":"Lifecycle Hooks","category":"sdk","summary":"Default-inert lifecycle hook exemplar for package authors.","tags":["hooks","lifecycle","sdk"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for optional linked-test run management adapters and reporters.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-linked-test-adapters"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","linked-tests","background-runs","test-runs"],"pm":{"aliases":["linked-test-adapters"],"extensions":["extensions/linked-test-adapters"],"catalog":{"display_name":"Linked Test Adapters","category":"testing","summary":"Restore optional linked-test run management/reporting command surfaces.","tags":["tests","linked-tests","background","reporting"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-search-advanced","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-search-advanced","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for semantic, hybrid, and reindex search workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-search-advanced"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","search","reindex","semantic","hybrid"],"pm":{"aliases":["search-advanced"],"extensions":["extensions/search-advanced"],"catalog":{"display_name":"Advanced Search","category":"search","summary":"Enable semantic/hybrid search modes and reindex workflows.","tags":["search","semantic","hybrid","reindex"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-templates","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-templates","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for reusable create templates.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-templates"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","templates"],"pm":{"aliases":["templates"],"extensions":["extensions/templates"],"catalog":{"display_name":"Create Templates","category":"workflow","summary":"Save, list, show, and apply reusable pm create option templates.","tags":["templates","create","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-todos","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-todos","version":"2026.10.31","private":true,"type":"module","description":"First-party pm package for Todo markdown import and export.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-todos"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","todos"],"pm":{"aliases":["todos"],"extensions":["extensions/todos"],"catalog":{"display_name":"Todos Import/Export","category":"migration","summary":"Import and export Todo markdown tasks through pm package commands.","tags":["migration","todos","import","export"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.31","private":true,"type":"module","description":"Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-vcs"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","vcs","event-sourcing","exemplar"],"pm":{"aliases":["vcs-exemplar"],"extensions":["extensions/vcs"],"catalog":{"display_name":"VCS SDK Exemplar","category":"sdk","summary":"Non-PM changeset/ref workflow proving custom schema, domain commands, hooks, history replay, and typed relationship events through public SDK contracts.","tags":["sdk","vcs","event-sourcing","graph","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.
|
|
1
|
+
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.31","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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.31","dependencies":{"@unbrained/pm-cli":"2026.10.31"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex","version":"2026.10.31","description":"Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli/tree/main/plugins/pm-codex","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","codex","mcp","project-management","agents","tasks","workflows"],"skills":"./skills/","mcpServers":"./.mcp.json","interface":{"displayName":"pm CLI","shortDescription":"Native pm tracker tools and agent workflows","longDescription":"Use pm CLI from Codex through native MCP tools instead of shelling out to the pm command. The plugin bundles tracker operations, skills, command prompts, and subagent workflow guidance for planning, execution, validation, release, and audit work.","developerName":"unbrained","category":"Coding","capabilities":["Interactive","Read","Write"],"websiteURL":"https://github.com/unbraind/pm-cli","privacyPolicyURL":"https://github.com/unbraind/pm-cli/blob/main/SECURITY.md","termsOfServiceURL":"https://github.com/unbraind/pm-cli/blob/main/LICENSE","defaultPrompt":["Use pm CLI to orient, claim, track, verify, and close this repository task"],"composerIcon":"./assets/pm-cli-small.svg","logo":"./assets/pm-cli-small.svg","screenshots":[],"brandColor":"#2563EB"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.31","dependencies":{"@unbrained/pm-cli":"2026.10.31"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","name":"pm-codex","version":"2026.10.
|
|
1
|
+
{"$schema":"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json","name":"pm-codex","version":"2026.10.31","description":"Repository-native project context workflows and a version-pinned pm MCP server for Codex.","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli/tree/main/plugins/pm-codex","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","codex","mcp","project-management","agents"],"extensions":{"com.openai":{"interface":{"displayName":"pm CLI","shortDescription":"Track project context with pm","longDescription":"Orient, plan, implement, verify, and hand off work with repository-native pm records and a bundled MCP server.","developerName":"unbrained","category":"Coding","capabilities":["Interactive","Read","Write"],"websiteURL":"https://github.com/unbraind/pm-cli","privacyPolicyURL":"https://github.com/unbraind/pm-cli/blob/main/SECURITY.md","termsOfServiceURL":"https://github.com/unbraind/pm-cli/blob/main/LICENSE","defaultPrompt":["Use pm to orient, track, verify, and hand off this repository task."],"composerIcon":"./assets/pm-cli-small.svg","logo":"./assets/pm-cli-small.svg","brandColor":"#2563EB"}}}}
|