@unbrained/pm-cli 2026.8.16 → 2026.8.18

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 (225) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +4 -3
  3. package/CHANGELOG.md +65 -6
  4. package/README.md +16 -16
  5. package/dist/cli/error-guidance.js +7 -4
  6. package/dist/cli/public.d.ts +2 -0
  7. package/dist/cli/public.js +21 -0
  8. package/dist/cli/register-list-query.js +132 -51
  9. package/dist/cli/register-mutation.js +4 -4
  10. package/dist/cli-bundle/bundle-manifest.json +148 -148
  11. package/dist/cli-bundle/chunks/chunk-5UZZAJKR.js +3 -0
  12. package/dist/cli-bundle/chunks/chunk-ALDJGKAK.js +2 -0
  13. package/dist/cli-bundle/chunks/chunk-BSK2IN3C.js +8 -0
  14. package/dist/cli-bundle/chunks/chunk-DY4DMUMC.js +197 -0
  15. package/dist/cli-bundle/chunks/{chunk-73UGEBRS.js → chunk-GNFAFIJI.js} +10 -10
  16. package/dist/cli-bundle/chunks/chunk-L5Q2CLPE.js +35 -0
  17. package/dist/cli-bundle/chunks/{chunk-RIS565OA.js → chunk-PVRUN5ZS.js} +5 -5
  18. package/dist/cli-bundle/chunks/chunk-RZQTVMRQ.js +2 -0
  19. package/dist/cli-bundle/chunks/chunk-SARFF5H5.js +3 -0
  20. package/dist/cli-bundle/chunks/chunk-UYCLQVL2.js +13 -0
  21. package/dist/cli-bundle/chunks/{chunk-URW4QRMI.js → chunk-YRGOLZA7.js} +59 -55
  22. package/dist/cli-bundle/chunks/register-list-query-I23LALEE.js +11 -0
  23. package/dist/cli-bundle/chunks/register-mutation-6YGU3GPH.js +20 -0
  24. package/dist/cli-bundle/chunks/{register-operations-KGDNRMCL.js → register-operations-4HTFC6J7.js} +2 -2
  25. package/dist/cli-bundle/chunks/{register-setup-NVXBOD5I.js → register-setup-PPPEF3SN.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/chunk-2PN4TJXH.js +2 -0
  27. package/dist/cli-bundle/focused-chunks/{chunk-C7JUBRFP.js → chunk-3TKWMNKF.js} +3 -3
  28. package/dist/cli-bundle/focused-chunks/chunk-5AF3ZBNB.js +155 -0
  29. package/dist/cli-bundle/focused-chunks/chunk-C5IW2NDA.js +2 -0
  30. package/dist/cli-bundle/focused-chunks/{chunk-CODV5LUT.js → chunk-EUEGXZ2A.js} +3 -3
  31. package/dist/cli-bundle/focused-chunks/{chunk-4JPEBFFC.js → chunk-EX6MKP2X.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-SSNDYZTM.js → chunk-K43KKAFS.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-6ROKKT4X.js → chunk-M62NO7EI.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-T46KLOIB.js → chunk-ODOVCP45.js} +47 -47
  35. package/dist/cli-bundle/focused-chunks/chunk-RNDNMARJ.js +16 -0
  36. package/dist/cli-bundle/focused-chunks/chunk-TN4AE665.js +26 -0
  37. package/dist/cli-bundle/focused-chunks/chunk-TVV2DONO.js +2 -0
  38. package/dist/cli-bundle/focused-chunks/chunk-UI6AJ5TD.js +4 -0
  39. package/dist/cli-bundle/focused-chunks/chunk-V5XTGLK7.js +2 -0
  40. package/dist/cli-bundle/focused-chunks/chunk-WGHQVU6P.js +2 -0
  41. package/dist/cli-bundle/focused-chunks/chunk-XYNBXTDQ.js +2 -0
  42. package/dist/cli-bundle/focused-chunks/chunk-Z56ECT7I.js +2 -0
  43. package/dist/cli-bundle/main.js +7 -7
  44. package/dist/cli-bundle/sdk-authoring.js +1 -1
  45. package/dist/cli-bundle/sdk-contracts.js +1 -1
  46. package/dist/cli-bundle/sdk-core.js +31 -31
  47. package/dist/cli-bundle/sdk-governance.js +1 -1
  48. package/dist/cli-bundle/sdk-graph.js +1 -1
  49. package/dist/cli-bundle/sdk-merge.js +32 -32
  50. package/dist/cli-bundle/sdk-query.js +1 -1
  51. package/dist/cli-bundle/sdk-runtime.js +1 -1
  52. package/dist/cli-bundle/sdk-testing.js +1 -1
  53. package/dist/cli-bundle/sdk.js +4 -2
  54. package/dist/core/config/nested-settings.js +8 -2
  55. package/dist/core/extensions/exporter-output-contract.d.ts +12 -0
  56. package/dist/core/extensions/exporter-output-contract.js +67 -0
  57. package/dist/core/extensions/extension-types.d.ts +36 -1
  58. package/dist/core/extensions/extension-types.js +2 -2
  59. package/dist/core/extensions/loader.js +43 -48
  60. package/dist/core/extensions/manifest-schema.d.ts +20 -0
  61. package/dist/core/extensions/manifest-schema.js +52 -0
  62. package/dist/core/history/event-index.d.ts +5 -0
  63. package/dist/core/history/event-index.js +133 -27
  64. package/dist/core/history/replay.js +32 -14
  65. package/dist/core/schema/fields-file.d.ts +1 -1
  66. package/dist/core/schema/fields-file.js +2 -2
  67. package/dist/core/schema/runtime-field-values.js +115 -9
  68. package/dist/core/schema/runtime-schema.d.ts +3 -1
  69. package/dist/core/schema/runtime-schema.js +124 -3
  70. package/dist/core/sentry/helpers.js +3 -3
  71. package/dist/core/shared/constants.js +5 -2
  72. package/dist/core/shared/errors.d.ts +10 -0
  73. package/dist/core/shared/errors.js +2 -2
  74. package/dist/core/shared/time.d.ts +2 -0
  75. package/dist/core/shared/time.js +27 -2
  76. package/dist/core/store/settings-validator.d.ts +4 -0
  77. package/dist/core/store/settings-validator.js +3 -2
  78. package/dist/core/store/settings.js +8 -2
  79. package/dist/mcp/tool-definitions.js +12 -7
  80. package/dist/sdk/agent/refusal-reachability.d.ts +46 -6
  81. package/dist/sdk/agent/refusal-reachability.js +350 -8
  82. package/dist/sdk/authoring.d.ts +1 -1
  83. package/dist/sdk/authoring.js +2 -2
  84. package/dist/sdk/cli-bootstrap.d.ts +2 -2
  85. package/dist/sdk/cli-bootstrap.js +4 -4
  86. package/dist/sdk/cli-contracts/command-aliases.d.ts +34 -2
  87. package/dist/sdk/cli-contracts/command-aliases.js +64 -13
  88. package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -0
  89. package/dist/sdk/cli-contracts/enum-contracts.js +9 -2
  90. package/dist/sdk/cli-contracts/flag-contracts.js +11 -7
  91. package/dist/sdk/cli-contracts/grammar-contracts.d.ts +70 -0
  92. package/dist/sdk/cli-contracts/grammar-contracts.js +345 -0
  93. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +19 -2
  94. package/dist/sdk/cli-contracts/runtime-contracts.js +61 -14
  95. package/dist/sdk/cli-contracts/tool-parameter-tables.js +10 -4
  96. package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
  97. package/dist/sdk/cli-contracts/tool-schema.js +20 -11
  98. package/dist/sdk/cli-contracts.d.ts +2 -2
  99. package/dist/sdk/cli-contracts.js +4 -4
  100. package/dist/sdk/completion.js +13 -15
  101. package/dist/sdk/compose.d.ts +9 -5
  102. package/dist/sdk/compose.js +33 -3
  103. package/dist/sdk/context-intent-contracts.d.ts +8 -4
  104. package/dist/sdk/context-intent-contracts.js +76 -31
  105. package/dist/sdk/contracts.d.ts +1 -0
  106. package/dist/sdk/contracts.js +3 -2
  107. package/dist/sdk/core.d.ts +1 -1
  108. package/dist/sdk/core.js +3 -3
  109. package/dist/sdk/dependency-flag-validation.d.ts +9 -2
  110. package/dist/sdk/dependency-flag-validation.js +101 -35
  111. package/dist/sdk/environment/host-environment-errors.js +25 -7
  112. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +78 -14
  113. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +62 -14
  114. package/dist/sdk/governance/assurance-action.d.ts +3 -7
  115. package/dist/sdk/governance/assurance-action.js +97 -2
  116. package/dist/sdk/governance/boundary-fixtures.d.ts +86 -0
  117. package/dist/sdk/governance/boundary-fixtures.js +201 -0
  118. package/dist/sdk/governance/defect-recurrence-signals.d.ts +10 -0
  119. package/dist/sdk/governance/defect-recurrence-signals.js +25 -0
  120. package/dist/sdk/governance/defect-recurrence.d.ts +242 -0
  121. package/dist/sdk/governance/defect-recurrence.js +523 -0
  122. package/dist/sdk/governance.d.ts +2 -0
  123. package/dist/sdk/governance.js +4 -2
  124. package/dist/sdk/graph/governance.js +3 -2
  125. package/dist/sdk/guide-topics.js +193 -4
  126. package/dist/sdk/index.d.ts +7 -3
  127. package/dist/sdk/index.js +8 -5
  128. package/dist/sdk/init-agent-guidance.js +3 -3
  129. package/dist/sdk/lifecycle/create.js +4 -2
  130. package/dist/sdk/lifecycle/update-many.js +15 -2
  131. package/dist/sdk/lifecycle/update.js +5 -2
  132. package/dist/sdk/linked-artifacts.js +63 -14
  133. package/dist/sdk/mutation-events.d.ts +18 -2
  134. package/dist/sdk/mutation-events.js +59 -16
  135. package/dist/sdk/output.d.ts +44 -0
  136. package/dist/sdk/output.js +28 -2
  137. package/dist/sdk/query/complete-list.d.ts +94 -0
  138. package/dist/sdk/query/complete-list.js +173 -0
  139. package/dist/sdk/query/get.d.ts +2 -0
  140. package/dist/sdk/query/get.js +32 -7
  141. package/dist/sdk/query/list.js +5 -2
  142. package/dist/sdk/query.d.ts +1 -0
  143. package/dist/sdk/query.js +3 -2
  144. package/dist/sdk/read-output-contracts.d.ts +2 -2
  145. package/dist/sdk/read-output-contracts.js +36 -9
  146. package/dist/sdk/relationship-analytics.js +90 -14
  147. package/dist/sdk/relationship-kinds/contract.d.ts +4 -0
  148. package/dist/sdk/relationship-kinds/contract.js +3 -2
  149. package/dist/sdk/relationships.d.ts +1 -1
  150. package/dist/sdk/relationships.js +11 -2
  151. package/dist/sdk/runtime-extended-actions.js +10 -2
  152. package/dist/sdk/runtime.d.ts +8 -2
  153. package/dist/sdk/runtime.js +11 -8
  154. package/dist/sdk/schema.d.ts +1 -0
  155. package/dist/sdk/schema.js +2 -2
  156. package/dist/sdk/test/execution.d.ts +6 -2
  157. package/dist/sdk/test/execution.js +39 -13
  158. package/dist/types.d.ts +34 -2
  159. package/dist/types.js +4 -2
  160. package/docs/AGENT_GUIDE.md +25 -9
  161. package/docs/CLI_GRAMMAR.md +106 -0
  162. package/docs/COMMANDS.md +23 -23
  163. package/docs/CONFIGURATION.md +58 -1
  164. package/docs/CONTEXT_INTEGRITY_CONTRACTS.md +58 -0
  165. package/docs/DEFECT_RECURRENCE.md +134 -0
  166. package/docs/DEPENDENCY_KIND_CONTRACT.md +12 -2
  167. package/docs/ONBOARDING.md +4 -4
  168. package/docs/QUICKSTART.md +1 -1
  169. package/docs/README.md +4 -0
  170. package/docs/RELATIONSHIP_GRAPH.md +16 -2
  171. package/docs/RELEASING.md +30 -6
  172. package/docs/SDK.md +74 -7
  173. package/docs/SDK_ARTIFACT_OUTPUT.md +72 -0
  174. package/docs/SDK_CONTEXT_COORDINATION.md +46 -12
  175. package/docs/SDK_RUNTIME_BOUNDARIES.md +9 -1
  176. package/docs/TESTING.md +18 -1
  177. package/docs/TRUSTWORTHY_CONTEXT_EVIDENCE.md +1 -1
  178. package/docs/agent-task-token-baseline.json +5 -5
  179. package/marketplace.json +2 -2
  180. package/package.json +8 -5
  181. package/packages/pm-beads/package.json +1 -1
  182. package/packages/pm-calendar/package.json +1 -1
  183. package/packages/pm-command-kit/package.json +1 -1
  184. package/packages/pm-digital-twin/package.json +1 -1
  185. package/packages/pm-governance-audit/package.json +1 -1
  186. package/packages/pm-guide-shell/package.json +1 -1
  187. package/packages/pm-kanban/package.json +1 -1
  188. package/packages/pm-lifecycle-hooks/package.json +1 -1
  189. package/packages/pm-linked-test-adapters/package.json +1 -1
  190. package/packages/pm-search-advanced/package.json +1 -1
  191. package/packages/pm-templates/package.json +1 -1
  192. package/packages/pm-todos/package.json +1 -1
  193. package/packages/pm-vcs/package.json +1 -1
  194. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  195. package/plugins/pm-claude/skills/pm-audit/SKILL.md +26 -0
  196. package/plugins/pm-claude/skills/pm-developer/SKILL.md +26 -0
  197. package/plugins/pm-claude/skills/pm-planner/SKILL.md +26 -0
  198. package/plugins/pm-claude/skills/pm-release/SKILL.md +26 -0
  199. package/plugins/pm-claude/skills/pm-workflow/SKILL.md +26 -0
  200. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  201. package/plugins/pm-codex/skills/pm-auditor/SKILL.md +26 -0
  202. package/plugins/pm-codex/skills/pm-native/SKILL.md +26 -0
  203. package/plugins/pm-codex/skills/pm-release/SKILL.md +26 -0
  204. package/sdk/public-surface.json +1243 -54
  205. package/dist/cli-bundle/chunks/chunk-47OQEOQB.js +0 -2
  206. package/dist/cli-bundle/chunks/chunk-HCIYWD6M.js +0 -35
  207. package/dist/cli-bundle/chunks/chunk-I2LUWWR5.js +0 -3
  208. package/dist/cli-bundle/chunks/chunk-IC5W2T34.js +0 -2
  209. package/dist/cli-bundle/chunks/chunk-OAC5NIV4.js +0 -3
  210. package/dist/cli-bundle/chunks/chunk-PANOOBIS.js +0 -13
  211. package/dist/cli-bundle/chunks/chunk-TK6N7HGM.js +0 -8
  212. package/dist/cli-bundle/chunks/chunk-TOFG2URD.js +0 -197
  213. package/dist/cli-bundle/chunks/register-list-query-EYCXHZAG.js +0 -10
  214. package/dist/cli-bundle/chunks/register-mutation-7YVIG54J.js +0 -20
  215. package/dist/cli-bundle/focused-chunks/chunk-5NMFSX26.js +0 -155
  216. package/dist/cli-bundle/focused-chunks/chunk-725JSCMP.js +0 -2
  217. package/dist/cli-bundle/focused-chunks/chunk-DQ6SMTBF.js +0 -2
  218. package/dist/cli-bundle/focused-chunks/chunk-HAACPSUW.js +0 -2
  219. package/dist/cli-bundle/focused-chunks/chunk-J4UFYHOD.js +0 -2
  220. package/dist/cli-bundle/focused-chunks/chunk-JX5Z344Q.js +0 -2
  221. package/dist/cli-bundle/focused-chunks/chunk-L4RDYBIQ.js +0 -2
  222. package/dist/cli-bundle/focused-chunks/chunk-NJ5RLEFD.js +0 -26
  223. package/dist/cli-bundle/focused-chunks/chunk-QYZERYR5.js +0 -4
  224. package/dist/cli-bundle/focused-chunks/chunk-TZATVC4G.js +0 -16
  225. package/dist/cli-bundle/focused-chunks/chunk-WY3WRPVN.js +0 -2
package/docs/SDK.md CHANGED
@@ -42,6 +42,14 @@ semantic command discovery, and append-stable linked tests are tracked by
42
42
  [pm-st7wgu](../.agents/pm/issues/pm-st7wgu.toon),
43
43
  [pm-g543](../.agents/pm/issues/pm-g543.toon), and
44
44
  [pm-x2vx](../.agents/pm/issues/pm-x2vx.toon).
45
+ The supported CLI entrypoint boundary, truthful context-intent receipts, and
46
+ first-class recurrence relationships are tracked by
47
+ [pm-rf120g](../.agents/pm/tasks/pm-rf120g.toon),
48
+ [pm-3crymx](../.agents/pm/issues/pm-3crymx.toon), and
49
+ [pm-ouyq3n](../.agents/pm/issues/pm-ouyq3n.toon).
50
+ Fail-closed whole-corpus reads and package-catalog output controls are tracked by
51
+ [pm-y4aaol](../.agents/pm/issues/pm-y4aaol.toon) and
52
+ [pm-2firut](../.agents/pm/issues/pm-2firut.toon).
45
53
 
46
54
  Use it for extension authoring, package authoring, command/action contract discovery, and deterministic app or CI automation. Do not import private `src/core/...` modules from external integrations or packages.
47
55
 
@@ -90,8 +98,14 @@ barrel remains source-compatible:
90
98
  | `@unbrained/pm-cli/sdk/public-surface.json` | Published machine-readable SDK compatibility snapshot |
91
99
  | `@unbrained/pm-cli/sdk` | Compatibility aggregate containing every supported SDK export |
92
100
 
93
- `@unbrained/pm-cli/cli` remains the runtime CLI module entrypoint for package
94
- resolution, not a typed library API. The committed
101
+ `@unbrained/pm-cli/cli` is the supported embeddable CLI entrypoint and exports
102
+ only `runPmCli`. Repository tests import their internal seams from source; those
103
+ helpers are not package API. The surface snapshot records the subpath under the
104
+ `executable_entry` classification, so any future exposure is a classified
105
+ surface change. The bare
106
+ `@unbrained/pm-cli` root export is recorded as an `aggregate_alias` of
107
+ `@unbrained/pm-cli/sdk`: its symbols are not duplicated, but a retarget of its
108
+ declaration path is a snapshot change. The committed
95
109
  [entrypoint import-cost table](performance/sdk-entrypoint-import-costs.md)
96
110
  records fresh-process latency, RSS, and reduction versus the aggregate barrel.
97
111
  Every narrow entrypoint is bundled and type-tested independently.
@@ -137,6 +151,12 @@ from every non-testing SDK subpath must be available from
137
151
  Consumers and release tooling can read the exact shipped artifact from
138
152
  `@unbrained/pm-cli/sdk/public-surface.json` without locating repository files.
139
153
 
154
+ The denominator is the package export map itself, not a list inside the
155
+ generator. Every `exports` entry that declares a `types` path must carry a
156
+ classification, and `pnpm sdk:surface:check` refuses to run while any published
157
+ code export is unclassified — so adding a public entrypoint cannot ship it
158
+ ungoverned.
159
+
140
160
  ## Public Exports
141
161
 
142
162
  Source of truth:
@@ -182,6 +202,7 @@ Source of truth:
182
202
  - [`src/sdk/merge/index.ts`](../src/sdk/merge/index.ts)
183
203
  - [`src/sdk/workspace-transaction-gc.ts`](../src/sdk/workspace-transaction-gc.ts)
184
204
  - [`src/sdk/query/list.ts`](../src/sdk/query/list.ts)
205
+ - [`src/sdk/query/complete-list.ts`](../src/sdk/query/complete-list.ts)
185
206
  - [`src/sdk/query/search.ts`](../src/sdk/query/search.ts)
186
207
  - [`src/sdk/query/search-pagination.ts`](../src/sdk/query/search-pagination.ts)
187
208
  - [`src/sdk/query/search-rendering.ts`](../src/sdk/query/search-rendering.ts)
@@ -275,7 +296,7 @@ Storage format-version exports (under `@unbrained/pm-cli/sdk/runtime`):
275
296
  Command/action contract exports:
276
297
 
277
298
  - `PmClient` / `runAction` (high-level in-process action execution for custom tools, bots, CI, and embedded runtimes)
278
- - Typed read primitives on `PmClient`: `get` (including `GetOptions.at` point-in-time reads), `list`, `search`, `context`, `next`, `aggregate`, `stats`, and `duplicates`; direct `getItemAt` reconstructs a canonical historical document without mutation. `duplicates` performs one bounded all-status metadata sweep and returns deterministic canonical-candidate and close-command guidance without mutating items.
299
+ - Typed read primitives on `PmClient`: `get` (including `GetOptions.at` point-in-time reads), `list`, `listAllComplete`, `search`, `context`, `next`, `aggregate`, `stats`, and `duplicates`; direct `getItemAt` reconstructs a canonical historical document without mutation. `listAllComplete` forces an all-status, full, strict, unbounded read and fails closed unless the returned envelope proves source completeness, unique ids, exact counts, no pagination, no field or budget omission, and no session projection. `duplicates` performs one bounded all-status metadata sweep and returns deterministic canonical-candidate and close-command guidance without mutating items.
279
300
  - Read primitive option/result contracts: `GetOptions` / `GetResult`, `ListOptions` / `ListResult`, `SearchOptions` / `SearchResult`, `ContextOptions` / `ContextResult`, `NextOptions` / `NextResult`, `AggregateOptions` / `AggregateResult`, `StatsCommandOptions` / `StatsResult`. Standard and brief `get` projections omit note bodies but expose `item.notes_count`; deep/full reads return the notes themselves, and narrow consumers can request `notes_count` explicitly.
280
301
  - Stream projection primitive: `serializeNdjsonRows` frames SDK-owned object rows as newline-delimited JSON without a trailing newline and rejects scalar/array rows, so package transports can match list/search/context CLI semantics without importing presentation code.
281
302
  - Context relevance primitives: `buildItemContextRelevanceCandidates`, `buildContextSignalSnapshot`, `ContextSignalStore`, `JsonFileContextSignalStoreAdapter`, `parseContextSignalSnapshot`, `defaultScoreContextCandidates`, `scoreContextCandidates`, `scoreContextCandidatesWithActiveExtensions`, `evaluateContextRanking`, `runContextEvaluationScenario`, `runContextEvaluationCorpus`, and `summarizeContextEvaluationReports`
@@ -301,6 +322,7 @@ Command/action contract exports:
301
322
  - Actionability primitives: `collectBlockedByIds`, `resolveItemBlockers`, `collectDependencyBlockedIds`, and `computeActionabilityReport` expose the same edge-aware blocked/ready definition used by `pm next`, `pm context`, and `pm list-blocked`. Embedded schedulers can therefore classify custom lifecycle schemas without importing CLI or core modules.
302
323
  - Dependency-governance primitives: `collectDanglingDependencyReferences`, `collectMissingDependencyTargetIds`, and `assembleWorkspaceRelationshipGraph` normalize hierarchy, scalar blockers, and structured dependencies into one graph while partitioning missing targets into actionable active holders, informational terminal-history holders, and the legacy `no-active-blocker` sentinel without mutating stored history.
303
324
  - Relationship graph primitives: `RelationshipKindRegistry`, `createRelationshipKindRegistry`, `assertRelationshipEdgeAllowed`, `RelationshipGraph`, `RelationshipEventLog`, `RelationshipEventStore`, `planRelationshipEventBackfill`, `buildRelationshipContext`, `buildDepsRelationshipContext`, `hierarchyAncestors`, `hierarchyDescendants`, `orderingPredecessors`, `orderingSuccessors`, `enumerateRelationshipPaths`, `auditWorkspaceRelationshipGraph`, `isOrderingRelationshipKind`, and `dependencyToRelationship` provide application-defined edge semantics, durable replay, deterministic legacy migration, bounded semantic traversal, policy-aware governance, and explainable context queries. Mutation adapters should call `assertRelationshipEdgeAllowed` with the active registry before persistence; it resolves aliases and honors custom `allowSelf` definitions while built-in self edges fail before item or history writes. `RelationshipEventLog.stream/project` and their durable-store equivalents page immutable prefixes and fold them into deterministic application state with exact version, processed-count, and as-of metadata. `RelationshipEventStore.appendBatch` validates a complete import under one cross-process lock and atomically publishes it; `skip_identical` resume mode rejects same-id semantic collisions. `RelationshipGraphAdapter`, `createRelationshipGraphSnapshot`, `syncRelationshipGraphAdapter`, `loadRelationshipGraphAdapter`, and `federateRelationshipGraphSnapshots` form the backend-neutral content-addressed projection boundary for database or remote graph packages. `MemoryRelationshipGraphAdapter`, `assertRelationshipGraphAdapterConformance`, and `createRelationshipGraphScaleFixture` give package authors a reference implementation, reusable compatibility contract, and lazy deterministic fixtures through one million nodes. See [Relationship graph semantics](RELATIONSHIP_GRAPH.md).
325
+ - Built-in `recurs_from` records that the source is a later occurrence of the target. Its registry contract is directed, `source_after_target`, non-ordering, many-to-many, and persistent across terminal lifecycle states. Local mutation paths enforce strictly later source `created_at` metadata before item or history persistence and return structured source/target evidence when chronology is equal, reversed, or unverifiable. It therefore connects an incident family for traversal and analytics without reclassifying `supersedes` replacements or `duplicate_of` identity collapse.
304
326
  - Atomic application transactions: `commitWorkspaceTransaction` coordinates ordered, idempotent item and relationship mutations under one workspace writer lock and a durable replay journal. Interrupted work resumes from step inspection; ordinary failures append reverse-order compensations without rewriting immutable histories.
305
327
  - Multi-branch merge primitives: `mergeItemDocuments`, `mergeHistoryStreams`, `mergeRelationshipEventStreams`, `mergeJsonDocuments`, `runMergeDriver`, `runMergeInstall`, and `runMergeReconcile` provide the same field-aware item, hash-chain-preserving history, sequence-renumbering relationship-event, key-level configuration, and audited post-merge repair-and-verify semantics as `pm merge`; `installMergeFence` and `findGitWorkspaceRoot` let custom init hosts install the same contract with explicit roots, while `buildMergeAttributePatterns`, `refreshMergeAttributeFenceIfInstalled`, and `auditMergeAttributeFence` expose fence coverage, refresh, and validation. See [Multi-Branch Merge Safety](MERGE_SAFETY.md).
306
328
  - Dependency provenance primitives: `EXTERNAL_DEPENDENCY_SOURCE_KIND`, `EXTERNAL_DEPENDENCY_SOURCE_KIND_ALIAS`, `isExternalDependencySourceKind`, and `normalizeDependencySeedId` let custom importers preserve cross-workspace dependency ids explicitly while retaining local prefix normalization for ordinary seeds. `source_kind: "external"` is the human-facing alias and persists canonically as `global`; a `blocked_by` row with that provenance is a real external predecessor, so graph governance does not require a fabricated local item or misreport `stale_lifecycle_block`. Newly created dependency rows also carry the effective `author`, `author_source` (`asserted` or `detected`), and a mutation `source_kind`; legacy rows remain readable without invented provenance. Tracked by [pm-6sc8jq](../.agents/pm/issues/pm-6sc8jq.toon).
@@ -348,9 +370,10 @@ rendering stay at the edge.
348
370
  Embedded hosts can also import the SDK-owned bootstrap normalization primitives
349
371
  (`normalizeBootstrapInvocation`, `parseBootstrapGlobalOptions`, and related
350
372
  contracts) when they intentionally expose pm-compatible argv. Every
351
- `runPmCli()` call constructs a fresh Commander graph, so extension commands,
352
- extension flags, and runtime schema options from one workspace cannot leak into
353
- the next in-process invocation.
373
+ `runPmCli()` call constructs a fresh Commander graph and restores the host's
374
+ existing `process.exitCode` after both successful and failed invocations, so
375
+ extension state and CLI exit state from one workspace cannot leak into the next
376
+ in-process invocation.
354
377
 
355
378
  ### Build a non-PM temporal domain
356
379
 
@@ -653,6 +676,20 @@ representative medium-workspace answers use the live
653
676
  negative control: the gate fails unless that deliberately unsafe request
654
677
  exceeds the default contract.
655
678
 
679
+ Named read intents additionally return `context_intent`. The receipt separates
680
+ the declaration (`declared_token_budget`) from the effective ceiling
681
+ (`token_budget`) and reports their signed `token_budget_override`. Row-oriented
682
+ reads clamp an explicit limit to the budget-derived ceiling and identify the
683
+ binding constraint. `declaration_feasible` evaluates the useful projection
684
+ against the declared ceiling independently of whether a lower or higher caller
685
+ override is effective. `within_budget` evaluates that same projection against
686
+ the effective `token_budget`, so it can legitimately differ from declaration
687
+ feasibility. If even compacted useful output cannot fit,
688
+ `result_omitted` is true, `estimated_tokens` retains the measured pre-omission
689
+ size (and is therefore greater than `token_budget`), and
690
+ `budget_exceeded.restore_with` is an executable bounded retry rather than a
691
+ generic suggestion.
692
+
656
693
  Unfiltered `pm contracts` now selects the summary projection by default. It
657
694
  returns canonical commands, terse intents, the most useful flags for the core
658
695
  agent loop, per-command ceilings, and the shared output policy. Use
@@ -1435,6 +1472,10 @@ helpers return `ExtensionCommandResult`; both names describe the same lifecycle
1435
1472
  payload shape with vocabulary-appropriate SDK signatures. `UpgradeResult` is the
1436
1473
  same structured payload rendered by the CLI, so embedded tools can own their
1437
1474
  presentation layer while sharing pm's package/install/doctor semantics.
1475
+ `packageCatalog` is a read surface and accepts the universal output controls;
1476
+ the CLI-equivalent `pm --output-budget unbounded package --catalog --json`
1477
+ therefore composes with the same output contract while catalog-plus-mutation
1478
+ invocations fail before any package state can change.
1438
1479
 
1439
1480
  Annotation and relationship convenience methods turn "project management =
1440
1481
  context management" into a typed SDK surface. Use `pm.comments`, `pm.notes`,
@@ -1543,9 +1584,35 @@ compact or `fields` projections return `ListProjectedItem` dictionaries. Use
1543
1584
  a `partial` scan with unreadable item/directory counts, and an `unchecked`
1544
1585
  derived-index page. Set `ListOptions.strictRead` (CLI `--strict-read`) when an
1545
1586
  automation must fail instead of accepting omissions.
1546
- `full: true` when an integration requires complete item metadata; the overload
1587
+ Use `full: true` when an integration requires complete item metadata; the overload
1547
1588
  then returns `ListFullResult` without an assertion or cast.
1548
1589
 
1590
+ When correctness depends on the entire workspace rather than a page, use the
1591
+ certifying primitive instead of rebuilding these conditions at every call site:
1592
+
1593
+ ```ts
1594
+ import {
1595
+ PmClient,
1596
+ certifyCompleteListResult,
1597
+ createCompleteListOptions,
1598
+ } from "@unbrained/pm-cli/sdk/runtime";
1599
+
1600
+ const pm = new PmClient({ pmRoot: "/workspace/.agents/pm" });
1601
+ const corpus = await pm.listAllComplete({ includeBody: true });
1602
+ corpus.complete_list.source_complete; // true, otherwise the call throws
1603
+
1604
+ // Custom transports can apply the same request and certificate independently.
1605
+ const candidate = await pm.list(createCompleteListOptions());
1606
+ const certified = certifyCompleteListResult(candidate);
1607
+ ```
1608
+
1609
+ `PmCompleteListValidationError.receipt` lists every failed invariant and carries
1610
+ the exact recovery command
1611
+ `pm list-all --full --strict-read --no-truncate --output-budget unbounded --json`.
1612
+ The helper never infers completeness from a large limit: derived-index reads,
1613
+ terminal-state filtering, duplicate ids, cursor/session projection, compaction,
1614
+ and any omission receipt all prevent certification.
1615
+
1549
1616
  CLI JSON consumers can add `--lean` to compact null and empty values. On
1550
1617
  item-list envelopes, lean output also removes request echoes (`filters`, `now`,
1551
1618
  `projection`, and `sorting`) and removes `next_cursor` when `has_more` is not
@@ -0,0 +1,72 @@
1
+ # SDK artifact output contracts
2
+
3
+ Trackers: [pm-dilou2](../.agents/pm/issues/pm-dilou2.toon) and [pm-mav1ak](../.agents/pm/features/pm-mav1ak.toon).
4
+
5
+ Exporter artifacts are data streams, not command receipts. A package declares
6
+ the channel when it registers an exporter so the host never guesses whether a
7
+ returned value should be appended to artifact bytes.
8
+
9
+ ## Agent quick context
10
+
11
+ - Declare `output.channel: "stdout"` for JSON, NDJSON, CSV, or opaque bytes.
12
+ The host suppresses its receipt by default, including under global `--json`.
13
+ - Declare `output.channel: "file"` when the exporter writes a file. The host
14
+ renders the returned bounded receipt by default.
15
+ - An exporter may still return a structured result. Suppressed receipts remain
16
+ available to hooks, telemetry, and embedding hosts.
17
+ - Write optional human progress or summaries to stderr. Never mix them into a
18
+ stdout artifact.
19
+ - Legacy registrations without `output` retain their previous rendering.
20
+
21
+ ## Registration
22
+
23
+ ```ts
24
+ import type { ExtensionApi } from "@unbrained/pm-cli/sdk";
25
+
26
+ export function activate(api: ExtensionApi): void {
27
+ api.registerExporter(
28
+ "report-json",
29
+ async () => {
30
+ process.stdout.write('{"items":[]}\n');
31
+ return { exported: 0 };
32
+ },
33
+ {
34
+ description: "Export a complete JSON report to stdout.",
35
+ output: {
36
+ channel: "stdout",
37
+ media_type: "application/json",
38
+ },
39
+ },
40
+ );
41
+ }
42
+ ```
43
+
44
+ The normalized contract is visible in the extension contribution inventory.
45
+ Derived help also states that stdout artifact bytes are exclusive and host
46
+ receipt rendering is suppressed when the extension does not supply a custom
47
+ description.
48
+
49
+ ## Channel behavior
50
+
51
+ | Artifact channel | Default receipt | stdout | stderr |
52
+ | --- | --- | --- | --- |
53
+ | `stdout` | `suppress` | Artifact bytes only | Extension-owned diagnostics or summary |
54
+ | `file` | `render` | Bounded structured receipt | Extension-owned diagnostics |
55
+
56
+ File exporters may select `receipt: "render"` or `receipt: "suppress"` as an
57
+ explicit compatibility control. Stdout artifacts always suppress the host
58
+ receipt; declaring `receipt: "render"` with `channel: "stdout"` is rejected at
59
+ registration so redirection, `jq`, and binary output remain clean by
60
+ construction.
61
+
62
+ The host does not decode, re-encode, buffer, or inspect stdout artifact bytes.
63
+ Consequently NUL bytes and non-UTF-8 payloads pass through unchanged. The
64
+ extension owns media correctness and stream completion; the host owns only the
65
+ post-handler receipt policy.
66
+
67
+ ## Shared NDJSON framing
68
+
69
+ SDK-built producers can use `serializeNdjsonStream(rows, trailer)` to append one
70
+ typed `pm.stream.trailer` after a bounded row batch. It supplies one stable
71
+ place for counts, continuation cursors, source identity, and constant-size
72
+ producer metadata without adding per-row overhead.
@@ -1,6 +1,6 @@
1
1
  # SDK context coordination primitives
2
2
 
3
- Trackers: [pm-e200](../.agents/pm/features/pm-e200.toon), [pm-4ri6](../.agents/pm/features/pm-4ri6.toon), and [pm-hcrmye](../.agents/pm/issues/pm-hcrmye.toon).
3
+ Trackers: [pm-e200](../.agents/pm/features/pm-e200.toon), [pm-ez1dfg](../.agents/pm/tasks/pm-ez1dfg.toon), [pm-4ri6](../.agents/pm/features/pm-4ri6.toon), and [pm-hcrmye](../.agents/pm/issues/pm-hcrmye.toon).
4
4
 
5
5
  `pm` treats project management as context management. These primitives let an
6
6
  agent learn what changed, avoid creating redundant work, and keep that work
@@ -26,38 +26,72 @@ Read committed history facts as newline-delimited JSON:
26
26
  pm events --type create --author agent-a --limit 100
27
27
  pm events --since <cursor> --item pm-abcd
28
28
  pm events --since <cursor> --follow --interval-ms 250
29
+ pm events --cursor-mode row --since <cursor>
29
30
  ```
30
31
 
31
- Each line carries `cursor`, `item_id`, `version`, `ts`, `author`, `type`, and
32
- `patch_count`; `--full` also includes the complete authoritative history entry.
32
+ By default, event rows carry `item_id`, `version`, `ts`, `author`, `type`, and
33
+ `patch_count`, followed by one `pm.stream.trailer` record with `count`,
34
+ `has_more`, `next_cursor`, and `source`. Persist the trailer cursor only after
35
+ the batch is durable. A crash before cursor persistence can replay the last
36
+ batch repeatedly, including across multiple crashes. Consumers must process
37
+ idempotently or deduplicate replays. `--cursor-mode row` preserves the previous
38
+ shape with one `cursor` per event and no trailer for consumers that checkpoint
39
+ every row. Already issued version-1 cursors remain accepted by `--since`.
40
+
41
+ Node runtimes use the rebuildable SQLite event projection. Runtimes such as Bun
42
+ that do not expose `node:sqlite` transparently scan the authoritative history
43
+ streams with the same ordering, filters, pagination, and cursor contract; pages
44
+ identify that path with `source: "authoritative_history"`.
45
+
46
+ `--full` also includes the complete authoritative history entry.
33
47
  `--type`, `--author`, and `--item` accept repeatable or comma-separated values.
34
48
  `--since` accepts either a cursor or an ISO timestamp. The CLI emits only event
35
- rows, so it composes directly with standard NDJSON consumers.
49
+ rows and the typed terminal record, so consumers can distinguish data from
50
+ recovery metadata without relying on position alone. Under `--follow`, every
51
+ non-empty page ends at the same batch boundary and an empty boundary is emitted
52
+ as an idle heartbeat.
36
53
 
37
54
  The public SDK provides bounded pages and an abortable async iterator:
38
55
 
39
56
  ```ts
40
57
  import {
41
58
  listMutationEvents,
59
+ subscribeMutationEventBatches,
42
60
  subscribeMutationEvents,
43
61
  } from "@unbrained/pm-cli/sdk";
44
62
 
45
- const page = await listMutationEvents({
46
- pmRoot,
47
- type: ["create", "update"],
48
- limit: 100,
49
- });
63
+ const eventTypes = ["create", "update"] as const;
64
+ let cursor: string | undefined;
65
+ let hasMore = true;
66
+ while (hasMore) {
67
+ const page = await listMutationEvents({
68
+ pmRoot,
69
+ type: eventTypes,
70
+ limit: 100,
71
+ ...(cursor === undefined ? {} : { since: cursor }),
72
+ });
73
+ await consumeBatch(page.events);
74
+ await persistCursor(page.next_cursor);
75
+ cursor = page.next_cursor;
76
+ hasMore = page.has_more;
77
+ }
50
78
 
51
79
  const controller = new AbortController();
52
- for await (const event of subscribeMutationEvents({
80
+ for await (const batch of subscribeMutationEventBatches({
53
81
  pmRoot,
54
- since: page.next_cursor,
82
+ type: eventTypes,
83
+ ...(cursor === undefined ? {} : { since: cursor }),
55
84
  signal: controller.signal,
56
85
  })) {
57
- await consume(event);
86
+ await consumeBatch(batch.events);
87
+ await persistCursor(batch.next_cursor);
58
88
  }
59
89
  ```
60
90
 
91
+ `subscribeMutationEvents` remains the per-event compatibility iterator and
92
+ defaults to row cursors. `subscribeMutationEventBatches` is the token-efficient
93
+ coordination primitive; it exposes the same boundaries used by the CLI.
94
+
61
95
  The `pm_events` MCP tool exposes the same bounded page contract. Consumers such
62
96
  as notification packages can store `next_cursor`, catch up after a restart,
63
97
  then follow without requiring a daemon. A pm-slack migration can replace
@@ -45,9 +45,17 @@ the stable, path-redacted `host_environment_capacity_fault`,
45
45
  `host_environment_permission_fault`, or `host_environment_resource_fault`
46
46
  contracts. `classifyHostEnvironmentFault` supports diagnostics that need a
47
47
  non-throwing classification, while `translateHostEnvironmentFault` supports an
48
- existing catch boundary. Non-errno failures are returned unchanged and must
48
+ existing catch boundary. The classifier accepts both symbolic Node `code`
49
+ values and declared numeric `errno` values from `node:os.constants.errno`; this
50
+ also recognizes platform errors that Node renders only as a number, such as a
51
+ Linux `-122` quota failure. Non-errno failures are returned unchanged and must
49
52
  not be relabeled as environment faults.
50
53
 
54
+ Linked-test tracker seeding uses this boundary. A required sandbox copy that
55
+ exceeds temporary-filesystem capacity fails with a stable recovery contract,
56
+ while linked tests whose effective context is schema avoid materializing
57
+ tracker data at all.
58
+
51
59
  Existing SDK surfaces can supply category-specific `codes` to preserve their
52
60
  published error vocabulary while still sharing classification, path redaction,
53
61
  and recovery guidance. Workspace snapshots use this compatibility path for
package/docs/TESTING.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This page describes safe local tests, linked tests, coverage, and release-readiness checks.
4
4
 
5
- Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon), [pm-rizqb6](../.agents/pm/issues/pm-rizqb6.toon).
5
+ Tracked implementation updates: [pm-52eh](../.agents/pm/features/pm-52eh.toon), [pm-mcxr](../.agents/pm/issues/pm-mcxr.toon), [pm-u42x](../.agents/pm/issues/pm-u42x.toon), [pm-atfm](../.agents/pm/features/pm-atfm.toon), [pm-xmp5](../.agents/pm/tasks/pm-xmp5.toon), [pm-39cqqx](../.agents/pm/tasks/pm-39cqqx.toon), [pm-5cgm2z](../.agents/pm/chores/pm-5cgm2z.toon), [pm-avv3wx](../.agents/pm/issues/pm-avv3wx.toon), [pm-rizqb6](../.agents/pm/issues/pm-rizqb6.toon), [pm-95h7pg](../.agents/pm/issues/pm-95h7pg.toon), [pm-giks4s](../.agents/pm/issues/pm-giks4s.toon).
6
6
 
7
7
  ## Agent Quick Context
8
8
 
@@ -353,6 +353,13 @@ The manifest records baseline bytes and estimated tokens for visible review
353
353
  deltas. Updating it cannot raise answer ceilings, which remain owned by
354
354
  `PM_COMMAND_OUTPUT_BUDGET_CONTRACTS`.
355
355
 
356
+ The gate derives every supported harness, model, session, and provenance
357
+ environment key from the SDK-owned harness descriptor registry. It deletes
358
+ those host inputs before each fixture invocation, then supplies only the
359
+ fixture's deterministic author and isolated tracker settings. Unrelated host
360
+ environment values remain available, so the test process stays representative
361
+ without allowing the launching agent or CI harness to change measured output.
362
+
356
363
  ## Linked Tests
357
364
 
358
365
  Add tests to the item that owns the work:
@@ -399,6 +406,16 @@ When a linked command is a PM tracker-read such as `pm validate`, the default mi
399
406
  `--auto-pm-context`, which keeps schema isolation for ordinary commands and routes only tracker-read PM commands
400
407
  through seeded tracker data.
401
408
 
409
+ The runner resolves every selected command's effective context before it
410
+ creates temporary sandboxes. Runs whose effective context is schema initialize
411
+ only their schema roots; a non-PM command explicitly configured with
412
+ `pm_context_mode: "tracker"` still requires tracker data. Tracker roots and item
413
+ data are materialized only when at least one selected command requires tracker
414
+ context. This preserves source isolation without copying an unrelated tracker
415
+ into constrained temporary storage.
416
+ Capacity, permission, and resource failures while seeding a required tracker
417
+ surface as typed, path-redacted host-environment refusals with recovery steps.
418
+
402
419
  Use explicit modes when needed:
403
420
 
404
421
  ```bash
@@ -61,7 +61,7 @@ Each measurement result carries `definition_fingerprint`; assertion verdicts cop
61
61
  }
62
62
  ```
63
63
 
64
- The semantic numerator is the sum of `discovered_from`, `incident_from`, `supersedes`, and `verifies`. Audit baselines preserve the new fields, accept older snapshots with explicit zero defaults, and report signed count/share deltas.
64
+ The semantic numerator is the sum of `discovered_from`, `incident_from`, `recurs_from`, `supersedes`, and `verifies`. Audit baselines preserve the new fields, accept older snapshots with explicit zero defaults, and report signed count/share deltas.
65
65
 
66
66
  ## Health Row Predicate
67
67
 
@@ -6,20 +6,20 @@
6
6
  "scenarios": [
7
7
  {
8
8
  "id": "small-workspace",
9
- "max_estimated_tokens": 626
9
+ "max_estimated_tokens": 552
10
10
  },
11
11
  {
12
12
  "id": "large-workspace",
13
- "max_estimated_tokens": 1231
13
+ "max_estimated_tokens": 1055
14
14
  },
15
15
  {
16
16
  "id": "returning-agent",
17
- "max_estimated_tokens": 597
17
+ "max_estimated_tokens": 371
18
18
  },
19
19
  {
20
20
  "id": "failing-command",
21
- "max_estimated_tokens": 197
21
+ "max_estimated_tokens": 200
22
22
  }
23
23
  ],
24
- "composite_max_estimated_tokens": 2651
24
+ "composite_max_estimated_tokens": 2178
25
25
  }
package/marketplace.json CHANGED
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
9
- "version": "2026.8.16"
9
+ "version": "2026.8.18"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "pm-claude",
14
14
  "source": "./plugins/pm-claude",
15
15
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
16
- "version": "2026.8.16",
16
+ "version": "2026.8.18",
17
17
  "author": {
18
18
  "name": "unbrained",
19
19
  "url": "https://github.com/unbraind/pm-cli"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-cli",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -77,9 +77,9 @@
77
77
  },
78
78
  "./sdk/public-surface.json": "./sdk/public-surface.json",
79
79
  "./cli": {
80
- "types": "./dist/cli/main.d.ts",
81
- "import": "./dist/cli/main.js",
82
- "default": "./dist/cli/main.js"
80
+ "types": "./dist/cli/public.d.ts",
81
+ "import": "./dist/cli/public.js",
82
+ "default": "./dist/cli/public.js"
83
83
  },
84
84
  "./package.json": "./package.json"
85
85
  },
@@ -120,7 +120,8 @@
120
120
  "lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
121
121
  "lint:duplicates": "jscpd --config .jscpd.json",
122
122
  "lint:codefactor": "pnpm quality:static",
123
- "quality:static": "pnpm build && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json --output-budget unbounded && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json --output-budget unbounded",
123
+ "quality:static": "pnpm build && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/command-grammar-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded && node scripts/release/gate-registry.mjs && node scripts/sdk-surface-snapshot.mjs --check && node scripts/bench/sdk-entrypoint-costs.mjs --check && node scripts/bench/cli-transport-floor.mjs --check && node dist/cli.js assurance run graph-composition --trigger ci --dry-run --json --output-budget unbounded && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json --output-budget unbounded",
124
+ "quality:command-grammar": "pnpm build && node scripts/release/command-grammar-gate.mjs",
124
125
  "quality:token-budget": "node scripts/release/token-budget-gate.mjs",
125
126
  "quality:token-surface": "node scripts/measure-agent-token-surface.mjs --check",
126
127
  "quality:token-surface:update": "pnpm build && node scripts/measure-agent-token-surface.mjs --update",
@@ -136,6 +137,7 @@
136
137
  "quality:absence-tolerance": "node scripts/release/absence-tolerance-gate.mjs",
137
138
  "quality:docs-skills": "node scripts/release/docs-skills-gate.mjs",
138
139
  "quality:docs-links": "node scripts/release/docs-skills-gate.mjs --links-only",
140
+ "quality:defect-evidence": "pnpm build && node scripts/release/defect-evidence-gate.mjs",
139
141
  "quality:hosted-analysis": "node scripts/release/hosted-analysis-gate.mjs",
140
142
  "benchmark:scale:generate": "node scripts/bench/scale-workspace.mjs",
141
143
  "benchmark:scale": "node scripts/bench/run-scale-benchmarks.mjs",
@@ -145,6 +147,7 @@
145
147
  "benchmark:sdk-entrypoints:check": "pnpm build && node scripts/bench/sdk-entrypoint-costs.mjs --check",
146
148
  "benchmark:transport:update": "pnpm build && node scripts/bench/cli-transport-floor.mjs --update",
147
149
  "benchmark:transport:check": "pnpm build && node scripts/bench/cli-transport-floor.mjs --check",
150
+ "benchmark:defect-recurrence": "pnpm build && node scripts/bench/defect-recurrence-index.mjs --check",
148
151
  "contracts:update": "node scripts/contracts-snapshot.mjs --update",
149
152
  "contracts:check": "pnpm build && node scripts/contracts-snapshot.mjs --check && node scripts/generate-agent-capability-surfaces.mjs --check && node scripts/generate-error-code-catalog.mjs --check",
150
153
  "contracts:errors:update": "node scripts/generate-error-code-catalog.mjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for calendar and agenda views.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-command-kit",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for guide and shell completion workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-kanban",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-lifecycle-hooks",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package demonstrating safe lifecycle hook registration.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-linked-test-adapters",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for optional linked-test run management adapters and reporters.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-search-advanced",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for semantic, hybrid, and reindex search workflows.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-templates",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for reusable create templates.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-todos",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for Todo markdown import and export.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-vcs-sdk-exemplar",
3
- "version": "2026.8.16",
3
+ "version": "2026.8.18",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pm-claude",
3
3
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 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.",
4
- "version": "2026.8.16",
4
+ "version": "2026.8.18",
5
5
  "author": {
6
6
  "name": "unbrained",
7
7
  "url": "https://github.com/unbraind/pm-cli"