@unbrained/pm-cli 2026.10.20 → 2026.10.22
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 +142 -77
- package/dist/cli/error-guidance.d.ts +8 -0
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/main.js +1 -1
- package/dist/cli/register-list-query.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-QMZ73FCW.js → chunk-2B5HAZFK.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-35ISFIPC.js +113 -0
- package/dist/cli-bundle/chunks/chunk-4D25HF3V.js +2 -0
- package/dist/cli-bundle/chunks/chunk-5LSN7K4N.js +2 -0
- package/dist/cli-bundle/chunks/chunk-7OTYULIJ.js +30 -0
- package/dist/cli-bundle/chunks/{chunk-GHJOMRSF.js → chunk-AOAQDCXX.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZA3XXHEE.js → chunk-BAIVTLJM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-LS55VKRK.js → chunk-C37RDYZI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YT2Z3JPC.js → chunk-E3JC3WQL.js} +47 -47
- package/dist/cli-bundle/chunks/{chunk-YECCKB4E.js → chunk-GWIGZDRS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YTHI5DTH.js → chunk-HC2DCGFA.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-IB7UB5TE.js +2 -0
- package/dist/cli-bundle/chunks/chunk-J444ZX23.js +126 -0
- package/dist/cli-bundle/chunks/{chunk-VLJLWZBO.js → chunk-LIC5EUQS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KU4Q3MSI.js → chunk-MV3KYY2A.js} +6 -6
- package/dist/cli-bundle/chunks/chunk-O67N62DT.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-TZU6U5ZE.js → chunk-PCPOTFJP.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TNU3XVPC.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-7ZOIZ2AZ.js → chunk-URV4VHQ4.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-YW6SIKYP.js → chunk-UYYTV2TX.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-VO3KDIU7.js +9 -0
- package/dist/cli-bundle/chunks/{indexed-receipt-blobs-U7VGKIYC.js → indexed-receipt-blobs-L3BOTMZN.js} +2 -2
- package/dist/cli-bundle/chunks/mutation-admission-TATOFEXF.js +2 -0
- package/dist/cli-bundle/chunks/{register-list-query-NNDV6F6I.js → register-list-query-GULR2IYO.js} +5 -5
- package/dist/cli-bundle/chunks/{register-mutation-3GCBSNQS.js → register-mutation-HLSQ4WVW.js} +4 -4
- package/dist/cli-bundle/chunks/register-operations-FE3GGA7O.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-XUIKAIZA.js +2 -0
- package/dist/cli-bundle/chunks/{settlement-hook-CLRGA6O7.js → settlement-hook-UVFYSBMU.js} +2 -2
- package/dist/cli-bundle/chunks/stage-QCPZBZRC.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-25L3L2PF.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-25NQRZ7J.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-2GFTVXKZ.js +8 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HUZAXSIJ.js → chunk-3LWH2RJC.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-46HBJC6J.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-A52W6GLA.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-CB7TSZ7P.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-VLSER3XW.js → chunk-CX5FNEFC.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-DVNUHTVK.js +9 -0
- package/dist/cli-bundle/focused-chunks/{chunk-LJPUJ2KK.js → chunk-EHPRSWJE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-GC4VMLXL.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-GHQVM6K6.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-KKRFSI2N.js → chunk-GVKYTDOH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-NI6NS44Q.js → chunk-KM77WU5U.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-QGDKWULS.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-QWKCQ5PW.js +91 -0
- package/dist/cli-bundle/focused-chunks/chunk-SOVXHW6Z.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-SVOOGGAK.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-SXVJRLLP.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-E4II2D2B.js → chunk-TMN3RAXZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-F7FD25TG.js → chunk-UQ5JPBY2.js} +11 -11
- package/dist/cli-bundle/focused-chunks/chunk-UUPJ6OZL.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-VYAZND5Q.js +78 -0
- package/dist/cli-bundle/focused-chunks/chunk-W2CND3BD.js +65 -0
- package/dist/cli-bundle/focused-chunks/{chunk-ZGEK57KD.js → chunk-XX5JQCLF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{indexed-receipt-blobs-H2G6CCGO.js → indexed-receipt-blobs-AAQOKO5B.js} +2 -2
- package/dist/cli-bundle/focused-chunks/mutation-admission-TBKR4KRM.js +2 -0
- package/dist/cli-bundle/focused-chunks/{settlement-hook-5SNBBT7C.js → settlement-hook-MNCHFCAX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/stage-RM6MJIMT.js +2 -0
- package/dist/cli-bundle/main.js +21 -21
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +23 -23
- 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 +58 -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 +7 -7
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/lock/lock-gc.d.ts +12 -5
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock-owner.d.ts +33 -0
- package/dist/core/lock/lock-owner.js +2 -0
- package/dist/core/lock/lock.d.ts +11 -22
- package/dist/core/lock/lock.js +4 -3
- package/dist/core/output/output.js +3 -3
- package/dist/core/shared/errors.d.ts +2 -0
- package/dist/core/shared/errors.js +1 -1
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +1 -1
- package/dist/sdk/agent/command-recovery.d.ts +2 -0
- package/dist/sdk/agent/command-recovery.js +1 -1
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +6 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +1 -1
- package/dist/sdk/context-intent-contracts.d.ts +13 -0
- package/dist/sdk/context-intent-contracts.js +1 -1
- package/dist/sdk/contracts.d.ts +1 -1
- package/dist/sdk/contracts.js +1 -1
- package/dist/sdk/core.d.ts +2 -2
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/define.d.ts +15 -16
- package/dist/sdk/define.js +1 -1
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/extension-command-context.js +2 -2
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance.js +1 -1
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/merge/install.js +2 -2
- package/dist/sdk/output/list-envelope.js +1 -1
- package/dist/sdk/pagination.d.ts +3 -3
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/context.d.ts +5 -0
- package/dist/sdk/query/context.js +2 -2
- package/dist/sdk/query/list.d.ts +2 -0
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/projection-contracts.d.ts +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/read-output/session-result.d.ts +39 -0
- package/dist/sdk/read-output/session-result.js +2 -0
- package/dist/sdk/read-output-contracts.d.ts +18 -5
- package/dist/sdk/read-output-contracts.js +1 -1
- package/dist/sdk/read-output-session.d.ts +2 -0
- package/dist/sdk/read-output-session.js +1 -1
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/runtime/mutation-admission.d.ts +2 -0
- package/dist/sdk/runtime/mutation-admission.js +2 -0
- package/dist/sdk/runtime-input.d.ts +2 -0
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime-primitives.d.ts +6 -0
- package/dist/sdk/runtime-primitives.js +1 -1
- package/dist/sdk/runtime.d.ts +10 -8
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/test/execution.d.ts +1 -0
- package/dist/sdk/test/execution.js +2 -2
- package/dist/sdk/workspace.d.ts +3 -1
- package/dist/sdk/workspace.js +8 -5
- package/docs/AGENT_RUNTIME_PRIMITIVES.md +9 -0
- package/docs/ASSURANCE.md +17 -2
- package/docs/COMMANDS.md +17 -3
- package/docs/CONFIGURATION.md +38 -0
- package/docs/CONTEXT_RELEVANCE.md +15 -0
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +56 -3
- package/docs/MCP_OPTION_CONFORMANCE.md +27 -1
- package/docs/MERGE_SAFETY.md +8 -0
- package/docs/READ_OUTPUT_CONTRACTS.md +79 -0
- package/docs/RELATIONSHIP_GRAPH.md +15 -0
- package/docs/RELEASING.md +8 -0
- package/docs/SDK.md +104 -7
- package/docs/TESTING.md +23 -0
- 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/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-2GGGOD7P.js +0 -30
- package/dist/cli-bundle/chunks/chunk-7NHA5K77.js +0 -126
- package/dist/cli-bundle/chunks/chunk-PNPE2OVJ.js +0 -112
- package/dist/cli-bundle/chunks/chunk-PTL3TBT6.js +0 -20
- package/dist/cli-bundle/chunks/chunk-QETMESEB.js +0 -6
- package/dist/cli-bundle/chunks/chunk-QQYCB2LO.js +0 -2
- package/dist/cli-bundle/chunks/register-operations-YKDGNKUL.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-AOUZQQWB.js +0 -2
- package/dist/cli-bundle/chunks/stage-6QXYRMSU.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-37SU7BZI.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-6IU7BESB.js +0 -65
- package/dist/cli-bundle/focused-chunks/chunk-AS3MOBO3.js +0 -25
- package/dist/cli-bundle/focused-chunks/chunk-AW35RDKA.js +0 -78
- package/dist/cli-bundle/focused-chunks/chunk-GYHZ7W6O.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-H5Q2HUU6.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-J6EYUGAR.js +0 -6
- package/dist/cli-bundle/focused-chunks/chunk-JEXZEIAX.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-KDGUIIRU.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-MQ42BFGX.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-VAYS754X.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-VS6VTWTZ.js +0 -8
- package/dist/cli-bundle/focused-chunks/stage-EMTISXR7.js +0 -2
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Development dependency security
|
|
2
2
|
|
|
3
3
|
Tracked by [pm-r61juc](../.agents/pm/issues/pm-r61juc.toon) and
|
|
4
|
-
[pm-fnx3np](../.agents/pm/issues/pm-fnx3np.toon)
|
|
4
|
+
[pm-fnx3np](../.agents/pm/issues/pm-fnx3np.toon), with independent advisory evidence in
|
|
5
|
+
[pm-eqxjzl](../.agents/pm/tasks/pm-eqxjzl.toon) and MCP/Vite remediation in
|
|
6
|
+
[pm-5sgx37](../.agents/pm/issues/pm-5sgx37.toon).
|
|
5
7
|
|
|
6
8
|
Development tools execute during tests, benchmarks and release preparation.
|
|
7
9
|
Their dependencies have the same admission requirement as production packages:
|
|
@@ -12,8 +14,34 @@ pnpm install --frozen-lockfile
|
|
|
12
14
|
pnpm quality:dependencies
|
|
13
15
|
```
|
|
14
16
|
|
|
15
|
-
This
|
|
16
|
-
|
|
17
|
+
This collects the full `pnpm audit --json`, with no production-only or severity
|
|
18
|
+
filter, and queries every npm name/version in the pnpm v9 lockfile against
|
|
19
|
+
[OSV querybatch](https://google.github.io/osv.dev/post-v1-querybatch/). The inventory
|
|
20
|
+
includes development, optional and platform-specific packages. Either source's
|
|
21
|
+
positive result blocks, even when the other returns zero. Unsupported resolutions,
|
|
22
|
+
empty inventories, malformed or partial responses, pagination and network failures
|
|
23
|
+
also block. Collection has bounded batch sizes, deadlines and no automatic retries.
|
|
24
|
+
Only public npm names and versions are sent to OSV.
|
|
25
|
+
|
|
26
|
+
The ignored local `.cache/dependency-security/receipt.json` records input hashes,
|
|
27
|
+
complete per-package OSV coverage, feed retrieval times, registry counts and
|
|
28
|
+
advisory IDs. Collection invalidates the prior receipt before querying. Database
|
|
29
|
+
update times are explicitly unknown: fresh retrieval does not prove a feed is
|
|
30
|
+
current. The SDK-owned `repository-static-quality` assurance gate composes a
|
|
31
|
+
`repository-quality/dependency-advisories` provider that verifies this receipt
|
|
32
|
+
without network access. It rejects evidence older than fifteen minutes, changed
|
|
33
|
+
manifests or lockfiles, incomplete coverage and unavailable sources. Fresh evidence
|
|
34
|
+
is required again on each CI/static or release run. Static checks refresh collection
|
|
35
|
+
immediately before SDK assurance evaluation, which verifies advisory evidence
|
|
36
|
+
before slower providers. The blocking registry command settles before OSV starts
|
|
37
|
+
its network deadlines.
|
|
38
|
+
|
|
39
|
+
CI retains this single receipt after successful and failed static jobs, with a
|
|
40
|
+
separate artifact name for each run attempt and seven-day retention. Inspect both
|
|
41
|
+
feeds before diagnosing a blocked collector: a positive advisory is a refusal,
|
|
42
|
+
even when the other feed is clean.
|
|
43
|
+
|
|
44
|
+
The command then verifies the installed CodSpeed bundle policy. Network/audit errors,
|
|
17
45
|
missing packages, incomplete policy entries, changed package files, and unreviewed
|
|
18
46
|
upgrades all fail. `quality:static` includes this command, so the existing CI,
|
|
19
47
|
nightly quality and release paths enforce it. The registry-owned local
|
|
@@ -27,6 +55,31 @@ defaults to the `latest` image. The workflow contract checks both values on
|
|
|
27
55
|
every TruffleHog step. Recheck the action's executable selectors when renewing
|
|
28
56
|
its commit pin.
|
|
29
57
|
|
|
58
|
+
## Vitest mocker advisory pair
|
|
59
|
+
|
|
60
|
+
[pm-vitest4112](../.agents/pm/tasks/pm-vitest4112.toon) coordinates the
|
|
61
|
+
[manual-registration finding](../.agents/pm/issues/pm-vitestmanual.toon) and
|
|
62
|
+
[Windows redirect finding](../.agents/pm/issues/pm-vitestredirect.toon).
|
|
63
|
+
[GHSA-qxg6-89mg-rqv8](https://github.com/advisories/GHSA-qxg6-89mg-rqv8)
|
|
64
|
+
and [GHSA-xp26-3454-mjgp](https://github.com/advisories/GHSA-xp26-3454-mjgp)
|
|
65
|
+
affect the previously locked `@vitest/mocker` 4.1.11. The compatible Vitest and
|
|
66
|
+
coverage-provider pair now requires 4.1.12, whose shared mock-source generator
|
|
67
|
+
serializes module URLs and export names, including asynchronous rebinding, and
|
|
68
|
+
whose public redirect handler normalizes backslashes before the file allowlist
|
|
69
|
+
check. Both fixes apply to public mocker/interceptor WebSocket handlers. The
|
|
70
|
+
repository's Node test configurations do not register these handlers, so the
|
|
71
|
+
affected development dependency does not establish an exploitable CLI or SDK
|
|
72
|
+
route.
|
|
73
|
+
|
|
74
|
+
The retained hosted OSV receipt identified both advisories while the registry
|
|
75
|
+
audit returned zero. Keep full-lock admission mandatory and verify the patched
|
|
76
|
+
graph against both feeds. This patch keeps Vitest 4, the CodSpeed peer contract
|
|
77
|
+
and the Vite 7 override; the broader Vitest 5 migration remains separate. The
|
|
78
|
+
installed-handler regressions run in coverage and the required native Windows
|
|
79
|
+
cohort, whose aggregate refuses failed, canceled or skipped partitions. The
|
|
80
|
+
October 15 patch releases meet pnpm's one-day minimum age on October 21 without
|
|
81
|
+
an exclusion. Dependabot's seven-day scheduling cooldown is unchanged.
|
|
82
|
+
|
|
30
83
|
## Indexed source-map offsets
|
|
31
84
|
|
|
32
85
|
[pm-dba47](../.agents/pm/issues/pm-dba47.toon) tracks Dependabot alert 47 and
|
|
@@ -1,12 +1,38 @@
|
|
|
1
1
|
# MCP Option Conformance
|
|
2
2
|
|
|
3
|
-
Tracked by [pm-v0s2rm](
|
|
3
|
+
Tracked by [pm-v0s2rm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/chores/pm-v0s2rm.toon), [pm-gh1538](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1538.toon), and [pm-ap7ilf](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ap7ilf.toon).
|
|
4
|
+
These repository-only tracking records are excluded from npm.
|
|
4
5
|
|
|
5
6
|
An integration test can pass while an undeclared option is ignored. That leaves
|
|
6
7
|
the test asserting a behavior it never exercised. The repository therefore
|
|
7
8
|
treats emitted MCP unknown-option diagnostics as test failures, while the
|
|
8
9
|
production server retains its advisory warning behavior for clients.
|
|
9
10
|
|
|
11
|
+
`pm_create` and `pm_update` accept the canonical mutation fields advertised by
|
|
12
|
+
their input schemas either at the top level or inside `options`. `pm_run` with
|
|
13
|
+
the corresponding action uses the same SDK normalization. Explicit nested
|
|
14
|
+
options take precedence, including CLI
|
|
15
|
+
aliases for the same field. Repeatable inputs, numeric values, and linked-resource
|
|
16
|
+
aliases use the shared mutation contracts before persistence. Native SDK `run`
|
|
17
|
+
callers continue to put update fields inside `options`.
|
|
18
|
+
|
|
19
|
+
Malformed option containers, values discarded from known scalar fields, and malformed repeatable
|
|
20
|
+
entries refuse before execution with `invalid_argument_value` and
|
|
21
|
+
`changed: false`. Declared boolean mutation fields, their aliases, and receipt
|
|
22
|
+
controls must be booleans, including `false`; this covers clear/replace flags,
|
|
23
|
+
parent/dependency exceptions, duplicate allowance, and `force`. These checks preserve project-defined
|
|
24
|
+
custom fields and template-based type resolution while preventing a bad field
|
|
25
|
+
from disappearing as a sibling field is written.
|
|
26
|
+
Array values that become CLI CSV inputs, such as `tags`, must contain only
|
|
27
|
+
strings and are checked before conversion. Validation follows nested precedence:
|
|
28
|
+
an explicit valid nested value replaces a flat value before either is normalized.
|
|
29
|
+
|
|
30
|
+
For example, `{ "id": "pm-one", "options": {}, "priority": 4 }` changes priority;
|
|
31
|
+
with `"options": { "priority": 2 }`, priority becomes `2`. Create also honors its
|
|
32
|
+
advertised explicit `id`, `deadline`, and other metadata. Regressions check the
|
|
33
|
+
discovered schema, persisted values and verified history, and compare item and
|
|
34
|
+
history bytes after invalid mutations to prove atomic refusal.
|
|
35
|
+
|
|
10
36
|
Every run using [vitest.config.ts](../vitest.config.ts) installs
|
|
11
37
|
[McpContractReporter](../scripts/mcp-contract-reporter.mts). The reporter records
|
|
12
38
|
the emitting file, full test name, option, tool, and action, and rejects the run
|
package/docs/MERGE_SAFETY.md
CHANGED
|
@@ -667,6 +667,14 @@ Never remove conflict markers manually while leaving the authoritative item and
|
|
|
667
667
|
|
|
668
668
|
`transactions/` and `checkpoints/` are per-branch crash-recovery state, not shared project context. `pm init` places both below the resolved tracker root in the managed `.gitignore` block, including custom `--pm-path` roots.
|
|
669
669
|
|
|
670
|
+
Each tracker sharing a repository retains its own cache exclusions and merge
|
|
671
|
+
patterns in either initialization order. Tracker names containing Git wildcard
|
|
672
|
+
characters are escaped as literal paths, while the generated item/history globs
|
|
673
|
+
remain active. Unrelated user rules and curated evaluation files are preserved.
|
|
674
|
+
These contracts are tracked by
|
|
675
|
+
[pm-nl60tbxzkjwp](../.agents/pm/issues/pm-nl60tbxzkjwp.toon) and
|
|
676
|
+
[pm-47wuv8awpqvj](../.agents/pm/issues/pm-47wuv8awpqvj.toon).
|
|
677
|
+
|
|
670
678
|
Ignore rules do not remove files that were already committed. `pm health`
|
|
671
679
|
(`integrity`) and `pm validate` (`storage_integrity`) therefore scan Git's
|
|
672
680
|
index for tracked files below `runtime/`, `search/`, `locks/`,
|
|
@@ -85,8 +85,87 @@ If brief still exceeds the ceiling, normal compaction and eventual refusal
|
|
|
85
85
|
apply. `estimated_tokens` measures the emitted envelope;
|
|
86
86
|
`omitted_result_estimated_tokens` measures the useful result that could not fit.
|
|
87
87
|
|
|
88
|
+
## Typed producer pages
|
|
89
|
+
|
|
90
|
+
Tracked by [pm-oybmsd](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-oybmsd.toon),
|
|
91
|
+
[pm-jqgkis](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-jqgkis.toon), and
|
|
92
|
+
[pm-qal1uw](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-qal1uw.toon)
|
|
93
|
+
(repository-only tracker records excluded from npm).
|
|
94
|
+
Native `PmClient.list`, `search`, and `context` reads and their standalone
|
|
95
|
+
convenience functions return sparse metadata when `after` resumes a producer
|
|
96
|
+
page. Retain the first page's filters, projection, sorting, totals and completeness
|
|
97
|
+
certificate. Subsequent pages carry `continuation_contract` with
|
|
98
|
+
`metadata: "reference"` and `restore_with: "omit --after"`; repeated metadata
|
|
99
|
+
is optional in `PmReadOutputProducerContinuation<Result>`. Follow `next_cursor`
|
|
100
|
+
until it is empty, rather than relying on the optional `has_more` field.
|
|
101
|
+
|
|
102
|
+
Calls whose options contain no producer cursor retain their first-page types.
|
|
103
|
+
Omitting the options argument has the same precise type as passing `{}` for
|
|
104
|
+
client and standalone `list`, `context`, and `search` calls; it does not imply
|
|
105
|
+
that an explicit budget, session, or output cursor was supplied.
|
|
106
|
+
Options with an optional cursor can return either page shape. When a budget,
|
|
107
|
+
session, or output cursor is possible, first use `isReadOutputBudgetExceeded`
|
|
108
|
+
to narrow the omission branch before accessing rows. This remains required for
|
|
109
|
+
unions of option shapes: a budgeted variant cannot be erased by an unbudgeted
|
|
110
|
+
variant. The low-level query producers retain their original result contracts;
|
|
111
|
+
metadata suppression belongs to the shared native SDK transport.
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
const first = await client.list({ brief: true, limit: "10" });
|
|
115
|
+
consume(first.items);
|
|
116
|
+
let cursor = first.next_cursor;
|
|
117
|
+
while (cursor) {
|
|
118
|
+
const page = await client.list({ brief: true, limit: "10", after: cursor });
|
|
119
|
+
consume(page.items);
|
|
120
|
+
cursor = page.next_cursor;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
88
124
|
## Cross-Call Context Sessions
|
|
89
125
|
|
|
126
|
+
Typed session results are tracked by
|
|
127
|
+
[pm-t1p1jv](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-t1p1jv.toon)
|
|
128
|
+
(repository-only tracker record excluded from npm). After narrowing budget
|
|
129
|
+
omission with `isReadOutputBudgetExceeded`, use `isReadOutputSessionReference`
|
|
130
|
+
from the SDK or `sdk/core` before accessing row prose or a search hit's nested
|
|
131
|
+
`item`. A reference contains only `id` and `context_ref`. Calls with no session,
|
|
132
|
+
including calls that specify only an output budget, retain their ordinary row
|
|
133
|
+
types. The direct `applyReadOutputDimensions` helper also infers session
|
|
134
|
+
capability from its options, including the accepted `output_session` spelling.
|
|
135
|
+
Unspecified or explicitly undefined session options retain ordinary rows;
|
|
136
|
+
optional, union, or dynamically typed session options admit references.
|
|
137
|
+
`PmReadOutputSessionResult<Result>` models literal `row_contract.row_keys`
|
|
138
|
+
paths (including nested arrays and keyed maps). Dynamic path declarations
|
|
139
|
+
conservatively admit references in nested collections, and envelopes without a
|
|
140
|
+
row declaration use the top-level array fallback. Keep package row paths literal
|
|
141
|
+
with `as const` to preserve precision in package result declarations.
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const page = await client.context({ outputSession: sessionState });
|
|
145
|
+
if (!isReadOutputBudgetExceeded(page)) {
|
|
146
|
+
for (const row of page.high_level) {
|
|
147
|
+
if (isReadOutputSessionReference(row)) consumeReference(row.context_ref);
|
|
148
|
+
else consumeTitle(row.title);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Read-option recovery is tracked by
|
|
154
|
+
[pm-7gpx34](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-7gpx34.toon)
|
|
155
|
+
(repository-only tracker record excluded from npm). For explicit static encoding,
|
|
156
|
+
use `--output-format toon|json` across read commands. Completeness uses
|
|
157
|
+
`--output-include full` on list, search and get; context detail depth uses
|
|
158
|
+
`--depth full`. These controls retain the normal row and token ceilings.
|
|
159
|
+
When `context --full`, `list/search --depth full`, or `--toon` on list, search,
|
|
160
|
+
context or get is refused,
|
|
161
|
+
the error provides `recovery.suggested_retry_args` for the same command with the
|
|
162
|
+
supported spelling. The SDK's `resolveReadOptionRetryArgs` exposes the same
|
|
163
|
+
token-preserving correction. Conflicting controls or ambiguous operands do not
|
|
164
|
+
receive a guessed retry.
|
|
165
|
+
An explicit `--json` conflicts with `--toon`, so that invocation receives no
|
|
166
|
+
encoding-changing retry. Non-conflicting TOON refusals include the corrected
|
|
167
|
+
command in human output without requiring JSON diagnostics.
|
|
168
|
+
|
|
90
169
|
`--output-session <json>` / `outputSession` composes the four per-call
|
|
91
170
|
dimensions across a request group. The caller supplies versioned state and
|
|
92
171
|
passes the returned `read_session.next_state` to the next read:
|
|
@@ -238,6 +238,21 @@ Every returned node is explainable: `role` names its semantic family (`prerequis
|
|
|
238
238
|
|
|
239
239
|
`meta.completeness` reports result quality: the exact in-memory kernel emits `complete` or `truncated`, and the contract reserves `sampled`, `approximate`, `stale_index`, and `redacted` for index-backed or policy-filtered providers so consumers can branch on one field.
|
|
240
240
|
|
|
241
|
+
The packer orders direct prerequisite and ancestor endpoints before optional
|
|
242
|
+
descendants or related nodes, reserves their direct relationship costs, and
|
|
243
|
+
emits root-incident edges first. An oversized edge is skipped so later feasible
|
|
244
|
+
edges can still be returned. The same order governs cursor pages; the cursor
|
|
245
|
+
fingerprint identifies this packing policy and rejects earlier-policy cursors. An
|
|
246
|
+
edge limit or a budget too small for an endpoint and its edges can still omit
|
|
247
|
+
evidence: inspect the direct-family totals, omitted counts and completeness
|
|
248
|
+
before using the packet to make a decision. The native adapter also reports
|
|
249
|
+
`relationship_context_bounds` in `omission_receipt` whenever the producer is
|
|
250
|
+
truncated. Increase the relevant bounds or follow the node cursor for more
|
|
251
|
+
detail; a full projection alone does not remove traversal limits.
|
|
252
|
+
|
|
253
|
+
Tracked by [pm-gh1534](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1534.toon)
|
|
254
|
+
(repository tracker records are excluded from npm).
|
|
255
|
+
|
|
241
256
|
Node, edge, depth, kind, direction, and token bounds are independent. The cursor fingerprint covers semantic filters and traversal shape, so it is rejected when reused for a different root or query. Output remains a plain object suitable for TOON, JSON, JSONL, MCP, or a custom UI; adapters own rendering and do not reimplement traversal.
|
|
242
257
|
|
|
243
258
|
The native adapter is `pm deps <id> --format context`. It is also available through `PmClient.deps`, `runAction({ action: "deps" })`, and the MCP `pm_deps` tool. `--max-depth`, `--node-limit`, `--edge-limit`, `--token-budget`, `--cursor`, `--direction`, and repeatable or comma-separated `--kind` map directly to the public SDK context options; `--summary` keeps only counts. Unknown `--kind` values fail fast with the registered-kind list instead of silently matching nothing. Tree and graph formats share those first four bounds, use safe defaults when omitted, and report deterministic truncation metadata instead of recursively expanding a cyclic or multiply-linked graph without limit.
|
package/docs/RELEASING.md
CHANGED
|
@@ -315,6 +315,14 @@ missing locked package. npm 12 ignores published shrinkwraps; shipping
|
|
|
315
315
|
a shrinkwrap alone therefore cannot enforce this contract. SDK consumers
|
|
316
316
|
supply the bounded optional Node types peer themselves.
|
|
317
317
|
|
|
318
|
+
Physical entrypoint verification is tracked by
|
|
319
|
+
[pm-tl7vlu](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-tl7vlu.toon)
|
|
320
|
+
(repository-only tracker record excluded from npm). The dependency advisory CLI
|
|
321
|
+
resolves both its invocation and module to physical paths, so directory aliases
|
|
322
|
+
and Node's symlink-preserving main-module mode still execute verification and
|
|
323
|
+
return a receipt or failure status. Module imports expose the collector without
|
|
324
|
+
starting verification.
|
|
325
|
+
|
|
318
326
|
Push the final implementation commit through a reviewed pull request first,
|
|
319
327
|
wait for DeepScan and CodeFactor to finish on that reviewed SHA, then run the
|
|
320
328
|
canonical registry-owned preflight:
|
package/docs/SDK.md
CHANGED
|
@@ -164,6 +164,19 @@ snapshot. Breaking SDK changes require a date-based release and matching
|
|
|
164
164
|
package compatibility bounds or migration guidance. Never refresh the snapshot
|
|
165
165
|
merely to silence an unexplained diff.
|
|
166
166
|
|
|
167
|
+
The mutation-admission update adds optional `changed?: false` to
|
|
168
|
+
`PmCliErrorContext`. The conservative signature gate records this interface
|
|
169
|
+
addition with a breaking acknowledgement; existing context objects and error
|
|
170
|
+
codes remain valid. Consumers need no data migration or new dependency bounds.
|
|
171
|
+
When adopting this update, read `error.context?.changed === false` as proof of a
|
|
172
|
+
preflight refusal. An absent property gives no guarantee about writes; do not
|
|
173
|
+
coerce it to `false` or treat an executed failure as safe to retry. Consumers
|
|
174
|
+
that enumerate error keys should accept the additional optional property.
|
|
175
|
+
JavaScript create/update callers must also remove misspelled keys and move
|
|
176
|
+
mutation fields into `options` on generic `run` calls: these requests now fail
|
|
177
|
+
instead of silently dropping fields. See [Robust Automation Pattern](#robust-automation-pattern)
|
|
178
|
+
for supported aliases and runtime schema discovery.
|
|
179
|
+
|
|
167
180
|
The snapshot also records an aggregate-completeness census. Every public symbol
|
|
168
181
|
from every non-testing SDK subpath must be available from
|
|
169
182
|
`@unbrained/pm-cli/sdk`; deliberate test-only exclusions require a named reason.
|
|
@@ -210,6 +223,36 @@ follow the migration guidance for changed unions or error codes. The shared
|
|
|
210
223
|
[primitive inventory](SDK_PRIMITIVE_INVENTORY.md) records CLI/MCP ownership:
|
|
211
224
|
presentation modules import the SDK and have zero private-core edges.
|
|
212
225
|
|
|
226
|
+
### Lock ownership and recovery
|
|
227
|
+
|
|
228
|
+
Use the public `acquireLock` primitive when a package must serialize its own
|
|
229
|
+
state changes. Always await its release in `finally`:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { acquireLock } from "@unbrained/pm-cli/sdk";
|
|
233
|
+
|
|
234
|
+
async function writePackageState(pmRoot: string, write: () => Promise<void>) {
|
|
235
|
+
const release = await acquireLock(pmRoot, "example.state", 3600, "example-package", false, true, 30_000);
|
|
236
|
+
try {
|
|
237
|
+
await write();
|
|
238
|
+
} finally {
|
|
239
|
+
await release();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The built-in provider automatically recovers a provably dead original Linux
|
|
245
|
+
owner before TTL. Unknown owners retain the existing lease policy. Conflicts
|
|
246
|
+
expose the lock identity, observed process state and wait advice through
|
|
247
|
+
`PmCliError.context`. Force does not bypass an unexpired lock whose owner is
|
|
248
|
+
alive or unverifiable. TTL expiry permits removal regardless of owner liveness.
|
|
249
|
+
An expired holder can continue writing, so mutual exclusion beyond TTL is not
|
|
250
|
+
guaranteed. Choose a TTL longer than the critical section, or fence protected
|
|
251
|
+
resource writes at the caller. See
|
|
252
|
+
[Configuration](CONFIGURATION.md#common-settings) for host identity, local
|
|
253
|
+
recovery audit receipts and `PM_LOCK_WAIT_MS` precedence. Extension lock
|
|
254
|
+
providers retain responsibility for their own ownership and recovery policy.
|
|
255
|
+
|
|
213
256
|
### Portable merge settlement
|
|
214
257
|
|
|
215
258
|
Tracked by [pm-gh1475](../.agents/pm/issues/pm-gh1475.toon) and
|
|
@@ -1659,6 +1702,16 @@ contract compact and fail-safe for newly added flags. Use
|
|
|
1659
1702
|
package-authored query surface. `encodeQueryCursor`, `decodeQueryCursorState`, and
|
|
1660
1703
|
`paginateQueryRows` remain the transport-neutral continuation primitives.
|
|
1661
1704
|
|
|
1705
|
+
`decodeQueryCursorEnvelope`, `decodeQueryCursorState`, and
|
|
1706
|
+
`resolveQueryCursorStart` accept an optional final `cursorFlag` argument
|
|
1707
|
+
(`"--after"`, the default, or `"--cursor"`) so package-authored queries can
|
|
1708
|
+
name their actual producer flag in refusal guidance. Relationship packets use
|
|
1709
|
+
`--cursor`. The deps action additionally returns a scoped executable
|
|
1710
|
+
`recovery.suggested_retry_args` for a fresh query after a malformed or mismatched
|
|
1711
|
+
cursor; it preserves traversal and output policy while removing the rejected
|
|
1712
|
+
producer cursor and stale output continuation. See
|
|
1713
|
+
[pm-ohgg1b](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ohgg1b.toon).
|
|
1714
|
+
|
|
1662
1715
|
At the storage boundary, the metadata cache maintains a rebuildable SQLite
|
|
1663
1716
|
query projection under the same source cursor and cross-process writer lock as
|
|
1664
1717
|
the JSON metadata/body/collection tiers. Bounded default-order light `list`
|
|
@@ -1846,6 +1899,22 @@ compact rounded report metrics for stable machine output.
|
|
|
1846
1899
|
|
|
1847
1900
|
### Context relevance and evaluation
|
|
1848
1901
|
|
|
1902
|
+
Context test health is tracked by
|
|
1903
|
+
[pm-gh1535](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1535.toon)
|
|
1904
|
+
(repository tracker records are excluded from npm). `ContextResult.tests` counts
|
|
1905
|
+
the complete matching active population, independently of the focus page and
|
|
1906
|
+
token selection. `scope: "matching_active_items"` and `total_items` declare its
|
|
1907
|
+
denominator, including active items without tests. Draft, blocked-lifecycle and
|
|
1908
|
+
terminal items are excluded unless the project schema classifies their status
|
|
1909
|
+
as active. The main summary still counts every matching lifecycle status.
|
|
1910
|
+
Consumers constructing `TestHealthSummary` values must supply the new scope and
|
|
1911
|
+
denominator fields; consumers reading results can use them directly.
|
|
1912
|
+
Markdown limits failing-item identities to the effective focus limit (or the
|
|
1913
|
+
default context limit) and native token budget, with `items_failing_omitted`
|
|
1914
|
+
when detail is withheld. Population counters remain exact. Structured SDK and
|
|
1915
|
+
MCP results retain the complete failing-item collection before their normal
|
|
1916
|
+
read-output budget handling.
|
|
1917
|
+
|
|
1849
1918
|
Tracked by [pm-4k6b](../.agents/pm/features/pm-4k6b.toon),
|
|
1850
1919
|
[pm-h3no](../.agents/pm/tasks/pm-h3no.toon),
|
|
1851
1920
|
[pm-3hps](../.agents/pm/tasks/pm-3hps.toon),
|
|
@@ -2576,7 +2645,8 @@ import { createPmCliExpectedError } from "@unbrained/pm-cli/sdk/runtime";
|
|
|
2576
2645
|
|
|
2577
2646
|
## Authoring Builders
|
|
2578
2647
|
|
|
2579
|
-
Tracked: [pm-12tj](
|
|
2648
|
+
Tracked: [pm-12tj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-12tj.toon) (design rationale: ADR [pm-3mph](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/decisions/pm-3mph.toon)); exactness and literal inference: [pm-gh1539](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gh1539.toon).
|
|
2649
|
+
These repository-only tracking records are excluded from npm.
|
|
2580
2650
|
|
|
2581
2651
|
The `define*` builders are the authoring half of the `author → register → test`
|
|
2582
2652
|
loop: they type a registration definition where you write it, before it ever
|
|
@@ -2619,7 +2689,8 @@ export function activate(api: ExtensionApi): void {
|
|
|
2619
2689
|
|
|
2620
2690
|
Object-definition builders (`defineExtensionManifest`, `defineCommand`,
|
|
2621
2691
|
`defineFlag`, `defineItemType`, `defineItemField`, `defineMigration`,
|
|
2622
|
-
`defineSearchProvider`, `defineVectorStoreAdapter`)
|
|
2692
|
+
`defineSearchProvider`, `defineVectorStoreAdapter`, `defineProjectProfile`) use
|
|
2693
|
+
const type parameters to preserve the narrow literal
|
|
2623
2694
|
type. `defineExtensionManifest` additionally contract-checks the in-module
|
|
2624
2695
|
manifest mirror where it is authored and pairs with `deriveExtensionCapabilities`
|
|
2625
2696
|
(see [Declarative Authoring](#declarative-authoring)). Function-definition
|
|
@@ -2632,11 +2703,16 @@ parameter is contextually typed instead of falling back to `any`. The
|
|
|
2632
2703
|
[`assertRegistered*`](#testing-helpers) helpers below verify these same
|
|
2633
2704
|
definitions once registered.
|
|
2634
2705
|
|
|
2635
|
-
The object builders reject unknown keys
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
|
|
2706
|
+
The object builders reject unknown top-level keys, including command, manifest,
|
|
2707
|
+
and profile definitions and separately authored variables. This catches
|
|
2708
|
+
misspellings without changing the runtime registry's storage boundary. Keep
|
|
2709
|
+
package-specific annotations beside the registration definition. Existing values
|
|
2710
|
+
already typed as a registration contract remain usable; a builder cannot recover
|
|
2711
|
+
literal information that was widened before the call. Flag builders support
|
|
2712
|
+
`repeatable` and `value_validation`; schema builders include their supported
|
|
2713
|
+
`default`/`values` and item-type description/default-status fields. Scoped renderer
|
|
2714
|
+
and preflight object builders also retain literal command ownership while
|
|
2715
|
+
contextually typing their callbacks.
|
|
2640
2716
|
|
|
2641
2717
|
## Declarative Authoring
|
|
2642
2718
|
|
|
@@ -3289,6 +3365,27 @@ history and retains mutation governance.
|
|
|
3289
3365
|
|
|
3290
3366
|
## Robust Automation Pattern
|
|
3291
3367
|
|
|
3368
|
+
Native `PmClient.create`, `update`, and their generic `run` routes reject unknown
|
|
3369
|
+
option names at runtime, including JavaScript callers and injected extension
|
|
3370
|
+
clients ([pm-fl3phm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-fl3phm.toon),
|
|
3371
|
+
a repository-only tracker record excluded from npm). A typo such as
|
|
3372
|
+
`priorty` refuses the whole request with `PmCliError.code =
|
|
3373
|
+
"invalid_argument_value"`, `context.reason = "unknown_mutation_option"`, a
|
|
3374
|
+
nearest-name hint when available, and `context.changed = false`. Put mutation
|
|
3375
|
+
fields under `options` when using `run`; existing declared top-level aliases
|
|
3376
|
+
remain accepted. Workspace schema option identities remain available through
|
|
3377
|
+
`run`, while typed convenience methods support extension item fields through `field`.
|
|
3378
|
+
MCP retains its existing transport-specific admission contract. The no-change
|
|
3379
|
+
receipt applies to these preflight refusals; an executed operation's outcome
|
|
3380
|
+
and evidence must be assessed separately.
|
|
3381
|
+
|
|
3382
|
+
MCP create/update normalize their advertised mutation fields through the SDK and
|
|
3383
|
+
refuse malformed values atomically; see [MCP option conformance](MCP_OPTION_CONFORMANCE.md).
|
|
3384
|
+
Embedded hosts can use `readRuntimeFieldOptionValue(options, definition)` with
|
|
3385
|
+
definitions from `resolveRuntimeFieldRegistry(settings.schema)` to recognize the
|
|
3386
|
+
same project-field aliases as persistence. These helpers are exported from the
|
|
3387
|
+
aggregate SDK, so hosts can preserve customization without copying key mappings.
|
|
3388
|
+
|
|
3292
3389
|
1. Read `PM_TOOL_ACTIONS` or `PM_TOOL_PARAMETERS_SCHEMA` for baseline static validation.
|
|
3293
3390
|
2. Load runtime contracts with `getContracts(pmRoot, { runtimeOnly: true })` or run `pm contracts --runtime-only --json` inside the target project.
|
|
3294
3391
|
3. Verify the action appears in `actions` and has `action_availability[].invocable: true`.
|
package/docs/TESTING.md
CHANGED
|
@@ -56,6 +56,17 @@ policy-check budget. This allocation is tracked by
|
|
|
56
56
|
[pm-a3c6g4](../.agents/pm/tasks/pm-a3c6g4.toon); broader runner qualification
|
|
57
57
|
remains with [pm-bj7rq0](../.agents/pm/issues/pm-bj7rq0.toon).
|
|
58
58
|
|
|
59
|
+
The same serial cohort runs the ten-thousand-item aggregation, cold governance
|
|
60
|
+
read, and surface-replication fixture files after parallel contracts
|
|
61
|
+
([pm-ckb8w5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-ckb8w5.toon),
|
|
62
|
+
a repository-only tracker record excluded from npm). Their original input
|
|
63
|
+
populations, assertions, per-test deadlines and retry policy remain in force.
|
|
64
|
+
|
|
65
|
+
The context decision keeper also runs in that phase, preserving its 200-item
|
|
66
|
+
corpus and 30-second completion-regression deadline. Allocation is tracked by
|
|
67
|
+
[pm-j2vwbh](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-j2vwbh.toon)
|
|
68
|
+
(a repository-only tracker record excluded from npm).
|
|
69
|
+
|
|
59
70
|
`node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, disables
|
|
60
71
|
external Sentry delivery for the build, test workers, and their nested CLI
|
|
61
72
|
children, then cleans the roots up. Instrumentation tests can still exercise
|
|
@@ -567,6 +578,18 @@ the descriptor registry does not yet know about.
|
|
|
567
578
|
For in-place metadata corrections and context admission/refusal semantics, see
|
|
568
579
|
[Linked-test edits](LINKED_TEST_EDITS.md).
|
|
569
580
|
|
|
581
|
+
Run-option admission is tracked by
|
|
582
|
+
[pm-hdvxqg](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-hdvxqg.toon)
|
|
583
|
+
(a repository-only tracker record excluded from npm).
|
|
584
|
+
`pm test` requires `--run` for `--timeout`, `--progress`, execution context,
|
|
585
|
+
environment directives, and run selectors. Registration-only calls refuse these
|
|
586
|
+
options before saving links. Combined edits and execution validate the effective
|
|
587
|
+
post-edit selection under the item lock before persistence, including out-of-range
|
|
588
|
+
indexes and unmatched selectors. These admission errors carry `changed: false`
|
|
589
|
+
in structured output. A valid request that executes a failing child can still
|
|
590
|
+
save its accepted edits and execution evidence; inspect its run results before
|
|
591
|
+
retrying.
|
|
592
|
+
|
|
570
593
|
Add tests to the item that owns the work:
|
|
571
594
|
|
|
572
595
|
```bash
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":5,"transcript_version":2,"transcript_digest":"sha256:6d4041acfaa4075dde1972d6127a74f18916f7661738b4f5d5fd47a61c179a78","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":1087,"protocols":[{"task_id":"orientation-context-intent","command_count":1,"estimated_tokens":1087,"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":
|
|
1
|
+
{"version":5,"transcript_version":2,"transcript_digest":"sha256:6d4041acfaa4075dde1972d6127a74f18916f7661738b4f5d5fd47a61c179a78","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":1087,"protocols":[{"task_id":"orientation-context-intent","command_count":1,"estimated_tokens":1087,"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":2139,"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":5203,"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":1087,"steps":[{"id":"context","max_estimated_tokens":1087,"accounting_mode":"self_reported"}]},{"id":"orientation-contracts-next","max_estimated_tokens":5203,"steps":[{"id":"contracts","max_estimated_tokens":4481,"accounting_mode":"self_reported"},{"id":"next","max_estimated_tokens":722,"accounting_mode":"self_reported"}]},{"id":"orientation-operating-rules","max_estimated_tokens":2139,"steps":[{"id":"context","max_estimated_tokens":1087,"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":2077,"steps":[{"id":"triage","max_estimated_tokens":619,"accounting_mode":"self_reported"},{"id":"orient","max_estimated_tokens":1087,"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":812,"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":31,"accounting_mode":"self_reported"},{"id":"inspect-closed","max_estimated_tokens":398,"accounting_mode":"self_reported"}]},{"id":"bulk-effect-outcomes","max_estimated_tokens":326,"steps":[{"id":"create-bulk-target","max_estimated_tokens":20,"accounting_mode":"self_reported"},{"id":"partial-effect","max_estimated_tokens":174,"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":13676}
|
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.22","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.22","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.22","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"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-calendar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-calendar","version":"2026.10.22","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.22","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.22","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.22","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.22","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.22","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.22","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"]}}
|