@unbrained/pm-cli 2026.10.2 → 2026.10.4

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.
Files changed (104) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +31 -1
  3. package/dist/cli/error-guidance.js +1 -1
  4. package/dist/cli/runtime/invocation-options.js +1 -1
  5. package/dist/cli/runtime/selection.js +1 -1
  6. package/dist/cli/runtime-compatibility-boundary.d.ts +1 -1
  7. package/dist/cli/runtime-compatibility-boundary.js +3 -3
  8. package/dist/cli-bundle/bundle-manifest.json +149 -149
  9. package/dist/cli-bundle/chunks/{chunk-HY6M34B4.js → chunk-7CE2DJMA.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-WP6NRH72.js → chunk-7UVXKI7K.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-7FUEQOYG.js → chunk-D7Z2ZMJL.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-TRYXVQ7W.js → chunk-GZMWISWW.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-ZI7F3FVE.js → chunk-J52QIRRZ.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-R4TUD355.js → chunk-JDKD3WGG.js} +6 -6
  15. package/dist/cli-bundle/chunks/chunk-JQ7DW663.js +2 -0
  16. package/dist/cli-bundle/chunks/{chunk-SV7CZEVV.js → chunk-QXIDOOWT.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-XOUBIF6Z.js → chunk-SMKHR6BM.js} +49 -49
  18. package/dist/cli-bundle/chunks/{chunk-MTJMOI4I.js → chunk-V3U77H3V.js} +31 -31
  19. package/dist/cli-bundle/chunks/{chunk-Z2GYDSAO.js → chunk-XZDWAYJC.js} +2 -2
  20. package/dist/cli-bundle/chunks/{chunk-R7ULWMBG.js → chunk-Y6VRBTP3.js} +71 -71
  21. package/dist/cli-bundle/chunks/{chunk-CZLAWXDR.js → chunk-YAAFYFS4.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-list-query-R4PHNB7W.js → register-list-query-QBGXO5JJ.js} +2 -2
  23. package/dist/cli-bundle/chunks/{register-mutation-PDDAUDYV.js → register-mutation-53ZLT4RX.js} +2 -2
  24. package/dist/cli-bundle/chunks/{register-operations-A5HJT46K.js → register-operations-OBK2FXUU.js} +2 -2
  25. package/dist/cli-bundle/chunks/{register-setup-EZ2F25JI.js → register-setup-HM3OCBH2.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-FKK2HI3S.js → chunk-2JFYR56O.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/{chunk-UTRSM3ZK.js → chunk-32EVUSS4.js} +2 -2
  28. package/dist/cli-bundle/focused-chunks/{chunk-DBD4W4QP.js → chunk-467EW5RL.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/{chunk-IR4UXLRP.js → chunk-5GUSO2P4.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-GMYUNHST.js → chunk-6XBRADQQ.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-EJN7DY3B.js → chunk-7O4NUJVO.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-E754JDLY.js → chunk-CURTIIQT.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-4FFPGNCJ.js → chunk-IJUWEEEB.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-XRSCIYHR.js → chunk-JCVMOSWQ.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-ZIXFMIUL.js → chunk-JMJK2L4Z.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-WCY6HRZO.js → chunk-KG3H4UZZ.js} +14 -14
  37. package/dist/cli-bundle/focused-chunks/{chunk-VVWYI2X7.js → chunk-MHQ2XICU.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-3BIYG72P.js → chunk-Q6DJ5DFQ.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/{chunk-BLCTBSGT.js → chunk-RJV6QVJE.js} +26 -26
  40. package/dist/cli-bundle/focused-chunks/{chunk-GBD4EN6S.js → chunk-ZE2JZ7R6.js} +11 -11
  41. package/dist/cli-bundle/focused-chunks/chunk-ZLEN4HZD.js +165 -0
  42. package/dist/cli-bundle/main.js +22 -22
  43. package/dist/cli-bundle/sdk-authoring.js +1 -1
  44. package/dist/cli-bundle/sdk-contracts.js +1 -1
  45. package/dist/cli-bundle/sdk-core.js +31 -31
  46. package/dist/cli-bundle/sdk-governance.js +1 -1
  47. package/dist/cli-bundle/sdk-graph.js +1 -1
  48. package/dist/cli-bundle/sdk-merge.js +23 -23
  49. package/dist/cli-bundle/sdk-query.js +1 -1
  50. package/dist/cli-bundle/sdk-runtime.js +1 -1
  51. package/dist/cli-bundle/sdk-testing.js +1 -1
  52. package/dist/cli-bundle/sdk.js +1 -1
  53. package/dist/core/extensions/extension-types.d.ts +8 -1
  54. package/dist/core/extensions/extension-types.js +1 -1
  55. package/dist/core/shared/secret-rules.js +1 -1
  56. package/dist/core/shared/time.js +1 -1
  57. package/dist/core/store/settings.d.ts +11 -2
  58. package/dist/core/store/settings.js +2 -2
  59. package/dist/sdk/agent/subcommand-recovery.js +1 -1
  60. package/dist/sdk/cli-bootstrap.js +1 -1
  61. package/dist/sdk/context-intent-contracts.js +1 -1
  62. package/dist/sdk/extension-command-context.js +1 -1
  63. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  64. package/dist/sdk/item-transaction.js +1 -1
  65. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
  66. package/dist/sdk/lifecycle/task-composition.js +1 -1
  67. package/dist/sdk/linked-artifacts.d.ts +1 -1
  68. package/dist/sdk/linked-artifacts.js +1 -1
  69. package/dist/sdk/output-projection.js +1 -1
  70. package/dist/sdk/public-surface.json +1 -1
  71. package/dist/sdk/query/get.js +1 -1
  72. package/dist/sdk/query/search-pagination.d.ts +1 -1
  73. package/dist/sdk/query/search-pagination.js +1 -1
  74. package/dist/sdk/test/execution.js +2 -2
  75. package/dist/sdk/test/workspace-snapshot.d.ts +11 -0
  76. package/dist/sdk/test/workspace-snapshot.js +2 -0
  77. package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +109 -0
  78. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +25 -0
  79. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +23 -0
  80. package/docs/SDK_AUDITED_MUTATIONS.md +35 -0
  81. package/docs/TESTING.md +40 -5
  82. package/docs/ecosystem-review-2026-09-28.json +2864 -3157
  83. package/marketplace.json +2 -2
  84. package/package.json +5 -4
  85. package/packages/pm-beads/package.json +1 -1
  86. package/packages/pm-calendar/package.json +1 -1
  87. package/packages/pm-command-kit/package.json +1 -1
  88. package/packages/pm-digital-twin/package.json +1 -1
  89. package/packages/pm-governance-audit/package.json +1 -1
  90. package/packages/pm-guide-shell/package.json +1 -1
  91. package/packages/pm-kanban/package.json +1 -1
  92. package/packages/pm-lifecycle-hooks/package.json +1 -1
  93. package/packages/pm-linked-test-adapters/package.json +1 -1
  94. package/packages/pm-search-advanced/package.json +1 -1
  95. package/packages/pm-templates/package.json +1 -1
  96. package/packages/pm-todos/package.json +1 -1
  97. package/packages/pm-vcs/package.json +1 -1
  98. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  99. package/plugins/pm-claude/package.json +2 -2
  100. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  101. package/plugins/pm-codex/package.json +2 -2
  102. package/plugins/pm-codex/plugin.json +1 -1
  103. package/dist/cli-bundle/chunks/chunk-7NL3A2BY.js +0 -2
  104. package/dist/cli-bundle/focused-chunks/chunk-YC32ZSLS.js +0 -165
@@ -232,6 +232,29 @@ activity limits so the built-in orientation declaration remains feasible on a
232
232
  large tracker. All five intent commands accept the same
233
233
  `--token-budget` override. Explicit `--depth` and `--limit` controls still win.
234
234
 
235
+ Context omission instructions request the named section, for example
236
+ `--section files`, so they can be appended while retaining `--for handoff` or
237
+ `--for orient`. An explicit depth suppresses the intent's default section subset;
238
+ an explicit section remains authoritative at any depth. Workspace memory that
239
+ is already present is never reported as omitted. The original filters and token
240
+ budget remain binding; an oversized restoration reports its remaining budget
241
+ constraint. Tracked by [pm-gh1367](../.agents/pm/issues/pm-gh1367.toon).
242
+
243
+ For namespaced commands, options supplied on an ancestor apply only when the
244
+ selected leaf declares them. `context --tag urgent next` forwards the tag;
245
+ a leaf-supplied limit takes precedence. `context next --depth deep` and
246
+ `context --depth deep next` fail with `unknown_option`, because `next` does not
247
+ declare a depth projection. Inspect the leaf's help before applying context
248
+ controls to it. Tracked by [pm-gh1368](../.agents/pm/issues/pm-gh1368.toon).
249
+
250
+ Ownership compositions use the resolved canonical item ID in every stage and
251
+ the root receipt, including short-ID invocations. Default CLI/MCP start, pause,
252
+ and close receipts expose the final status and aggregate changed-field count
253
+ without repeating item bodies. `--full-changed-fields` and typed SDK methods
254
+ retain complete constituent results. A failed later step reports the canonical
255
+ item and prior durable mutation without implying rollback.
256
+ Tracked by [pm-gh1369](../.agents/pm/issues/pm-gh1369.toon).
257
+
235
258
  If a selected result exceeds its budget, long explanatory strings compact
236
259
  first, followed by deterministic root-row reduction that retains at least one
237
260
  useful row and reports `budget_row_compaction`. Only a result whose minimum
@@ -3,6 +3,7 @@
3
3
  The extension settings contract is tracked by
4
4
  [pm-wtqltn](../.agents/pm/issues/pm-wtqltn.toon). Full-item JSON annotation
5
5
  integrity is tracked by [pm-2589e6](../.agents/pm/issues/pm-2589e6.toon).
6
+ Canonical previews are tracked by [pm-2sef82](../.agents/pm/features/pm-2sef82.toon).
6
7
 
7
8
  ## Extension settings
8
9
 
@@ -36,10 +37,44 @@ the same operation ID can then be used for the real mutation. A normal return
36
37
  also reports `changed` and `dry_run`. Invalid results fail before writing, and
37
38
  a history-append failure restores the previous settings bytes. The callback
38
39
  must derive its complete next settings object from the locked `current` value.
40
+ The callback receives normalized inline settings with defaults and preset knobs
41
+ even when the source file is sparse. Returning that tree unchanged retains the
42
+ original source bytes, including unknown fields, without creating an audit event.
43
+ Changed writes apply known-setting changes to the captured source through the
44
+ standard serializer, preserving sparse omissions and unrecognized fields in
45
+ unchanged containers for forward compatibility. Those fields remain outside the
46
+ typed callback and canonical preview. Replacing an array replaces its complete
47
+ contents, as in normal settings writes. Present legacy values are canonicalized
48
+ on a changed write; an identity no-op still retains the original bytes.
49
+ The host also validates the final serialized bytes before committing, so a
50
+ proposal that changes while being serialized cannot persist invalid settings.
39
51
  The host applies the standard settings serializer, including legacy format
40
52
  coercion and collection-name sanitization, and runs active `onWrite` hooks
41
53
  after a changed write.
42
54
 
55
+ Request `includePreview: true` to receive an optional `preview` settings tree
56
+ alongside the receipt. The host resolves it from the exact serialized bytes
57
+ inside the audit lock, using the same defaults and governance presets as normal
58
+ settings reads. A named `minimal` preset therefore reports ownership `none`
59
+ even if the callback proposed `strict`. Custom presets retain their configured
60
+ knobs. Legacy formats and collection names reflect their canonical persisted
61
+ values. This tree describes inline settings before optional file-backed schema
62
+ overlays; it does not load or create those files.
63
+
64
+ Use `dryRun: true, includePreview: true` to inspect the result before applying
65
+ the same operation. A fresh no-op also includes its canonical tree. An idempotent
66
+ replay omits `preview`: the original callback is not re-executed, and later
67
+ settings changes cannot reconstruct its historical proposal. Receipts remain
68
+ three booleans when the option is absent. Direct SDK dry runs read configuration
69
+ without executing read hooks, scaffolding optional schemas, or populating the
70
+ hydrated settings cache. Mutation callbacks should only derive settings and
71
+ avoid external side effects.
72
+
73
+ For an extension that requires previews, set its manifest `pm_min_version` to
74
+ a published host release containing this option. Check for `preview` on a fresh
75
+ dry-run operation before applying settings, while allowing replay receipts to
76
+ omit it as described above.
77
+
43
78
  ## Full-item JSON updates
44
79
 
45
80
  `pm update <id> --stdin-json` accepts a full item read document. New comments,
package/docs/TESTING.md CHANGED
@@ -288,6 +288,8 @@ control and fails if `pm eval --fail-under` stops returning a non-zero exit.
288
288
  Refresh the baseline only with `pnpm quality:retrieval-eval:update` after
289
289
  reviewing query-level ranking changes.
290
290
 
291
+ Development tools must also pass the [development dependency security gate](DEVELOPMENT_DEPENDENCY_SECURITY.md), including the full audit and installed bundle integrity policy.
292
+
291
293
  ## Context Quality Evaluation
292
294
 
293
295
  The required context relevance gate proves that `pm context` and `pm next`
@@ -545,11 +547,44 @@ pm test <item-id> --run --workspace-context snapshot --override-linked-workspace
545
547
  declaration. Use it only for commands that do not require checkout files.
546
548
  - `snapshot` copies the workspace into the linked-test sandbox, runs from that
547
549
  copy, and binds its `.agents/pm` path to the selected temporary tracker.
548
- `.git`, `.agents`, `node_modules`, coverage output, and common cache
549
- directories are excluded at every directory depth; an existing top-level
550
- `node_modules` is linked read-only by convention. Built output remains
551
- available so linked commands such as `node dist/cli.js` keep working. Writes
552
- therefore land in the disposable snapshot rather than the source checkout.
550
+ `.git`, `.agents`, coverage output, and common cache directories are excluded
551
+ at every directory depth, with reserved names matched case-insensitively for
552
+ portable admission. Each existing root or nested `node_modules`
553
+ directory is linked at its original relative path, including installations
554
+ already represented by directory symlinks. This preserves independent
555
+ monorepo dependency versions without copying dependency trees. Dependency
556
+ aliases into excluded trees or included workspace source are refused. Internal
557
+ shared targets must remain within admitted `node_modules` subtrees; external
558
+ installations must be disjoint from the source workspace, rather than
559
+ containing it. They remain available even when an external ancestor shares an
560
+ excluded directory name.
561
+ Links are read-only **by convention**; they do not prevent a trusted command
562
+ from modifying the original installation. Use an independent installation
563
+ when testing package-manager operations or dependency writes. Built output
564
+ remains available so linked commands such as `node dist/cli.js` keep working.
565
+ The source workspace root is resolved before copying. Ordinary file and
566
+ directory symlinks into included workspace source are rebased into the copy,
567
+ including dangling file aliases; writes through those aliases stay in the
568
+ disposable snapshot. Targets are canonicalized through their nearest existing
569
+ ancestor, so absolute aliases through another workspace path spelling and
570
+ missing target suffixes retain the same isolation on supported platforms.
571
+ Source aliases into unadmitted external directories or excluded tracker/build
572
+ trees fail before the linked command runs. An alias into an admitted shared
573
+ dependency namespace retains the dependency-write convention above, including
574
+ packages linked within that installation. Source and snapshot destinations
575
+ must be physically disjoint; overlapping roots fail before copying with a
576
+ diagnostic directing the caller to a temporary root outside the checkout.
577
+
578
+ Snapshot target probes treat only `ENOENT` as absence and propagate other
579
+ filesystem failures. They use explicit error handling so Node 22 and older
580
+ Node 24 releases retain the same dangling-link behavior; the async `stat`
581
+ `throwIfNoEntry` option was added in
582
+ [Node 24.15](https://nodejs.org/download/release/v24.20.0/docs/api/fs.html#fspromisesstatpath-options).
583
+ The real filesystem and CLI snapshot suite runs in the required Node 22
584
+ telemetry regression job and native Windows regression job before merge.
585
+
586
+ The real-filesystem regression for this contract is tracked by
587
+ [pm-5iwfkj](../.agents/pm/issues/pm-5iwfkj.toon).
553
588
 
554
589
  Every result reports the requested/effective workspace mode, working
555
590
  directory, exposed source root, and trust decision. Recorded `test_runs` retain