@unbrained/pm-cli 2026.9.1 → 2026.9.3

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 (133) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +27 -0
  3. package/dist/cli/after-command-context-usage.js +16 -3
  4. package/dist/cli-bundle/bundle-manifest.json +153 -153
  5. package/dist/cli-bundle/chunks/{chunk-6XIIGE7U.js → chunk-34HASX3S.js} +2 -2
  6. package/dist/cli-bundle/chunks/chunk-AY324UJ5.js +9 -0
  7. package/dist/cli-bundle/chunks/{chunk-TAG4VC22.js → chunk-DKGP3QLE.js} +27 -27
  8. package/dist/cli-bundle/chunks/chunk-E5RBBCXO.js +230 -0
  9. package/dist/cli-bundle/chunks/{chunk-DTGWEL23.js → chunk-EDPIS7EB.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-X4RCGLTX.js → chunk-IEHHE6GA.js} +5 -5
  11. package/dist/cli-bundle/chunks/{chunk-U45JXJCC.js → chunk-L7B7343B.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-2MC2LCXZ.js → chunk-LENC656S.js} +41 -41
  13. package/dist/cli-bundle/chunks/chunk-LISESA7W.js +35 -0
  14. package/dist/cli-bundle/chunks/{chunk-3WICXLVT.js → chunk-UPPM2FOZ.js} +2 -2
  15. package/dist/cli-bundle/chunks/{chunk-Y7VOMSZT.js → chunk-Y4PJ6HPK.js} +2 -2
  16. package/dist/cli-bundle/chunks/{register-list-query-XYNX4ASQ.js → register-list-query-W2ZTOMKP.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-mutation-2MVLRS3J.js → register-mutation-RVND5NCG.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-operations-WCIDXBU3.js → register-operations-TTROIVC4.js} +2 -2
  19. package/dist/cli-bundle/chunks/{register-setup-KVNC5KPL.js → register-setup-D3ZFHY3L.js} +2 -2
  20. package/dist/cli-bundle/focused-chunks/chunk-3ZBI35HU.js +176 -0
  21. package/dist/cli-bundle/focused-chunks/{chunk-SVXJYD6G.js → chunk-4HJFY4MB.js} +2 -2
  22. package/dist/cli-bundle/focused-chunks/chunk-4RRHC3S4.js +6 -0
  23. package/dist/cli-bundle/focused-chunks/chunk-4WR46RMG.js +9 -0
  24. package/dist/cli-bundle/focused-chunks/chunk-5RFXUPN5.js +3 -0
  25. package/dist/cli-bundle/focused-chunks/chunk-BWKHEIVF.js +2 -0
  26. package/dist/cli-bundle/focused-chunks/{chunk-4O4CJAR6.js → chunk-D7KXFBXV.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/{chunk-MKHG3T76.js → chunk-GHCZ3YFR.js} +3 -3
  28. package/dist/cli-bundle/focused-chunks/{chunk-KB5OFSFD.js → chunk-GT7MXDLW.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/chunk-KBLZRU62.js +2 -0
  30. package/dist/cli-bundle/focused-chunks/chunk-KZ2NB3ET.js +2 -0
  31. package/dist/cli-bundle/focused-chunks/chunk-M5M6SVHS.js +3 -0
  32. package/dist/cli-bundle/focused-chunks/{chunk-BEVHCEWG.js → chunk-OL5EH6I3.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-MEASX544.js → chunk-Q45NHPF2.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-Y6JJIX6I.js → chunk-QKHCSUGJ.js} +48 -48
  35. package/dist/cli-bundle/focused-chunks/chunk-S27XMBIN.js +8 -0
  36. package/dist/cli-bundle/focused-chunks/chunk-TXE4TSHM.js +12 -0
  37. package/dist/cli-bundle/focused-chunks/chunk-UCLO3XDU.js +2 -0
  38. package/dist/cli-bundle/main.js +15 -15
  39. package/dist/cli-bundle/sdk-authoring.js +1 -1
  40. package/dist/cli-bundle/sdk-contracts.js +1 -1
  41. package/dist/cli-bundle/sdk-core.js +28 -28
  42. package/dist/cli-bundle/sdk-governance.js +1 -1
  43. package/dist/cli-bundle/sdk-graph.js +1 -1
  44. package/dist/cli-bundle/sdk-merge.js +35 -33
  45. package/dist/cli-bundle/sdk-query.js +1 -1
  46. package/dist/cli-bundle/sdk-runtime.js +1 -1
  47. package/dist/cli-bundle/sdk-testing.js +1 -1
  48. package/dist/cli-bundle/sdk.js +9 -9
  49. package/dist/core/diagnostics/remediation.js +9 -4
  50. package/dist/core/history/event-classification.d.ts +21 -0
  51. package/dist/core/history/event-classification.js +109 -0
  52. package/dist/core/history/event-index.d.ts +14 -3
  53. package/dist/core/history/event-index.js +543 -88
  54. package/dist/core/history/history.js +47 -18
  55. package/dist/core/history/workspace-history.js +7 -6
  56. package/dist/core/lock/lock.d.ts +22 -2
  57. package/dist/core/lock/lock.js +121 -19
  58. package/dist/core/output/output.js +31 -7
  59. package/dist/core/shared/time.d.ts +2 -0
  60. package/dist/core/shared/time.js +8 -2
  61. package/dist/core/store/item-metadata-query-index.js +5 -5
  62. package/dist/sdk/context/recency.d.ts +9 -0
  63. package/dist/sdk/context/recency.js +34 -0
  64. package/dist/sdk/context/usage-egress.d.ts +9 -0
  65. package/dist/sdk/context/usage-egress.js +30 -0
  66. package/dist/sdk/context-intent-contracts.js +7 -3
  67. package/dist/sdk/context-relevance.d.ts +23 -0
  68. package/dist/sdk/context-relevance.js +94 -23
  69. package/dist/sdk/context-signal-store.d.ts +7 -3
  70. package/dist/sdk/context-signal-store.js +155 -42
  71. package/dist/sdk/context-usage.d.ts +54 -0
  72. package/dist/sdk/context-usage.js +245 -16
  73. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -14
  74. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +14 -2
  75. package/dist/sdk/governance/health.js +77 -11
  76. package/dist/sdk/governance/validate.js +4 -2
  77. package/dist/sdk/index.d.ts +2 -0
  78. package/dist/sdk/index.js +4 -2
  79. package/dist/sdk/init.d.ts +2 -0
  80. package/dist/sdk/init.js +18 -9
  81. package/dist/sdk/merge/index.d.ts +1 -1
  82. package/dist/sdk/merge/index.js +2 -2
  83. package/dist/sdk/merge/receipts.d.ts +24 -0
  84. package/dist/sdk/merge/receipts.js +122 -30
  85. package/dist/sdk/query/context.d.ts +3 -1
  86. package/dist/sdk/query/context.js +21 -9
  87. package/dist/sdk/query/next.js +18 -9
  88. package/dist/sdk/runtime-input.d.ts +2 -0
  89. package/dist/sdk/runtime-input.js +25 -2
  90. package/dist/sdk/runtime.d.ts +1 -0
  91. package/dist/sdk/runtime.js +17 -26
  92. package/dist/types.d.ts +2 -0
  93. package/dist/types.js +2 -2
  94. package/docs/CONTEXT_RECOVERY_PRIMITIVES.md +11 -2
  95. package/docs/CONTEXT_RELEVANCE.md +44 -1
  96. package/docs/MERGE_SAFETY.md +16 -2
  97. package/docs/PERFORMANCE.md +6 -3
  98. package/docs/READ_OUTPUT_CONTRACTS.md +9 -1
  99. package/docs/SDK.md +11 -8
  100. package/docs/SDK_CONTEXT.md +7 -0
  101. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +5 -3
  102. package/marketplace.json +2 -2
  103. package/package.json +4 -4
  104. package/packages/pm-beads/package.json +1 -1
  105. package/packages/pm-calendar/package.json +1 -1
  106. package/packages/pm-command-kit/package.json +1 -1
  107. package/packages/pm-digital-twin/package.json +1 -1
  108. package/packages/pm-governance-audit/package.json +1 -1
  109. package/packages/pm-guide-shell/package.json +1 -1
  110. package/packages/pm-kanban/package.json +1 -1
  111. package/packages/pm-lifecycle-hooks/package.json +1 -1
  112. package/packages/pm-linked-test-adapters/package.json +1 -1
  113. package/packages/pm-search-advanced/package.json +1 -1
  114. package/packages/pm-templates/package.json +1 -1
  115. package/packages/pm-todos/package.json +1 -1
  116. package/packages/pm-vcs/package.json +1 -1
  117. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  118. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  119. package/sdk/public-surface.json +268 -28
  120. package/dist/cli-bundle/chunks/chunk-ALKKAUFN.js +0 -35
  121. package/dist/cli-bundle/chunks/chunk-GOACULJW.js +0 -13
  122. package/dist/cli-bundle/chunks/chunk-NOPL37X4.js +0 -205
  123. package/dist/cli-bundle/focused-chunks/chunk-2FEZ5SKM.js +0 -3
  124. package/dist/cli-bundle/focused-chunks/chunk-6GCRSLPG.js +0 -2
  125. package/dist/cli-bundle/focused-chunks/chunk-7VATS5QY.js +0 -16
  126. package/dist/cli-bundle/focused-chunks/chunk-FWPLDEXF.js +0 -2
  127. package/dist/cli-bundle/focused-chunks/chunk-JEFKLWMM.js +0 -2
  128. package/dist/cli-bundle/focused-chunks/chunk-PF3E6Q36.js +0 -8
  129. package/dist/cli-bundle/focused-chunks/chunk-QDFJIRKN.js +0 -4
  130. package/dist/cli-bundle/focused-chunks/chunk-RMRCQPWU.js +0 -2
  131. package/dist/cli-bundle/focused-chunks/chunk-S4U5CN5Q.js +0 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-T2LXXSOD.js +0 -158
  133. package/dist/cli-bundle/focused-chunks/chunk-Z2USIBR2.js +0 -5
@@ -4,7 +4,7 @@
4
4
  * Defines public SDK APIs and package-author helpers for Runtime.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b67ba0fe-bbca-57ab-b3be-a4a028f21de4")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="099c7cda-4a92-553c-ad60-00e185b5971b")}catch(e){}}();
8
8
  export { PM_GITIGNORE_END, PM_GITIGNORE_START, ensurePmGitignore, getPmGitignoreBlock, } from "./workspace.js";
9
9
  export { SEARCH_EXTENSION_FLAG_DEFINITIONS } from "./extension-contracts.js";
10
10
  export * from "./cli-contracts/agent-output-contracts.js";
@@ -33,6 +33,7 @@ import { SDK_ACTION_ALIASES } from "./runtime-action-aliases.js";
33
33
  import { createExtensionCommandSdk } from "./extension-command-context.js";
34
34
  import { createUnknownSubcommandError } from "./agent/subcommand-recovery.js";
35
35
  import { applyContextIntentProjection, attachReadOutputContracts, } from "./context-intent-contracts.js";
36
+ import { finalizeContextUsageEgress } from "./context/usage-egress.js";
36
37
  import { runWithDiscoveredContextIntentContracts, } from "./context-intent-runtime.js";
37
38
  import { normalizeReadOutputIncludeModeOptions, validateReadOutputOptions, } from "./read-output-contracts.js";
38
39
  export { clearWorkspaceContractsCache } from "./workspace-contracts-cache.js";
@@ -65,14 +66,14 @@ import { runHealth, } from "./governance/health.js";
65
66
  import { runValidate, } from "./governance/validate.js";
66
67
  import { runExtension, } from "./extension.js";
67
68
  import { runConfig } from "./config.js";
68
- import { runInit } from "./init.js";
69
+ import { INIT_INVOCATION_CWD, runInit } from "./init.js";
69
70
  import { runRuntimeEvalAction, runRuntimeEventsAction, runRuntimeMergeAction, runRuntimeSchedulingAction, runRuntimeWorkspaceAction, } from "./runtime-extended-actions.js";
70
71
  import { acknowledgeUnknownAuthorHistoryEventsFromTransport, } from "./author-attribution.js";
71
72
  import { PROFILE_SUBCOMMANDS, runProfileApply, runProfileLint, runProfileList, runProfileShow, } from "./profile.js";
72
73
  import { runHistoryRedact, } from "./history-redact.js";
73
74
  import { runMcpHistoryCompactAction, runMcpHistoryRepairAction, } from "./history-mcp.js";
74
75
  import { runMcpCloseAction, runMcpReopenAction } from "./lifecycle/mcp-actions.js";
75
- import { actionGlobalOptions as globalOptions, closeManyOptionsFromFlat, extensionOptionsFromArgs, graphOptionsFromFlat, mutationListOptions, mutationOptionsWithOverrides, normalizeActionName, normalizeCommandPath, normalizeMcpOptionsArrays, normalizeMcpUpdateOptions, optionsWithAuthor, parseRuntimeInteger as parseMcpInteger, readRuntimeScalarString as readScalarString, readRuntimeScalarStringAllowBlank as readScalarStringAllowBlank, readRuntimeString as readString, readRuntimeStringArray as readStringArray, resolveRuntimeLimit, updateManyOptionsFromFlat, withAddNoteOption, withFilesDiscoveryOptions, withMutationCompaction, } from "./runtime-input.js";
76
+ import { actionGlobalOptions as globalOptions, closeManyOptionsFromFlat, extensionOptionsFromArgs, graphOptionsFromFlat, mutationListOptions, mutationOptionsWithOverrides, normalizeActionName, normalizeCommandPath, normalizeMcpOptionsArrays, normalizeMcpUpdateOptions, optionsWithAuthor, parseRuntimeInteger as parseMcpInteger, readRuntimeScalarString as readScalarString, readRuntimeScalarStringAllowBlank as readScalarStringAllowBlank, readRuntimeString as readString, readRuntimeStringArray as readStringArray, resolveRuntimeLimit, shouldInvalidateWorkspaceContractsCacheAfterAction, updateManyOptionsFromFlat, withAddNoteOption, withFilesDiscoveryOptions, withMutationCompaction, } from "./runtime-input.js";
76
77
  import { runDeps } from "./dependencies.js";
77
78
  import { runDocs } from "./docs.js";
78
79
  import { runGraph, } from "./graph/run.js";
@@ -92,6 +93,7 @@ import { SCHEMA_SUBCOMMANDS, runSchemaAddField, runSchemaAddStatus, runSchemaAdd
92
93
  export { getActiveExtensionRegistrations, runActiveOnReadHooks, runActiveOnWriteHooks, } from "../core/extensions/index.js";
93
94
  export { pathExists, readFileIfExists, removeFileIfExists, writeFileAtomic, } from "../core/fs/fs-utils.js";
94
95
  export { appendHistoryEntry, createHistoryEntry, } from "../core/history/history.js";
96
+ export { classifyHistoryEvent, HISTORY_EVENT_CLASSIFICATION_VERSION, MAINTENANCE_HISTORY_OPERATIONS, SUBSTANTIVE_HISTORY_OPERATIONS } from "../core/history/event-classification.js";
95
97
  export { generateItemId, normalizeItemId, normalizeRawItemId, } from "../core/item/id.js";
96
98
  export { readBooleanOption, readCsvListOption, readStringOption, } from "./package-runtime-options.js";
97
99
  export { PM_CLI_EXPECTED_ERROR_NAME, createPmCliExpectedError, isPmCliExpectedError, } from "./errors.js";
@@ -1276,24 +1278,6 @@ async function withCwd(cwd, run) {
1276
1278
  process.chdir(previous);
1277
1279
  }
1278
1280
  }
1279
- const WORKSPACE_CONTRACTS_CACHE_PRESERVING_ACTIONS = new Set([
1280
- "activity",
1281
- "aggregate",
1282
- "context",
1283
- "contracts",
1284
- "deps",
1285
- "files-discover",
1286
- "get",
1287
- "graph",
1288
- "health",
1289
- "history",
1290
- "list",
1291
- "next",
1292
- "search",
1293
- "stats",
1294
- "telemetry",
1295
- "validate",
1296
- ]);
1297
1281
  function resolveSdkActionInput(args) {
1298
1282
  const rawAction = readRequiredString(args, "action");
1299
1283
  const normalizedAction = normalizeActionName(rawAction);
@@ -1311,9 +1295,6 @@ function resolveSdkActionInput(args) {
1311
1295
  }
1312
1296
  return { action, args: resolvedArgs };
1313
1297
  }
1314
- function shouldInvalidateWorkspaceContractsCacheAfterAction(action) {
1315
- return !WORKSPACE_CONTRACTS_CACHE_PRESERVING_ACTIONS.has(normalizeActionName(action));
1316
- }
1317
1298
  /** Execute one native or extension-contributed pm action in-process. */
1318
1299
  export async function runAction(args) {
1319
1300
  const resolved = resolveSdkActionInput(args);
@@ -1328,6 +1309,14 @@ export async function runAction(args) {
1328
1309
  // pins process.cwd() (inside the serialized slot) for the built-in handler.
1329
1310
  const explicitCwd = readString(resolved.args, "cwd");
1330
1311
  const resolutionCwd = explicitCwd ?? process.cwd();
1312
+ if (resolved.action === "init") {
1313
+ global[INIT_INVOCATION_CWD] = resolutionCwd;
1314
+ }
1315
+ if (resolved.action !== "init" ||
1316
+ global.path !== undefined ||
1317
+ (process.env.PM_PATH?.trim().length ?? 0) > 0) {
1318
+ global.path = resolvePmRoot(resolutionCwd, global.path);
1319
+ }
1331
1320
  try {
1332
1321
  if (args[ACTIVE_EXTENSION_HOST_CONTEXT] === true ||
1333
1322
  activeExtensionScope.getStore() === true) {
@@ -1886,7 +1875,9 @@ async function dispatchAction(action, args, global, activeExtensions) {
1886
1875
  ? await handler(ctx)
1887
1876
  : await dispatchActiveExtensionAction(action, args, options, global, activeExtensions);
1888
1877
  options.resolvedOutputFormat = "json";
1889
- return attachReadOutputContracts(action, options, result);
1878
+ const projected = attachReadOutputContracts(action, options, result);
1879
+ await finalizeContextUsageEgress(resolvePmRoot(process.cwd(), global.path), projected);
1880
+ return projected;
1890
1881
  }
1891
1882
  const actionRunnerTestHooks = {
1892
1883
  closeManyOptionsFromFlat,
@@ -1933,4 +1924,4 @@ async function loadWorkspaceExtensionRegistrations(pmRoot, settings, cwd) {
1933
1924
  }
1934
1925
  }
1935
1926
  //# sourceMappingURL=runtime.js.map
1936
- //# debugId=b67ba0fe-bbca-57ab-b3be-a4a028f21de4
1927
+ //# debugId=099c7cda-4a92-553c-ad60-00e185b5971b
package/dist/types.d.ts CHANGED
@@ -829,6 +829,8 @@ export interface HistoryEntry {
829
829
  };
830
830
  /** Value that configures or reports op for this contract. */
831
831
  op: string;
832
+ /** Declared semantic effect used by recency consumers. Absent on legacy entries. */
833
+ event_class?: "substantive" | "maintenance";
832
834
  /** Value that configures or reports patch for this contract. */
833
835
  patch: HistoryPatchOp[];
834
836
  /** Value that configures or reports before hash for this contract. */
package/dist/types.js CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
  /** Supported values accepted by the builtin item type contract. */
7
7
 
8
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="64223a83-1287-57ac-915d-dbd5e375a6eb")}catch(e){}}();
8
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="668a8823-62c4-5c69-9b9b-0c72d6d94b2b")}catch(e){}}();
9
9
  export const BUILTIN_ITEM_TYPE_VALUES = [
10
10
  "Epic",
11
11
  "Feature",
@@ -243,4 +243,4 @@ export const CONTEXT_SECTION_VALUES = [
243
243
  "tests",
244
244
  ];
245
245
  //# sourceMappingURL=types.js.map
246
- //# debugId=64223a83-1287-57ac-915d-dbd5e375a6eb
246
+ //# debugId=668a8823-62c4-5c69-9b9b-0c72d6d94b2b
@@ -1,6 +1,6 @@
1
1
  # Context Integrity and Recovery Primitives
2
2
 
3
- Tracker: [pm-hu92i3](../.agents/pm/issues/pm-hu92i3.toon), [pm-nc94mk](../.agents/pm/issues/pm-nc94mk.toon), [pm-xrjy8o](../.agents/pm/issues/pm-xrjy8o.toon), [pm-f60039](../.agents/pm/issues/pm-f60039.toon), [pm-2qahia](../.agents/pm/issues/pm-2qahia.toon), [pm-z1z96w](../.agents/pm/issues/pm-z1z96w.toon), [pm-yhle2e](../.agents/pm/issues/pm-yhle2e.toon), [pm-t7wl00](../.agents/pm/issues/pm-t7wl00.toon), [pm-hiqlkh](../.agents/pm/issues/pm-hiqlkh.toon), [pm-ntnv4k](../.agents/pm/issues/pm-ntnv4k.toon), [pm-sxg7wl](../.agents/pm/issues/pm-sxg7wl.toon), [pm-xspd](../.agents/pm/chores/pm-xspd.toon)
3
+ Tracker: [pm-dn8rwl](../.agents/pm/issues/pm-dn8rwl.toon), [pm-r97901](../.agents/pm/issues/pm-r97901.toon), [pm-hu92i3](../.agents/pm/issues/pm-hu92i3.toon), [pm-nc94mk](../.agents/pm/issues/pm-nc94mk.toon), [pm-xrjy8o](../.agents/pm/issues/pm-xrjy8o.toon), [pm-f60039](../.agents/pm/issues/pm-f60039.toon), [pm-2qahia](../.agents/pm/issues/pm-2qahia.toon), [pm-z1z96w](../.agents/pm/issues/pm-z1z96w.toon), [pm-yhle2e](../.agents/pm/issues/pm-yhle2e.toon), [pm-t7wl00](../.agents/pm/issues/pm-t7wl00.toon), [pm-hiqlkh](../.agents/pm/issues/pm-hiqlkh.toon), [pm-ntnv4k](../.agents/pm/issues/pm-ntnv4k.toon), [pm-sxg7wl](../.agents/pm/issues/pm-sxg7wl.toon), [pm-xspd](../.agents/pm/chores/pm-xspd.toon)
4
4
 
5
5
  `project management = context management`: a successful command is useful only when the context it records and later returns is truthful, lossless, and actionable. These SDK-owned primitives are shared by the CLI and package integrations.
6
6
 
@@ -59,7 +59,16 @@ history.
59
59
 
60
60
  Health keeps the metadata-only cache path for clean history streams. A cached hash mismatch, chain mismatch, or writer-version skew is only a candidate: health rereads canonical item sources and verifies stream content hashes before reporting corruption. The `history_drift` details expose `cache_confirmation` candidate, confirmed, and resolved-false-positive item sets, while `cache_hit_verification: metadata_then_content_hash` identifies the authoritative fallback. Drift-cache envelopes carry both their schema version and the current item-hash capability, so changing legacy canonicalization invalidates prior verdicts and a runtime with incompatible hash semantics rebuilds the cache instead of trusting it.
61
61
 
62
- Merge reconciliation may consume a durable hash-only receipt without `--force` only when its canonical item path, complete declared-field set, and every merged-value hash exactly match the current item snapshot. Raw discarded values remain clone-local. Any incomplete or mismatched proof fails closed. SDK gates use `inspectMergeReceiptEvidence` or `runMergeReceiptEvidenceReport` to retain the distinction between no evidence, rejected evidence, and clone-local evidence whose Git directory could not be resolved; `clone_local_evidence_resolved=false` makes the loss-aware report incomplete. The list-only and legacy report compatibility projections intentionally return valid receipts only. Diverged history unions also fail closed when deterministic suffix ordering would make any patch operation inapplicable, instead of publishing a rehashed stream with a skipped branch effect.
62
+ Merge reconciliation may consume a durable hash-only receipt without `--force` only when its canonical item path, complete declared-field set, and every merged-value hash exactly match the current item snapshot. Raw discarded values remain clone-local. Any incomplete or mismatched proof fails closed. SDK gates use `inspectMergeReceiptEvidence` or `runMergeReceiptEvidenceReport` to retain the distinction between no evidence, rejected evidence, and clone-local evidence whose Git directory could not be resolved; `clone_local_evidence_resolved=false` makes the loss-aware report incomplete. Rejected evidence carries bounded privacy-safe source, reason, and receipt-id-or-hash locators, while the exact count and truncation receipt preserve completeness under an agent token budget. Cross-platform ancestor inspection distinguishes an absent receipt store from an unreadable or non-directory root. The list-only and legacy report compatibility projections intentionally return valid receipts only. Diverged history unions also fail closed when deterministic suffix ordering would make any patch operation inapplicable, instead of publishing a rehashed stream with a skipped branch effect.
63
+
64
+ History receipt summaries are durable references, not cleanup hints. Health
65
+ checks each `context.merge.receipts[].receipt_id` against valid pending and
66
+ reconciled authoritative evidence. A missing reference is returned with its
67
+ item id and one-based history line; unsafe identifiers are SHA-256 locators
68
+ rather than echoed content. Detail is capped at 100 while the exact count and a
69
+ truncation receipt preserve loss awareness. Recovery means restoring the named
70
+ receipt from an authoritative clone or backup. Rewriting append-only history or
71
+ deleting sibling evidence is never an automatic remediation.
63
72
 
64
73
  ## Strict-create recovery
65
74
 
@@ -1,6 +1,6 @@
1
1
  # Context relevance and packing
2
2
 
3
- Tracked by [pm-4k6b](../.agents/pm/features/pm-4k6b.toon), [pm-3hps](../.agents/pm/tasks/pm-3hps.toon), and [pm-801d](../.agents/pm/features/pm-801d.toon).
3
+ Tracked by [pm-4k6b](../.agents/pm/features/pm-4k6b.toon), [pm-07pt16](../.agents/pm/issues/pm-07pt16.toon), [pm-wv47pf](../.agents/pm/issues/pm-wv47pf.toon), [pm-3hps](../.agents/pm/tasks/pm-3hps.toon), and [pm-801d](../.agents/pm/features/pm-801d.toon).
4
4
 
5
5
  `pm context` and `pm next` share one public SDK relevance pipeline. The built-in
6
6
  commands assemble authoritative item metadata, load rebuildable signal rows,
@@ -73,6 +73,49 @@ Graph proximity normalizes parent and dependency degree. SDK hosts can supply
73
73
  their own pre-normalized signal maps when their project model has richer
74
74
  activity, graph, semantic, or usage data.
75
75
 
76
+ ### Substantive recency
77
+
78
+ Recency is a property of what happened, not of the last file write. Every new
79
+ history entry declares `event_class: substantive|maintenance` through the
80
+ versioned `classifyHistoryEvent()` SDK contract. Legacy entries are classified
81
+ by the same declared operation and patch-field policy; unknown operations fail
82
+ closed as substantive. Package and extension scorers can therefore reuse the
83
+ core vocabulary instead of maintaining private operation lists.
84
+
85
+ The signal selects the most recent substantive history event, then a stamped
86
+ calendar release cohort such as `v2026.7.20`, then `created_at`. It never ranks
87
+ bare `updated_at`, so release attribution, relationship enrichment,
88
+ normalization, linked-artifact updates, and history maintenance cannot promote
89
+ otherwise unchanged work. The rebuildable v5 history-event index stores the
90
+ declared class and retrieves one latest substantive row per requested stream;
91
+ individual immutable streams remain the authoritative fallback. Rebuilds,
92
+ indexed validation reads, and compliant indexed appends share one cross-process
93
+ coordination lock; indexed appends commit their projection row and stream size
94
+ in one SQLite transaction. A lock-conflict fallback append writes authoritative
95
+ history without committing projection data in that transaction, publishes an
96
+ invalidation marker when possible, and discards the derived projection. The
97
+ index must validate or rebuild before serving that append.
98
+
99
+ Explained ranking includes `recency.source`, `coordinate`, and, for history,
100
+ `history_op` plus `event_class` on every served scorer row. Signal snapshots
101
+ persist that evidence alongside the normalized value so a fresh snapshot keeps
102
+ the same explanation as the ranking it serves.
103
+
104
+ ### Delivered usage feedback
105
+
106
+ Usage affinity learns from post-egress delivery rather than pre-budget packing.
107
+ A versioned serve event records the full propensity rows and a correlation id;
108
+ CLI and `PmClient` egress append a delivery event containing the final
109
+ `result_omitted` decision and exact emitted item ids. A whole-result omission
110
+ therefore delivers zero items even when the packer selected rows earlier.
111
+
112
+ Direct `runContext` and `runNext` calls record only their assembled rows on a
113
+ serve event; they do not claim delivery or train affinity by themselves. A
114
+ later CLI or `PmClient` projection appends the correlated delivery decision.
115
+ Legacy serve events have no correlation marker, so the affinity reader ignores
116
+ their inclusion flags and reports them as `untrusted_serving_events` instead of
117
+ training on unverifiable phantom serves.
118
+
76
119
  For corpora of at least 10,000 items, `context` automatically allocates a
77
120
  bounded fraction of its token budget to recent calendar-epoch and epic-lineage
78
121
  rollups. `search` attaches only matching rollups. The projection contains
@@ -105,8 +105,22 @@ whose candidates were all rejected. Gates and diagnostic integrations should
105
105
  use `inspectMergeReceiptEvidence`, whose `invalid_evidence_count` preserves
106
106
  that distinction without returning malformed contents.
107
107
  `runMergeReceiptEvidenceReport` and `pm merge report --json` expose the same
108
- loss-aware contract through `complete`, `invalid_evidence_count`, and
109
- `clone_local_evidence_resolved`; the CLI
108
+ loss-aware contract through `complete`, `invalid_evidence_count`, bounded
109
+ `invalid_evidence[]`, `invalid_evidence_truncated`, and
110
+ `clone_local_evidence_resolved`. Each rejected candidate reports a stable
111
+ reason plus its `clone_local`, `durable`, or copy-consistency source. A safe
112
+ receipt filename is returned as `receipt_id`; unsafe candidate names are
113
+ represented only by `candidate_name_hash`, and malformed contents are never
114
+ returned. The detail list is capped at 100 rows while the count remains exact,
115
+ so automated gates stay token-bounded. Directory traversal distinguishes a
116
+ truly absent store from a non-directory or unreadable ancestor on Windows and
117
+ POSIX instead of treating platform-specific `ENOENT`/`ENOTDIR` spellings as
118
+ equivalent. Full health also cross-checks the privacy-safe receipt summaries in
119
+ append-only history against valid pending and reconciled evidence. Missing
120
+ evidence emits `merge_receipt_history_reference_missing:<n>` with bounded item,
121
+ history-line, and receipt-id-or-hash coordinates. Its remediation enumerates
122
+ the exact references and directs recovery from an authoritative clone or
123
+ backup; it never recommends deleting receipts or rewriting history. The CLI
110
124
  exits nonzero when evidence is incomplete, even when the valid-receipt count is
111
125
  zero. Current SDK implementations always emit the new field, while its optional
112
126
  type preserves structural compatibility for existing typed adapters and test
@@ -12,7 +12,7 @@ Every measured CLI and SDK operation targets:
12
12
  - default output at or below 5,000 estimated tokens;
13
13
  - no feature, flag, output, history, or validation loss.
14
14
 
15
- The committed regression budgets in [`scripts/bench/scale-budgets.json`](../scripts/bench/scale-budgets.json) protect the current baseline while the product targets stay fixed. Short local checks use the best observed latency as a regression floor; statistically meaningful runs of 20 or more use p95. Both receive 25% baseline headroom plus a 25 ms scheduler/filesystem noise margin. Reports always retain min/p50/p95, and product-target status always uses p95. This lets a busy workstation detect deterministic code slowdowns without pretending that three samples produce a meaningful p95 or hiding the real tail-latency target.
15
+ The committed regression budgets in [`scripts/bench/scale-budgets.json`](../scripts/bench/scale-budgets.json) protect the current baseline while the product targets stay fixed. Baseline refreshes use the Node major pinned by release and primary CI workflows (currently Node 24); newer supported runtimes remain compatibility targets, but their startup and memory characteristics must not silently rewrite the release baseline. Short local checks use the best observed latency as a regression floor; statistically meaningful runs of 20 or more use p95. Both receive 25% baseline headroom plus a 25 ms scheduler/filesystem noise margin. Reports always retain min/p50/p95, and product-target status always uses p95. This lets a busy workstation detect deterministic code slowdowns without pretending that three samples produce a meaningful p95 or hiding the real tail-latency target.
16
16
 
17
17
  ## Reproducible fixtures
18
18
 
@@ -92,7 +92,10 @@ probe off and performs no query on the create path; advisory/strict modes reuse
92
92
  one dependency-light SDK scorer with the package-owned dedupe audit. Mutation
93
93
  history events use a separate rebuildable ordered SQLite projection so
94
94
  `pm events --since <cursor>` catch-up cost follows new history rows instead of
95
- workspace size. See [SDK Context Coordination](SDK_CONTEXT_COORDINATION.md).
95
+ workspace size. Its v5 schema also indexes the declared substantive-versus-
96
+ maintenance event class, allowing context recency to fetch only the latest
97
+ substantive row per requested stream instead of folding complete histories on
98
+ each read. See [SDK Context Coordination](SDK_CONTEXT_COORDINATION.md).
96
99
 
97
100
  SDK hosts that commit authoritative item documents outside the stock mutation
98
101
  commands use `acquireItemMetadataDerivedIndexLock` and
@@ -127,7 +130,7 @@ To refresh a baseline after an intentional, measured improvement:
127
130
  pnpm benchmark:scale --items ci --iterations 5 --transport both --update --headroom 1.25
128
131
  ```
129
132
 
130
- Review the report and budget diff together. Never update a budget merely to silence a regression.
133
+ Review the report and budget diff together. Before a refresh, compare the delivery head with its exact base commit using the same runtime, fixture shape, and transport set; retain that evidence on the owning PM item. Never update a budget merely to silence a regression.
131
134
 
132
135
  ## Startup and observability
133
136
 
@@ -1,6 +1,6 @@
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-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), [pm-5t33or](../.agents/pm/features/pm-5t33or.toon), [pm-srns](../.agents/pm/issues/pm-srns.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), [pm-kyjdne](../.agents/pm/issues/pm-kyjdne.toon), [pm-8nev0o](../.agents/pm/issues/pm-8nev0o.toon), [pm-oahhyc](../.agents/pm/issues/pm-oahhyc.toon), [pm-q4isdq](../.agents/pm/issues/pm-q4isdq.toon), [pm-e5gl05](../.agents/pm/issues/pm-e5gl05.toon), [pm-cha95z](../.agents/pm/tasks/pm-cha95z.toon), [pm-2qvq7a](../.agents/pm/issues/pm-2qvq7a.toon), and [pm-xam9bt](../.agents/pm/issues/pm-xam9bt.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-5t33or](../.agents/pm/features/pm-5t33or.toon), [pm-wv47pf](../.agents/pm/issues/pm-wv47pf.toon), [pm-srns](../.agents/pm/issues/pm-srns.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), [pm-kyjdne](../.agents/pm/issues/pm-kyjdne.toon), [pm-8nev0o](../.agents/pm/issues/pm-8nev0o.toon), [pm-oahhyc](../.agents/pm/issues/pm-oahhyc.toon), [pm-q4isdq](../.agents/pm/issues/pm-q4isdq.toon), [pm-e5gl05](../.agents/pm/issues/pm-e5gl05.toon), [pm-cha95z](../.agents/pm/tasks/pm-cha95z.toon), [pm-2qvq7a](../.agents/pm/issues/pm-2qvq7a.toon), and [pm-xam9bt](../.agents/pm/issues/pm-xam9bt.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
@@ -153,6 +153,14 @@ pm contracts --full --json
153
153
 
154
154
  Every projected result carries a `read_output` receipt with the requested dimensions, precedence, observed option provenance, deterministic estimated token count, string/row compaction signals, and budget outcome. When canonical controls are present, `canonical_options_used` records spellings such as `--output-include`; the optional field is omitted when no canonical control was supplied so minimum-budget session receipts remain compact. `legacy_aliases_used` and `migration_hints` record only compatibility flags the caller actually supplied. A command-local flag synthesized internally to execute a canonical projection mode is therefore never misreported as deprecated syntax. When both spellings are supplied, both provenance arrays report that mixed invocation. 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.
155
155
 
156
+ For `context` and `next`, that final projection is also the usage-feedback
157
+ delivery boundary. The SDK carries a JSON-invisible serve receipt through
158
+ intent and universal output projection, then appends the final omitted decision
159
+ and exact emitted item ids. An infeasible output budget records zero delivered
160
+ rows; it can never leave the packer's earlier inclusions marked as served.
161
+ `PmClient` finalizes the receipt before resolving, while the CLI finalizes it
162
+ from the exact active result passed to telemetry and after-command hooks.
163
+
156
164
  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 executable CLI/SDK/MCP recovery options — a default ceiling can override an explicit `--output-limit unbounded`, and that override is reported rather than silent. If a producer supplied an opaque item-page cursor, compaction rebases it to the last row actually returned and reports `continuation_cursor_rebased: true`; following the cursor therefore cannot skip rows removed from the middle of a producer page. If no useful content can fit, `PmReadOutputBudgetExceeded` provides a discriminated omission result, a compact `{ outputBudget: "unbounded" }` recovery object, and `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`.
157
165
 
158
166
  Cursor recovery carries the opaque value once in `recovery.cursor` and declares
package/docs/SDK.md CHANGED
@@ -1773,14 +1773,17 @@ For persistent derived signals, use `ContextSignalStore` with a caller-owned
1773
1773
  `ContextSignalStoreAdapter`, or use `JsonFileContextSignalStoreAdapter` for a
1774
1774
  same-directory atomic JSON snapshot. Each snapshot carries both a
1775
1775
  `format_version` and `signal_set_version`, the authoritative history or index
1776
- `source_cursor`, the stable caller clock, and whether its items came from the
1777
- `derived_index` or `scan_fallback` path. Item rows are deterministic and sorted;
1778
- the snapshot never replaces item or history data.
1779
-
1780
- `readOrRebuild(items, options)` reuses a snapshot only when the cursor and
1781
- complete item-id set match. Missing, stale, version-incompatible, or corrupt
1782
- state is rebuilt from the authoritative items and atomically replaced. The
1783
- result reports `cache_status` and non-fatal `context_signal_store_stale`,
1776
+ `source_cursor`, a deterministic `recency_evidence_fingerprint`, the stable
1777
+ caller clock, and whether its items came from the `derived_index` or
1778
+ `scan_fallback` path. Item rows are deterministic and sorted; the snapshot never
1779
+ replaces item or history data.
1780
+
1781
+ `readOrRebuild(items, options)` reuses a snapshot only when its format and
1782
+ signal-set metadata are supported, its item source matches, and its cursor,
1783
+ complete item-id set, and substantive recency-evidence fingerprint match.
1784
+ Missing, stale, version-incompatible, or corrupt state is rebuilt from the
1785
+ authoritative items and atomically replaced. The result reports `cache_status`
1786
+ and non-fatal `context_signal_store_stale`,
1784
1787
  `context_signal_store_invalid`, or `context_signal_store_write_failed`
1785
1788
  warnings. A write failure still serves the in-memory rebuilt candidates because
1786
1789
  the snapshot is derived, never authoritative. Optional maps for activity density,
@@ -31,6 +31,13 @@ stale, or unwritable snapshots return a stable warning, its meaning, an
31
31
  executable recovery command, and the expected effect. Re-running `pm context`
32
32
  confirms a successful rebuild as fresh.
33
33
 
34
+ Recency uses the public `classifyHistoryEvent()` contract and the most recent
35
+ substantive immutable event, with release-cohort and `created_at` fallbacks.
36
+ Explained ranking carries the selected coordinate, operation, and class.
37
+ `recordContextUsageServing()` plus `recordContextUsageDelivery()` expose the
38
+ same two-phase feedback boundary used by CLI and `PmClient`, so custom hosts can
39
+ correlate propensity rows with the exact result delivered after output budgets.
40
+
34
41
  See [Context relevance and packing](CONTEXT_RELEVANCE.md) for signal and token
35
42
  budgets, and [context coordination](SDK_CONTEXT_COORDINATION.md) for cursored
36
43
  events and duplicate governance.
@@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`.
4
4
 
5
5
  Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
6
6
 
7
- - Catalog error codes: 354
7
+ - Catalog error codes: 356
8
8
  - Executable error codes: 19
9
9
  - Executable-code ratchet floor: 18
10
10
  - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
11
- - Uncovered error codes: 335
12
- - Coverage fraction: 0.053672
11
+ - Uncovered error codes: 337
12
+ - Coverage fraction: 0.053371
13
13
  - Closed-domain probes: 19
14
14
  - Grammar probes: 94
15
15
 
@@ -120,6 +120,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
120
120
  | `history_merge_conflict_markers_detected` | `merge_conflict_markers_detected` | uncovered | none | 0 |
121
121
  | `history_stream_over_compact_threshold` | `history_stream_over_compact_threshold` | uncovered | none | 0 |
122
122
  | `history_target_out_of_range` | `history_target_out_of_range` | uncovered | none | 0 |
123
+ | `history_timestamp_invalid` | `history_timestamp_invalid` | uncovered | none | 0 |
123
124
  | `history_unknown_author_events` | `history_unknown_author_events` | uncovered | none | 0 |
124
125
  | `host_environment_capacity_fault` | `host_environment_capacity_fault` | uncovered | none | 0 |
125
126
  | `host_environment_operation_invalid` | `host_environment_operation_invalid` | uncovered | none | 0 |
@@ -186,6 +187,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
186
187
  | `merge_decisions_unreviewed` | `merge_decisions_unreviewed` | uncovered | none | 0 |
187
188
  | `merge_git_config_unwritable` | `merge_git_config_unwritable` | uncovered | none | 0 |
188
189
  | `merge_receipt_evidence_invalid` | `merge_receipt_evidence_invalid` | uncovered | none | 0 |
190
+ | `merge_receipt_history_reference_missing` | `merge_receipt_history_reference_missing` | uncovered | none | 0 |
189
191
  | `merge_receipts_pending` | `merge_receipts_pending` | uncovered | none | 0 |
190
192
  | `merge_reconcile_receipt_evidence_untrusted` | `merge_reconcile_receipt_evidence_untrusted` | uncovered | none | 0 |
191
193
  | `merge_root_not_found` | `merge_root_not_found` | uncovered | none | 0 |
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.9.1"
9
+ "version": "2026.9.3"
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.9.1",
16
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -206,7 +206,7 @@
206
206
  "node": ">=22.18.0"
207
207
  },
208
208
  "dependencies": {
209
- "@sentry/node": "10.72.0",
209
+ "@sentry/node": "10.73.0",
210
210
  "@toon-format/toon": "^4.1.1",
211
211
  "@types/node": ">=22",
212
212
  "commander": "^15.0.0",
@@ -230,10 +230,10 @@
230
230
  "eslint-plugin-unicorn": "74.0.0",
231
231
  "fast-check": "^4.9.0",
232
232
  "greptile": "^3.4.2",
233
- "jscpd": "^5.0.16",
233
+ "jscpd": "^5.1.1",
234
234
  "tsx": "^4.23.13",
235
235
  "typescript": "^6.0.3",
236
- "typescript-eslint": "^8.68.0",
236
+ "typescript-eslint": "^8.69.0",
237
237
  "vitest": "^4.1.11"
238
238
  }
239
239
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
3
+ "version": "2026.9.3",
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.9.1",
4
+ "version": "2026.9.3",
5
5
  "author": {
6
6
  "name": "unbrained",
7
7
  "url": "https://github.com/unbraind/pm-cli"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-codex",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.3",
4
4
  "description": "Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.",
5
5
  "author": {
6
6
  "name": "unbrained",