@unbrained/pm-cli 2026.8.13 → 2026.8.14

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 (136) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +141 -112
  3. package/dist/cli/main.js +39 -3
  4. package/dist/cli-bundle/bundle-manifest.json +144 -176
  5. package/dist/cli-bundle/chunks/{chunk-DEDU3DG7.js → chunk-BBOFSVAK.js} +66 -65
  6. package/dist/cli-bundle/chunks/chunk-BFALV3YP.js +5 -0
  7. package/dist/cli-bundle/chunks/{chunk-Q47C67TQ.js → chunk-FIW4P64F.js} +2 -2
  8. package/dist/cli-bundle/chunks/{chunk-QGTUPEU5.js → chunk-G5JUB66K.js} +41 -41
  9. package/dist/cli-bundle/chunks/{chunk-3ZMOWAFM.js → chunk-SBRKH6OR.js} +2 -2
  10. package/dist/cli-bundle/chunks/chunk-TMJ7URWS.js +13 -0
  11. package/dist/cli-bundle/chunks/{chunk-F7FJYGK3.js → chunk-TXMEUUUY.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-YLBAPY22.js → chunk-XAVMOK6B.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-TF3TPKPR.js → chunk-YAMTJL6Y.js} +33 -33
  14. package/dist/cli-bundle/chunks/{chunk-IMGIN7R6.js → chunk-YSVSMJ2B.js} +2 -2
  15. package/dist/cli-bundle/chunks/{register-list-query-4HIZ7EA3.js → register-list-query-T3EHHNNV.js} +2 -2
  16. package/dist/cli-bundle/chunks/{register-mutation-W64FZ5HN.js → register-mutation-E27WCLSZ.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-operations-C44ET7R5.js → register-operations-4R6I7CPY.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-setup-634MFRXU.js → register-setup-3YXZ444E.js} +2 -2
  19. package/dist/cli-bundle/focused-chunks/{chunk-OOYYKQWX.js → chunk-4DQ2YERC.js} +2 -2
  20. package/dist/cli-bundle/focused-chunks/chunk-F43TT2QQ.js +8 -0
  21. package/dist/cli-bundle/focused-chunks/{chunk-2RI2FESN.js → chunk-K7RWWOAG.js} +2 -2
  22. package/dist/cli-bundle/focused-chunks/chunk-KFSZ3BP6.js +16 -0
  23. package/dist/cli-bundle/focused-chunks/{chunk-3DJSGWVB.js → chunk-KSEDUWVZ.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-NFHFZH2Z.js → chunk-KYUQGTSB.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-IIS2FRKL.js → chunk-LZ4MV3RH.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/chunk-PGXJQLCT.js +155 -0
  27. package/dist/cli-bundle/focused-chunks/{chunk-E3AVJ655.js → chunk-PPFGQDSI.js} +2 -2
  28. package/dist/cli-bundle/focused-chunks/chunk-Q4YY3XNF.js +2 -0
  29. package/dist/cli-bundle/focused-chunks/chunk-QK753U3U.js +46 -0
  30. package/dist/cli-bundle/focused-chunks/{chunk-QDZUABWL.js → chunk-QUMB2J27.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/chunk-SM7MTG27.js +2 -0
  32. package/dist/cli-bundle/focused-chunks/{chunk-I75MANL7.js → chunk-WCVE2NIG.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/chunk-XDNAW5OI.js +18 -0
  34. package/dist/cli-bundle/focused-chunks/{chunk-2JP7W7GO.js → chunk-YOOI3UZX.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/chunk-ZM6TZVHC.js +2 -0
  36. package/dist/cli-bundle/main.js +13 -13
  37. package/dist/cli-bundle/sdk-authoring.js +1 -1
  38. package/dist/cli-bundle/sdk-contracts.js +1 -1
  39. package/dist/cli-bundle/sdk-core.js +44 -41
  40. package/dist/cli-bundle/sdk-governance.js +1 -1
  41. package/dist/cli-bundle/sdk-graph.js +1 -1
  42. package/dist/cli-bundle/sdk-merge.js +109 -1
  43. package/dist/cli-bundle/sdk-query.js +1 -1
  44. package/dist/cli-bundle/sdk-runtime.js +1 -1
  45. package/dist/cli-bundle/sdk-testing.js +1 -1
  46. package/dist/cli-bundle/sdk.js +2 -2
  47. package/dist/core/history/drift-scan.d.ts +6 -0
  48. package/dist/core/history/drift-scan.js +74 -50
  49. package/dist/core/history/workspace-history.d.ts +59 -0
  50. package/dist/core/history/workspace-history.js +197 -10
  51. package/dist/core/output/output.js +12 -4
  52. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +6 -1
  53. package/dist/sdk/cli-contracts/runtime-contracts.js +155 -60
  54. package/dist/sdk/cli-program.js +3 -3
  55. package/dist/sdk/context-relevance.js +12 -4
  56. package/dist/sdk/governance/assurance.js +4 -4
  57. package/dist/sdk/governance/health.js +15 -3
  58. package/dist/sdk/governance/validate-history-drift.d.ts +7 -0
  59. package/dist/sdk/governance/validate-history-drift.js +68 -0
  60. package/dist/sdk/governance/validate.js +4 -46
  61. package/dist/sdk/graph/assembly.d.ts +23 -0
  62. package/dist/sdk/graph/assembly.js +54 -2
  63. package/dist/sdk/graph/durable-cache.js +50 -20
  64. package/dist/sdk/graph/governance-contracts.d.ts +1 -1
  65. package/dist/sdk/graph/governance-contracts.js +4 -2
  66. package/dist/sdk/graph/governance.d.ts +21 -1
  67. package/dist/sdk/graph/governance.js +94 -32
  68. package/dist/sdk/graph/index.d.ts +2 -2
  69. package/dist/sdk/graph/index.js +4 -4
  70. package/dist/sdk/graph/mutation-advisory.js +15 -7
  71. package/dist/sdk/graph/remediation.js +12 -2
  72. package/dist/sdk/history-read.d.ts +8 -0
  73. package/dist/sdk/history-read.js +2 -2
  74. package/dist/sdk/index.d.ts +1 -1
  75. package/dist/sdk/index.js +3 -3
  76. package/dist/sdk/query/history.js +20 -3
  77. package/dist/sdk/read-output-budget.d.ts +2 -0
  78. package/dist/sdk/read-output-budget.js +12 -5
  79. package/dist/sdk/read-output-contracts.d.ts +61 -5
  80. package/dist/sdk/read-output-contracts.js +210 -28
  81. package/dist/sdk/read-output-rows.d.ts +11 -0
  82. package/dist/sdk/read-output-rows.js +47 -2
  83. package/dist/sdk/runtime-primitives.d.ts +1 -1
  84. package/dist/sdk/runtime-primitives.js +3 -3
  85. package/dist/sdk/runtime.js +5 -3
  86. package/docs/ASSURANCE.md +10 -1
  87. package/docs/COMMANDS.md +31 -2
  88. package/docs/READ_OUTPUT_CONTRACTS.md +44 -8
  89. package/docs/RELATIONSHIP_GRAPH.md +20 -5
  90. package/docs/SDK.md +12 -5
  91. package/docs/SDK_CONTEXT_INTEGRITY.md +32 -1
  92. package/docs/TESTING.md +23 -1
  93. package/docs/performance/sdk-entrypoint-import-costs.md +20 -13
  94. package/marketplace.json +2 -2
  95. package/package.json +6 -6
  96. package/packages/pm-beads/extensions/beads/index.ts +1 -0
  97. package/packages/pm-beads/package.json +1 -1
  98. package/packages/pm-calendar/extensions/calendar/index.ts +1 -0
  99. package/packages/pm-calendar/package.json +1 -1
  100. package/packages/pm-command-kit/package.json +1 -1
  101. package/packages/pm-digital-twin/extensions/digital-twin/index.ts +7 -0
  102. package/packages/pm-digital-twin/package.json +1 -1
  103. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +4 -0
  104. package/packages/pm-governance-audit/package.json +1 -1
  105. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +5 -0
  106. package/packages/pm-guide-shell/package.json +1 -1
  107. package/packages/pm-kanban/package.json +1 -1
  108. package/packages/pm-lifecycle-hooks/package.json +1 -1
  109. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +6 -0
  110. package/packages/pm-linked-test-adapters/package.json +1 -1
  111. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +2 -0
  112. package/packages/pm-search-advanced/package.json +1 -1
  113. package/packages/pm-templates/extensions/templates/index.ts +4 -0
  114. package/packages/pm-templates/package.json +1 -1
  115. package/packages/pm-todos/extensions/todos/index.ts +2 -0
  116. package/packages/pm-todos/package.json +1 -1
  117. package/packages/pm-vcs/extensions/vcs/index.ts +7 -0
  118. package/packages/pm-vcs/package.json +1 -1
  119. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  120. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  121. package/scripts/bundle-cli.mjs +17 -4
  122. package/sdk/public-surface.json +209 -29
  123. package/dist/cli-bundle/chunks/chunk-DL5M5J3V.js +0 -13
  124. package/dist/cli-bundle/chunks/chunk-HIUZVCMN.js +0 -5
  125. package/dist/cli-bundle/focused-chunks/chunk-27N23W6M.js +0 -31
  126. package/dist/cli-bundle/focused-chunks/chunk-3BNVU6LC.js +0 -8
  127. package/dist/cli-bundle/focused-chunks/chunk-6MLIRBLV.js +0 -5
  128. package/dist/cli-bundle/focused-chunks/chunk-6XYLENDV.js +0 -155
  129. package/dist/cli-bundle/focused-chunks/chunk-CP4K4WFS.js +0 -2
  130. package/dist/cli-bundle/focused-chunks/chunk-EBTNSFYE.js +0 -2
  131. package/dist/cli-bundle/focused-chunks/chunk-HC2OL2H2.js +0 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-OGC4XSBC.js +0 -17
  133. package/dist/cli-bundle/focused-chunks/chunk-PKPOZXLL.js +0 -2
  134. package/dist/cli-bundle/focused-chunks/chunk-QQX5TDFT.js +0 -16
  135. package/dist/cli-bundle/focused-chunks/chunk-TEZIXMTH.js +0 -2
  136. package/dist/cli-bundle/focused-chunks/chunk-WEH6NSL6.js +0 -18
@@ -1,17 +1,17 @@
1
1
  # Universal Read Output Contracts
2
2
 
3
- Tracker references: [pm-hb7ug8](../.agents/pm/features/pm-hb7ug8.toon), [pm-cxr0jb](../.agents/pm/features/pm-cxr0jb.toon), [pm-hid9g1](../.agents/pm/features/pm-hid9g1.toon), [pm-sb0tns](../.agents/pm/issues/pm-sb0tns.toon), and [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon).
3
+ Tracker references: [pm-hb7ug8](../.agents/pm/features/pm-hb7ug8.toon), [pm-cxr0jb](../.agents/pm/features/pm-cxr0jb.toon), [pm-hid9g1](../.agents/pm/features/pm-hid9g1.toon), [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), [pm-sb0tns](../.agents/pm/issues/pm-sb0tns.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), [pm-eugaqy](../.agents/pm/issues/pm-eugaqy.toon), [pm-jt8aa2](../.agents/pm/issues/pm-jt8aa2.toon), and [pm-kyjdne](../.agents/pm/issues/pm-kyjdne.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
7
7
  Every built-in read surface uses four output dimensions: what to include, how much to return, how much the result may cost, and how to encode it. The same canonical controls work through the CLI, SDK, MCP, generated schemas, runtime contracts, and shell completions.
8
8
 
9
- | Dimension | CLI | SDK and MCP | Meaning |
10
- | --------- | ------------------------------- | --------------- | ---------------------------------------------------------- |
11
- | Include | `--output-include <csv>` | `outputInclude` | Retain named fields or top-level sections. |
12
- | Amount | `--output-limit <n\|unbounded>` | `outputLimit` | Bound shared row collections. |
13
- | Cost | `--output-budget <tokens>` | `outputBudget` | Fail closed when even the compact result cannot fit. |
14
- | Encoding | `--output-format <toon\|json>` | `outputFormat` | Select the CLI renderer and record the requested encoding. |
9
+ | Dimension | CLI | SDK and MCP | Meaning |
10
+ | --------- | ------------------------------- | --------------- | ---------------------------------------------------------------------- |
11
+ | Include | `--output-include <csv>` | `outputInclude` | Retain named fields or sections, or select a declared projection mode. |
12
+ | Amount | `--output-limit <n\|unbounded>` | `outputLimit` | Bound shared row collections. |
13
+ | Cost | `--output-budget <tokens>` | `outputBudget` | Fail closed when even the compact result cannot fit. |
14
+ | Encoding | `--output-format <toon\|json>` | `outputFormat` | Select the CLI renderer and record the requested encoding. |
15
15
 
16
16
  The contract covers `list`, `context`, `search`, `get`, `next`, `health`, `deps`, `graph`, `history`, `activity`, `validate`, `events`, `contracts`, `comments`, `notes`, `files`, `docs`, `stats`, and `aggregate`, including list aliases and `ctx`.
17
17
 
@@ -24,6 +24,39 @@ repeated metadata from results by default. Request
24
24
  `--output-row-contract` / `outputRowContract: true` when a consumer needs the
25
25
  row paths, jq selector, and active TOON encoding contract.
26
26
 
27
+ ### Include Modes
28
+
29
+ `--output-include` accepts two kinds of token. A **field selector** names a row
30
+ field or section and narrows the computed result. A **projection mode** names a
31
+ whole declared projection and is the canonical spelling of a command-local mode
32
+ flag: `brief`, `compact`, `full`, `summary`, and `counts`, depending on the
33
+ surface. Controls that change execution rather than projection remain separate:
34
+ for example, `deps --collapse <none|repeated>` retains dependency-grouping
35
+ semantics, and `health --check-only` retains refresh-suppression semantics.
36
+
37
+ Mode tokens are resolved before the command computes its rows, because a mode
38
+ selects which fields exist rather than which of the computed fields survive.
39
+ `pm list --output-include brief` is therefore exactly `pm list --brief`, and the
40
+ two are byte-identical apart from the `read_output` receipt that records which
41
+ spelling was used. Modes and field selectors compose: the mode selects the
42
+ projection, the remaining selectors narrow it.
43
+
44
+ ```bash
45
+ pm list --status open --output-include brief # same result as --brief
46
+ pm contracts --output-include full # same result as --full
47
+ pm list --status open --output-include brief,id # brief projection, id only
48
+ ```
49
+
50
+ Read `readOutputIncludeModeOptions(command)` from the SDK for the exact
51
+ replacement modes a surface declares. Every compatibility alias also declares
52
+ `semantics: "replacement" | "behavior_preserving"`; generators therefore do
53
+ not have to infer obligation strength from prose. The executable migration test
54
+ derives all 22 projection-mode replacements from this table, invokes both
55
+ spellings in a temporary tracker, and compares their useful result after
56
+ removing spelling receipts and volatile run metadata. A selector that matches
57
+ neither a declared mode nor any field on any returned row is refused with the
58
+ legal domain, rather than returning rows with every field removed.
59
+
27
60
  ## Cross-Call Context Sessions
28
61
 
29
62
  `--output-session <json>` / `outputSession` composes the four per-call
@@ -92,7 +125,9 @@ pm stats --output-row-contract
92
125
  pm contracts --full --json
93
126
  ```
94
127
 
95
- Every projected result carries a `read_output` receipt with the requested dimensions, precedence, observed compatibility aliases, deterministic estimated token count, string/row compaction signals, and budget outcome. If no useful content can fit, `PmReadOutputBudgetExceeded` provides a discriminated omission result; use `isReadOutputBudgetExceeded` before accessing result-specific fields. Universal controls are rejected on mutation commands and on the mutation mode of hybrid commands such as `comments`, `notes`, `files`, and `docs`.
128
+ Every projected result carries a `read_output` receipt with the requested dimensions, precedence, observed compatibility aliases, deterministic estimated token count, string/row compaction signals, and budget outcome. Budget degradation discovers nested arrays as well as declared result rows, so validation diagnostics and other governance payloads compact their inner findings before the useful result is omitted. `compacted_row_paths` names every reduced collection without redefining those nested arrays as ordinary pagination rows.
129
+
130
+ When rows are dropped to satisfy a ceiling, the result also carries `output_budget_truncation`, naming the binding budget and its source, any explicitly requested dimension the budget overrode, every compacted collection path, and an executable recovery instruction — a default ceiling can override an explicit `--output-limit unbounded`, and that override is reported rather than silent. If no useful content can fit, `PmReadOutputBudgetExceeded` provides a discriminated omission result and reports `omitted_result_estimated_tokens`, the last useful-result estimate before omission; use `isReadOutputBudgetExceeded` before accessing result-specific fields. Universal controls are rejected on mutation commands and on the mutation mode of hybrid commands such as `comments`, `notes`, `files`, and `docs`.
96
131
 
97
132
  ## SDK and Package Usage
98
133
 
@@ -127,5 +162,6 @@ The full runtime contract reports every surface and all four dimensions. Strict
127
162
  ```bash
128
163
  pnpm contracts:check
129
164
  node scripts/run-tests.mjs test -- tests/unit/sdk/read-output-contracts.spec.ts
165
+ node scripts/run-tests.mjs test -- tests/unit/sdk/read-output-migration-hints.spec.ts
130
166
  node scripts/run-tests.mjs test -- tests/unit/commands/completion-command.spec.ts
131
167
  ```
@@ -1,6 +1,6 @@
1
1
  # Relationship graph semantics
2
2
 
3
- Tracked by [pm-4jqm](../.agents/pm/decisions/pm-4jqm.toon), [pm-ju83](../.agents/pm/features/pm-ju83.toon), [pm-8xr8](../.agents/pm/stories/pm-8xr8.toon), [pm-m2il](../.agents/pm/chores/pm-m2il.toon), and [pm-jiusod](../.agents/pm/issues/pm-jiusod.toon).
3
+ Tracked by [pm-4jqm](../.agents/pm/decisions/pm-4jqm.toon), [pm-dwj33e](../.agents/pm/decisions/pm-dwj33e.toon), [pm-ju83](../.agents/pm/features/pm-ju83.toon), [pm-8xr8](../.agents/pm/stories/pm-8xr8.toon), [pm-m2il](../.agents/pm/chores/pm-m2il.toon), [pm-jiusod](../.agents/pm/issues/pm-jiusod.toon), [pm-mfvsng](../.agents/pm/issues/pm-mfvsng.toon), [pm-9gzr4r](../.agents/pm/issues/pm-9gzr4r.toon), and [pm-xvt7ps](../.agents/pm/issues/pm-xvt7ps.toon).
4
4
 
5
5
  ## Decision
6
6
 
@@ -251,14 +251,21 @@ terminal dangling-reference partitions. Domain adapters pass their
251
251
  company, or package-defined edges survive assembly with their registered
252
252
  semantics. `auditWorkspaceRelationshipGraph`
253
253
  consumes that assembly and emits counts-first findings for active/terminal
254
- missing references, retired sentinels, ordering cycles, stale lifecycle blocks,
255
- and sparse or isolated active nodes. Findings include stable codes, severity,
254
+ missing references, retired sentinels, ordering cycles, exact
255
+ scalar-versus-structured ordering contradictions, stale lifecycle blocks, and
256
+ sparse or isolated active nodes. Findings include stable codes, severity,
256
257
  bounded deterministic samples, truncation, policy text, and safe remediation;
257
258
  the audit never invents an edge. Explicit isolate exemptions suppress policy
258
259
  findings without changing structural coverage metrics.
259
260
 
260
261
  The audit profile also exposes graph-wide resilience and delivery-lineage
261
- metrics. `articulation_points` and `bridge_edges` reuse the exact cut-structure
262
+ metrics. `nodes` and `edges` remain diagnostic totals. Structural ratchets use
263
+ `recorded_nodes`, which excludes synthesized missing/external placeholders,
264
+ and `informative_edges`, which subtracts the union of witnessed redundant edge
265
+ identities and structured rows proven to contradict scalar blocker precedence.
266
+ `redundant_edges` and `ordering_contradiction_edges` remain separate debt
267
+ censuses so repair can tighten their ceilings without weakening the
268
+ information-bearing floor. `articulation_points` and `bridge_edges` reuse the exact cut-structure
262
269
  algorithm; outcome metrics count explicit `Milestone` titles beginning with
263
270
  `Outcome milestone:` and follow only hierarchy or `implements` edges toward
264
271
  them. Active and terminal populations are reported separately, with integer
@@ -340,7 +347,15 @@ on terminal ones) reports raw dependency rows whose exact identity is stored
340
347
  more than once on one holder — invisible to every assembled-graph projection
341
348
  because graph construction deduplicates edges by identity, so
342
349
  `collectDuplicateDependencyRows` scans the pre-assembly item rows carried on
343
- the assembly. Coverage policy is type-aware: the audit profile's
350
+ the assembly. `collectOrderingStorageContradictions` similarly scans raw rows
351
+ before normalization: `blocked_by: target` plus a same-target source-first
352
+ ordering dependency asserts both directions and manufactures a two-node cycle.
353
+ The audit reports the exact holder, target, and removable dependency kind under
354
+ `ordering_storage_contradiction` or
355
+ `legacy_ordering_storage_contradiction`; cycle findings attach that evidence
356
+ instead of leaving agents to re-derive the storage cause. Mutation advisories
357
+ also identify a newly introduced contradiction before reporting its derived
358
+ cycle. Coverage policy is type-aware: the audit profile's
344
359
  `coverage_by_type` breaks active/isolated/degree≤1 counts down per item type
345
360
  (untyped items under `(untyped)`), and `isolateExemptTypes`
346
361
  (`--exempt-isolate-type`) suppresses isolate/sparse findings for types whose
package/docs/SDK.md CHANGED
@@ -284,7 +284,7 @@ Command/action contract exports:
284
284
  - Large-workspace memory primitives: `buildWorkspaceMemorySnapshot`, `readWorkspaceMemory`, `selectWorkspaceMemoryRollups`, and `searchWorkspaceMemory` build cursor-bound, rebuildable calendar-epoch and epic-lineage summaries. The stock `context` and `search` results attach matching bounded rollups automatically at 10,000 items; smaller projects skip the artifact entirely.
285
285
  - Persistent metadata-query primitives: `queryItemMetadataIndex` with `ItemMetadataIndexQuery` / `ItemMetadataIndexQueryResult` executes bounded status/type/id/parent/assignee/sprint/release/priority windows without materializing the JSON metadata corpus. It returns `null` on absent, stale, or corrupt derived state so custom hosts can fall back to authoritative reads.
286
286
  - Schema-evolution primitives: `planSchemaEvolutionMigration` and `runSchemaEvolutionMigration`, plus `PmClient.schemaRenameType`, `schemaRenameField`, and `schemaRemapStatus`, provide deterministic dry-run plans, collision refusal, index-backed candidate selection, per-item immutable history, and crash-resumable workspace transactions.
287
- - Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream instead of inventing an unaudited side log.
287
+ - Workspace audit primitives: `appendWorkspaceHistoryChange`, `writeWorkspaceJsonWithHistory`, `inspectWorkspaceHistoryState`, `reconcileWorkspaceJsonHistory`, `restoreWorkspaceJsonFromHistory`, `getWorkspaceHistoryPath`, and `WORKSPACE_HISTORY_ID` let package-owned singleton JSON mutations share the CLI's verified `HistoryEntry` stream, prove replay-to-disk agreement, and recover forward without inventing an unaudited side log or rewriting history.
288
288
  - Typed annotation and relationship primitives on `PmClient`: `comments`, `notes`, `learnings`, `files`, `filesDiscover`, `docs`, `deps`, `graph`, and `append`
289
289
  - Workspace graph-query runner: `runGraph` (with `GraphCommandOptions`, `GraphResult`, and per-subcommand envelopes) resolves the workspace relationship graph through the shared fingerprint-keyed cache and dispatches bounded `ancestors`/`descendants`/`predecessors`/`successors`/`paths`/`impact`/`analyze`/`audit`/`communities`/`redundancy`/`dominators`/`slack`/`centrality`/`articulation`/`plan` queries with counts-first cost, truncation, and cache metadata; the `pm graph` CLI command and `pm_graph` MCP tool are thin adapters over it.
290
290
  - Structural graph analytics: `detectRelationshipCommunities` (deterministic label-propagation clustering with `maxIterations`/`minSize` bounds and convergence reporting), `findRedundantRelationshipEdges` (transitive-reduction scan that joins each directed ordering or hierarchy kind with its inverse spelling and returns witness paths), and `computeRelationshipDominators` (Cooper–Harvey–Kennedy immediate dominators with per-node gating weights for bottleneck ranking) — all deterministic, cancellable, and cost-metered like every other graph query.
@@ -292,8 +292,8 @@ Command/action contract exports:
292
292
  - Incremental graph cache: `WorkspaceGraphCache`, `workspaceGraphCache`, `resetWorkspaceGraphCache`, and `computeWorkspaceGraphFingerprint` reuse the assembled workspace graph and memoize deterministic query results under a fingerprint that digests every relationship-relevant item field (id, title, status and terminal classification, item type, parent, legacy blocker, structured dependencies), so long-lived hosts stop paying full-workspace assembly per bounded query; `GraphCacheMetadata` reports assembly/result hit-or-miss on every `runGraph` envelope.
293
293
  - Durable graph index: `openDurableGraphCache`, `persistDurableGraphResult`, `clearDurableGraphCache`, `durableGraphCacheStatus`, `shouldPersistDurableGraphCache`, and the `durableGraphCachePath`/`graphAuditBaselinePath` locators persist fingerprint-keyed deterministic query results across processes under `runtime/graph-cache.json` — atomic writes, corrupt-tolerant decode, bounded retention, never authoritative (rebuildable from item storage), optional below the `GRAPH_DURABLE_CACHE_MIN_ITEMS` threshold; `pm graph index` is the maintenance surface and `cache.durable` the per-envelope observability.
294
294
  - Temporal audit census: `RelationshipAuditSnapshot`, `diffRelationshipAuditSnapshots`, `saveGraphAuditBaseline`, and `loadGraphAuditBaseline` persist and compare point-in-time governance censuses (signed per-code and per-profile deltas, `same_snapshot` fingerprint equality) behind `pm graph audit --save-baseline` and the automatic `baseline` drift block on later audits.
295
- - Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder (the `duplicate_dependency_row`/`legacy_duplicate_dependency_row` audit families; invisible to assembled-graph projections), `RelationshipCoverageProfile.coverage_by_type` breaks active connectivity down per item type, and `RelationshipAuditOptions.isolateExemptTypes` suppresses coverage findings for policy-valid disconnected types.
296
- - Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph (shared `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation), and `resolveWorkspaceRelationshipKindRegistry` exposes the built-in-plus-extension relationship-kind registry resolution every surface shares.
295
+ - Storage-integrity and coverage governance: `collectDuplicateDependencyRows` reports raw same-identity dependency rows duplicated on one holder; `collectOrderingStorageContradictions` reports exact scalar blocker plus opposite-precedence structured rows before graph normalization; `RelationshipCoverageProfile` separates diagnostic `nodes`/`edges` from invariant-bearing `recorded_nodes`/`informative_edges` and independent redundancy/contradiction debt counts; `coverage_by_type` breaks active connectivity down per item type, and `RelationshipAuditOptions.isolateExemptTypes` suppresses coverage findings for policy-valid disconnected types.
296
+ - Incremental mutation advisory: `collectNewOrderingCycleWarnings` detects newly created ordering cycles component-scoped around the changed item over a lightweight per-snapshot ordering digraph and emits exact newly stored scalar-versus-structured contradiction evidence before the derived cycle warning (shared registry and `collectOrderingCycles` Tarjan semantics with the audit; no full workspace assembly per mutation).
297
297
  - Remediation planning: `planRelationshipRemediation` (with `RelationshipRemediationPlan`, `RelationshipRemediationStep`, and operation/confidence/code contracts) derives exact dry-run `remove`/`retype`/`supersede`/`waive`/`investigate` proposals from governance-audit findings and witnessed redundancy rows — evidence-backed, confidence-rated, and never auto-applied.
298
298
  - Annotation and relationship option/result contracts: `CommentsCommandOptions` / `CommentsResult`, `NotesCommandOptions` / `NotesResult`, `LearningsCommandOptions` / `LearningsResult`, `FilesCommandOptions` / `FilesResult`, `FilesDiscoverOptions` / `FilesDiscoverResult`, `DocsCommandOptions` / `DocsResult`, `DepsCommandOptions` / `DepsResult`, `AppendCommandOptions` / `AppendResult`
299
299
  - Annotation kernel primitives: `resolveAnnotationInput`, `runAnnotationCommand`, `resolveAnnotationIndex`, `parseAnnotationTextInput`, `limitAnnotationEntries`, `readAnnotationEntries`, `wrapOwnershipConflict`, `isErrnoError`, and their typed input/config/result contracts
@@ -1167,10 +1167,17 @@ snapshot, atomic write, history append, and any compensating restore, so
1167
1167
  competing SDK writers cannot split persisted state from its audit chain. The
1168
1168
  stream participates in the history merge driver, appears in `pm activity`, and
1169
1169
  can be checked with
1170
- `pm history _workspace --verify`. Package authors that persist their own
1170
+ `pm history _workspace --verify`. Verification also replays the latest document
1171
+ map and compares every governed JSON singleton with disk; a valid chain is not
1172
+ reported healthy when the live document differs. Package authors that persist their own
1171
1173
  singleton JSON should call `writeWorkspaceJsonWithHistory`; use
1172
1174
  `appendWorkspaceHistoryChange` only when another primitive already owns the
1173
- document write.
1175
+ document write. Recovery code uses `inspectWorkspaceHistoryState` for the
1176
+ read-only classification, `reconcileWorkspaceJsonHistory` only when a terminal
1177
+ Decision explicitly authorizes adoption of the reviewed disk value, and
1178
+ `restoreWorkspaceJsonFromHistory` to reject drift and replace the singleton
1179
+ from a verified version. Reconciliation and restoration append new entries and
1180
+ compensate failed writes; neither edits historical rows.
1174
1181
 
1175
1182
  ```ts
1176
1183
  import {
@@ -1,6 +1,6 @@
1
1
  # SDK Context Integrity
2
2
 
3
- Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), and [pm-h97qxd](../.agents/pm/issues/pm-h97qxd.toon).
3
+ Tracker: [pm-0k19l7](../.agents/pm/issues/pm-0k19l7.toon), [pm-9stazf](../.agents/pm/issues/pm-9stazf.toon), [pm-tu71](../.agents/pm/issues/pm-tu71.toon), [pm-0xmajx](../.agents/pm/issues/pm-0xmajx.toon), [pm-7rrqsk](../.agents/pm/issues/pm-7rrqsk.toon), [pm-ety1qc](../.agents/pm/issues/pm-ety1qc.toon), [pm-lu6sca](../.agents/pm/features/pm-lu6sca.toon), [pm-5y05kq](../.agents/pm/issues/pm-5y05kq.toon), [pm-gjjurs](../.agents/pm/issues/pm-gjjurs.toon), [pm-h97qxd](../.agents/pm/issues/pm-h97qxd.toon), [pm-h06944](../.agents/pm/issues/pm-h06944.toon), and [pm-5t33or](../.agents/pm/features/pm-5t33or.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
@@ -31,6 +31,31 @@ selector grammar and omission receipts as any other SDK-owned item field.
31
31
 
32
32
  The same SDK-owned read-output registry now declares `package manage` as a first-class read surface. Package authors can resolve either `package manage` or `package-manage` to its canonical contract and discover the universal include, amount, cost, and encoding dimensions without copying CLI knowledge.
33
33
 
34
+ Compatibility aliases declare whether their migration promise is an exact
35
+ `replacement` or only `behavior_preserving`. Exact projection modes are
36
+ available through `readOutputIncludeModeOptions()` and are executed against
37
+ their legacy spelling in the temporary-tracker contract suite. Execution
38
+ controls such as `deps --collapse <value>` and `health --check-only` retain
39
+ their independent semantics and are never exposed as false include-mode
40
+ replacements.
41
+
42
+ Every registered read surface also resolves a format-aware default token ceiling
43
+ from the public command-output contract. Results already inside that ceiling are
44
+ returned byte-for-byte unchanged, so the safety default adds no receipt overhead
45
+ to ordinary reads. Oversized results follow the shared compaction ladder and
46
+ identify `budget_source: default` plus the applied `budget_tokens` in their
47
+ `read_output` receipt. Complete internal artifacts and callers that intentionally
48
+ accept unbounded output must say so explicitly with `--output-budget unbounded`
49
+ or `outputBudget: "unbounded"`; that opt-out is distinct from row-count
50
+ `--unbounded` compatibility behavior.
51
+
52
+ The budget ladder separately discovers nested arrays below declared result
53
+ rows. This lets governance envelopes reduce diagnostic findings before
54
+ omitting the whole verdict without redefining a nested tag or remediation list
55
+ as a pagination row. Receipts name every `compacted_row_paths` entry; a complete
56
+ omission also records the useful result's pre-omission estimate, while the
57
+ universal recovery remains `--output-budget unbounded`.
58
+
34
59
  ## Row discovery and exact output receipts
35
60
 
36
61
  Row locations and encoding capabilities remain part of the SDK-owned read
@@ -85,6 +110,12 @@ The SDK exposes `resolveUnknownAuthorAcknowledgmentSelector` and `parseUnknownAu
85
110
 
86
111
  Storage integrity is evaluated independently of that provider boundary. Lossless merge receipts remain visible as provenance, while only receipts containing discarded scalar values produce `merge_decisions_unreviewed` guidance; neither classification enables vector refresh or remote provider I/O.
87
112
 
113
+ Default history-drift verification also replays the append-only `_workspace`
114
+ stream and compares every governed singleton with its latest recorded state.
115
+ That agreement check reads only local history and JSON files: mismatched,
116
+ missing, or unreadable singleton paths become bounded `history_drift` evidence
117
+ without enabling embeddings, vector-store access, or any other provider I/O.
118
+
88
119
  Brief and summary check-only health projections use the scalar-only metadata
89
120
  reader. Validation uses collection-bearing metadata for evidence and
90
121
  relationship checks and materializes bodies only when strict history-drift
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).
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).
6
6
 
7
7
  ## Agent Quick Context
8
8
 
@@ -100,6 +100,28 @@ node scripts/run-tests.mjs test -- tests/integration/cli.integration.spec.ts
100
100
 
101
101
  Use focused runs while iterating, then run coverage before closure when risk or scope warrants it.
102
102
 
103
+ ## CI Retry and Timeout Diagnostics
104
+
105
+ CI retains the 30-second per-test timeout and retries one failed attempt. A
106
+ test that passes only on retry is reported as flaky rather than silently folded
107
+ into the pass count; a persistent assertion still fails after the bounded
108
+ retry. Local runs do not retry, so deterministic failures stay immediate while
109
+ iterating.
110
+
111
+ Vitest's GitHub reporter emits annotations and retry evidence. The repository
112
+ reliability reporter additionally writes
113
+ `.vitest-reports/reliability-<shard>.json` and appends a job-summary table with
114
+ the test identity, file, duration, effective timeout, retry count, shard, and
115
+ failure detail. Tests completing at or above 80% of their timeout are recorded
116
+ as at-risk before load turns them into timeouts. Coverage shards upload this
117
+ JSON beside their blob report, so recurrence can be measured without decoding
118
+ the coverage artifact or re-reading raw logs.
119
+
120
+ `PM_TEST_SHARD` supplies a stable shard identity and
121
+ `PM_TEST_RELIABILITY_REPORT_DIR` can redirect the JSON report for an isolated
122
+ harness. These variables affect diagnostics only; they do not change test
123
+ selection, retry count, timeout, or verdicts.
124
+
103
125
  ## Coverage Governance
104
126
 
105
127
  Coverage gating now targets literal all-source coverage across runtime code families:
@@ -1,7 +1,9 @@
1
1
  # SDK entrypoint import costs
2
2
 
3
3
  Tracked by [pm-38bskj](../../.agents/pm/tasks/pm-38bskj.toon) and
4
- [pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon).
4
+ [pm-cg1sjb](../../.agents/pm/issues/pm-cg1sjb.toon). Standalone merge-bundle
5
+ topology is tracked by
6
+ [pm-m9gu9r](../../.agents/pm/chores/pm-m9gu9r.toon).
5
7
 
6
8
  This table measures fresh-process ESM import and module evaluation. The bare
7
9
  Node v26.5.0 process floor on linux/x64
@@ -13,20 +15,25 @@ against the unchanged upper-bound budget and 30 ms scheduler margin. A single
13
15
  cold or descheduled process therefore cannot fail the gate, while a majority of
14
16
  over-budget samples still does; p95 remains visible as diagnostic evidence.
15
17
 
16
- | Package export | p50 | p95 | p50 above Node | Reduction vs aggregate |
17
- |---|---:|---:|---:|---:|
18
- | `./sdk` | 248 ms | 249 ms | 207 ms | 0% |
19
- | `./sdk/authoring` | 71 ms | 76 ms | 30 ms | 85.5% |
20
- | `./sdk/contracts` | 73 ms | 87 ms | 32 ms | 84.5% |
21
- | `./sdk/core` | 221 ms | 255 ms | 180 ms | 13% |
22
- | `./sdk/governance` | 154 ms | 161 ms | 113 ms | 45.4% |
23
- | `./sdk/graph` | 87 ms | 87 ms | 46 ms | 77.8% |
24
- | `./sdk/merge` | 111 ms | 122 ms | 70 ms | 66.2% |
25
- | `./sdk/query` | 100 ms | 105 ms | 59 ms | 71.5% |
26
- | `./sdk/runtime` | 251 ms | 289 ms | 210 ms | -1.4% |
27
- | `./sdk/testing` | 241 ms | 307 ms | 200 ms | 3.4% |
18
+ | Package export | p50 | p95 | p50 above Node | Reduction vs aggregate |
19
+ | ------------------ | -----: | -----: | -------------: | ---------------------: |
20
+ | `./sdk` | 248 ms | 249 ms | 207 ms | 0% |
21
+ | `./sdk/authoring` | 71 ms | 76 ms | 30 ms | 85.5% |
22
+ | `./sdk/contracts` | 73 ms | 87 ms | 32 ms | 84.5% |
23
+ | `./sdk/core` | 221 ms | 255 ms | 180 ms | 13% |
24
+ | `./sdk/governance` | 154 ms | 161 ms | 113 ms | 45.4% |
25
+ | `./sdk/graph` | 87 ms | 87 ms | 46 ms | 77.8% |
26
+ | `./sdk/merge` | 111 ms | 122 ms | 70 ms | 66.2% |
27
+ | `./sdk/query` | 100 ms | 105 ms | 59 ms | 71.5% |
28
+ | `./sdk/runtime` | 251 ms | 289 ms | 210 ms | -1.4% |
29
+ | `./sdk/testing` | 241 ms | 307 ms | 200 ms | 3.4% |
28
30
 
29
31
  The aggregate `@unbrained/pm-cli/sdk` remains supported for compatibility.
30
32
  New packages should import the narrowest subpath that owns their capability.
33
+ The build emits `./sdk/merge` as a standalone no-splitting bundle because its
34
+ dependency closure overlaps with several broader focused entrypoints. Keeping
35
+ that surface in the shared focused chunk graph made a merge-only import traverse
36
+ unrelated chunks; the isolated output preserves the same public exports while
37
+ keeping its runtime loading cost proportional to the capability requested.
31
38
  The committed budget file is an upper-bound ratchet and must not be weakened to
32
39
  hide a regression.
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.13"
9
+ "version": "2026.8.14"
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.13",
16
+ "version": "2026.8.14",
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.13",
3
+ "version": "2026.8.14",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -120,7 +120,7 @@
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 && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions 114 --max-coverage-ignore-pragmas 477 --min-docstring-coverage 100 --min-exported-docstring-coverage 100 --min-member-docstring-coverage 100 && 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/absence-tolerance-gate.mjs && node scripts/release/token-budget-gate.mjs && node scripts/release/context-intent-calibration-gate.mjs && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json && 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 && node dist/cli.js assurance run record-integrity --trigger ci --dry-run --json",
123
+ "quality:static": "pnpm build && pnpm exec tsx scripts/release/static-quality-gate.mts --max-eslint-suppressions 113 --max-coverage-ignore-pragmas 477 --min-docstring-coverage 100 --min-exported-docstring-coverage 100 --min-member-docstring-coverage 100 && 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/absence-tolerance-gate.mjs && node scripts/release/token-budget-gate.mjs && node scripts/release/context-intent-calibration-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
124
  "quality:token-budget": "node scripts/release/token-budget-gate.mjs",
125
125
  "quality:token-surface": "node scripts/measure-agent-token-surface.mjs --check",
126
126
  "quality:token-surface:update": "pnpm build && node scripts/measure-agent-token-surface.mjs --update",
@@ -130,7 +130,7 @@
130
130
  "quality:retrieval-eval": "pnpm build && node scripts/release/retrieval-eval-gate.mjs",
131
131
  "quality:retrieval-eval:update": "pnpm build && node scripts/release/retrieval-eval-gate.mjs --update",
132
132
  "quality:gate-registry": "pnpm build && node scripts/release/gate-registry.mjs",
133
- "quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json",
133
+ "quality:tracker-measurements": "pnpm build && node dist/cli.js assurance run tracker-context-quality --trigger ci --dry-run --json --output-budget unbounded",
134
134
  "quality:package-artifact": "pnpm build && node scripts/release/package-artifact-gate.mjs",
135
135
  "quality:surface-replication": "node scripts/release/surface-replication-gate.mjs",
136
136
  "quality:absence-tolerance": "node scripts/release/absence-tolerance-gate.mjs",
@@ -219,11 +219,11 @@
219
219
  "eslint-plugin-sonarjs": "^4.2.0",
220
220
  "eslint-plugin-unicorn": "^73.0.0",
221
221
  "fast-check": "^4.9.0",
222
- "greptile": "^3.3.1",
223
- "jscpd": "^5.0.14",
222
+ "greptile": "^3.4.0",
223
+ "jscpd": "^5.0.15",
224
224
  "tsx": "^4.23.12",
225
225
  "typescript": "^6.0.3",
226
- "typescript-eslint": "^8.66.0",
226
+ "typescript-eslint": "^8.67.0",
227
227
  "vitest": "^4.1.10",
228
228
  "yaml": "^2.9.0"
229
229
  }
@@ -58,6 +58,7 @@ export function activate(api: ExtensionApi): void {
58
58
  {
59
59
  action: "beads-import",
60
60
  description: "Import Beads JSONL records into pm items.",
61
+ intent: "Import Beads records through audited pm item mutations.",
61
62
  failure_hints: [
62
63
  "Use the host-global --author <id> flag when an explicit mutation identity override is required.",
63
64
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.14",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for importing Beads JSONL records.",
@@ -217,6 +217,7 @@ function calendarCommand(name: "calendar" | "cal"): CommandDefinition {
217
217
  name,
218
218
  action: "calendar",
219
219
  description: "Show deadline, reminder, and scheduled event calendar views.",
220
+ intent: "Inspect time-bounded project context across schedules and work.",
220
221
  arguments: [
221
222
  {
222
223
  name: "view",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-calendar",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.14",
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.13",
3
+ "version": "2026.8.14",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.",
@@ -697,6 +697,7 @@ export function buildTwinCommands(): CommandDefinition[] {
697
697
  action: "twin-entity-create",
698
698
  description:
699
699
  "Create a stable facility or asset identity and its first immutable state event.",
700
+ intent: "Create one digital-twin entity with an attributable initial state.",
700
701
  arguments: ENTITY_ARGUMENT,
701
702
  flags: [
702
703
  { long: "--title", value_name: "text", value_type: "string" },
@@ -728,6 +729,7 @@ export function buildTwinCommands(): CommandDefinition[] {
728
729
  action: "twin-observe",
729
730
  description:
730
731
  "Append an attributable observation or correction with optimistic concurrency.",
732
+ intent: "Append a versioned observation to one digital-twin entity.",
731
733
  arguments: ENTITY_ARGUMENT,
732
734
  flags: [
733
735
  {
@@ -756,6 +758,7 @@ export function buildTwinCommands(): CommandDefinition[] {
756
758
  action: "twin-relate",
757
759
  description:
758
760
  "Append or supersede one typed containment, flow, or utility relationship.",
761
+ intent: "Record one typed relationship in the digital-twin topology.",
759
762
  arguments: ENTITY_ARGUMENT,
760
763
  flags: [
761
764
  {
@@ -789,6 +792,7 @@ export function buildTwinCommands(): CommandDefinition[] {
789
792
  action: "twin-query",
790
793
  description:
791
794
  "Query point-in-time state, topology, provenance, conflicts, invariants, and impact.",
795
+ intent: "Inspect one entity's point-in-time state and topology impact.",
792
796
  arguments: ENTITY_ARGUMENT,
793
797
  flags: [
794
798
  { long: "--at", value_name: "iso", value_type: "string" },
@@ -802,6 +806,7 @@ export function buildTwinCommands(): CommandDefinition[] {
802
806
  action: "twin-export",
803
807
  description:
804
808
  "Export a bounded shell-friendly event bundle with a tamper-evident checkpoint.",
809
+ intent: "Export a bounded portable digital-twin event bundle.",
805
810
  flags: [
806
811
  { long: "--at", value_name: "iso", value_type: "string" },
807
812
  { long: "--limit", value_name: "n", value_type: "number" },
@@ -813,6 +818,7 @@ export function buildTwinCommands(): CommandDefinition[] {
813
818
  action: "twin-import",
814
819
  description:
815
820
  "Validate and idempotently merge a portable offline replica bundle.",
821
+ intent: "Validate and merge an offline digital-twin replica bundle.",
816
822
  flags: [
817
823
  {
818
824
  long: "--payload",
@@ -828,6 +834,7 @@ export function buildTwinCommands(): CommandDefinition[] {
828
834
  action: "twin-verify",
829
835
  description:
830
836
  "Verify checkpoint integrity, deterministic replay, topology, and invariants.",
837
+ intent: "Verify digital-twin replay, checkpoint, topology, and invariants.",
831
838
  flags: [{ long: "--at", value_name: "iso", value_type: "string" }],
832
839
  run: runVerify,
833
840
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-digital-twin",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.14",
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.",
@@ -327,6 +327,7 @@ function dedupeAuditCommand(): CommandDefinition {
327
327
  action: "dedupe-audit",
328
328
  description:
329
329
  "Audit likely duplicate items by title and parent scope heuristics.",
330
+ intent: "Find likely duplicate work without mutating the tracker.",
330
331
  flags: [...dedupeAuditFlags],
331
332
  run: async (context) =>
332
333
  runDedupeAuditPackage(context.options, context.global),
@@ -339,6 +340,7 @@ function dedupeMergeCommand(): CommandDefinition {
339
340
  action: "dedupe-merge",
340
341
  description:
341
342
  "Consolidate duplicates into a canonical item: re-parent active children and close duplicates with duplicate_of.",
343
+ intent: "Preview or apply an evidence-preserving duplicate consolidation.",
342
344
  flags: [...dedupeMergeFlags],
343
345
  run: async (context) =>
344
346
  runDedupeMergePackage(context.options, context.global),
@@ -350,6 +352,7 @@ function commentsAuditCommand(): CommandDefinition {
350
352
  name: "comments-audit",
351
353
  action: "comments-audit",
352
354
  description: "Audit item comment coverage and export comment history rows.",
355
+ intent: "Audit comment coverage and read bounded comment-history evidence.",
353
356
  flags: [...commentsAuditFlags],
354
357
  run: async (context) =>
355
358
  runCommentsAuditPackage(context.options, context.global),
@@ -361,6 +364,7 @@ function normalizeCommand(): CommandDefinition {
361
364
  name: "normalize",
362
365
  action: "normalize",
363
366
  description: "Plan/apply lifecycle metadata normalization sweeps.",
367
+ intent: "Preview or apply deterministic lifecycle metadata normalization.",
364
368
  flags: [...normalizeFlags],
365
369
  run: async (context) =>
366
370
  runNormalizePackage(context.options, context.global),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-governance-audit",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.14",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for governance audit and normalization workflows.",
@@ -94,6 +94,7 @@ function guideCommand(): CommandDefinition {
94
94
  name: "guide",
95
95
  action: "guide",
96
96
  description: "Show migration and usage guidance for pm command families.",
97
+ intent: "Read focused local guidance for one pm workflow.",
97
98
  arguments: [
98
99
  { name: "topic", required: false, description: "Optional guide topic." },
99
100
  ],
@@ -108,6 +109,7 @@ function completionCommand(): CommandDefinition {
108
109
  name: "completion",
109
110
  action: "completion",
110
111
  description: "Generate shell completion scripts for bash, zsh, and fish.",
112
+ intent: "Generate a completion script for the selected shell.",
111
113
  arguments: [
112
114
  {
113
115
  name: "shell",
@@ -126,6 +128,7 @@ function completionTagsCommand(): CommandDefinition {
126
128
  name: "completion-tags",
127
129
  action: "completion-tags",
128
130
  description: "Print known tags for completion filters.",
131
+ intent: "List tag values for lazy shell completion.",
129
132
  run: async (context) => runCompletionTagsPackage(context.global),
130
133
  };
131
134
  }
@@ -135,6 +138,7 @@ function completionStatusesCommand(): CommandDefinition {
135
138
  name: "completion-statuses",
136
139
  action: "completion-statuses",
137
140
  description: "Print runtime status IDs for completion filters.",
141
+ intent: "List runtime status values for shell completion.",
138
142
  run: async (context) => runCompletionStatusesPackage(context.global),
139
143
  };
140
144
  }
@@ -144,6 +148,7 @@ function completionTypesCommand(): CommandDefinition {
144
148
  name: "completion-types",
145
149
  action: "completion-types",
146
150
  description: "Print runtime item type IDs for completion filters.",
151
+ intent: "List runtime item types for shell completion.",
147
152
  run: async (context) => runCompletionTypesPackage(context.global),
148
153
  };
149
154
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-guide-shell",
3
- "version": "2026.8.13",
3
+ "version": "2026.8.14",
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.13",
3
+ "version": "2026.8.14",
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.13",
3
+ "version": "2026.8.14",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package demonstrating safe lifecycle hook registration.",