@unbrained/pm-cli 2026.9.23 → 2026.9.25

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 (103) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +6 -20
  3. package/CHANGELOG.md +37 -0
  4. package/dist/cli/error-guidance.d.ts +9 -0
  5. package/dist/cli/error-guidance.js +1 -1
  6. package/dist/cli/help-content.js +1 -1
  7. package/dist/cli-bundle/bundle-manifest.json +153 -153
  8. package/dist/cli-bundle/chunks/{chunk-KOUT5SAA.js → chunk-25KTCTBL.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-E6ZES2X7.js → chunk-3IB4THWX.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-PFWCAI4X.js → chunk-445ARBKY.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-VO7DHENB.js → chunk-5AP67ZXH.js} +3 -3
  12. package/dist/cli-bundle/chunks/{chunk-SXRMM72R.js → chunk-COFQCKF4.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-WBB5B7G5.js → chunk-CZ3VJJEA.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-OBTHQ6UX.js → chunk-GAU55CWI.js} +28 -28
  15. package/dist/cli-bundle/chunks/{chunk-ZSVINTXT.js → chunk-GOWZEBTH.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-7IABMUB6.js → chunk-JDHWZYZU.js} +73 -73
  17. package/dist/cli-bundle/chunks/{chunk-ZWSWR2GX.js → chunk-P7ZSJOWH.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-6WBR6GMW.js → chunk-YABJDOOX.js} +63 -62
  19. package/dist/cli-bundle/chunks/{chunk-NBGSRFZE.js → chunk-YDIGMRLZ.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-list-query-IFPQ4YRD.js → register-list-query-IZ7ZVTDE.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-mutation-C3O7OSXW.js → register-mutation-IPAZTFDZ.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-operations-LGO7DBZ7.js → register-operations-APN33LNI.js} +2 -2
  23. package/dist/cli-bundle/chunks/{register-setup-4EW2PPZD.js → register-setup-HPHIKG5U.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-YE6F5HGF.js → chunk-ABA3KRPY.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-S5JYIFFS.js → chunk-HQPTDJLF.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-FIQYVDLL.js → chunk-IXNNMP2R.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/chunk-KRIHJH5U.js +75 -0
  28. package/dist/cli-bundle/focused-chunks/{chunk-LZOEUNHR.js → chunk-MK5AKKHK.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/{chunk-6CWR2QFM.js → chunk-NRHTXBTI.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-L554BKFH.js → chunk-NVVB2HJC.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-PIHQNL32.js → chunk-O7MIBEMK.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-BKXYQQDT.js → chunk-OY3VHCTX.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-N2JYYEHM.js → chunk-PMPFLA6X.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-HJA6OHWT.js → chunk-Q355NPLH.js} +28 -28
  35. package/dist/cli-bundle/focused-chunks/{chunk-BQSKFRL2.js → chunk-TLF6N56J.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-QREDJ77O.js → chunk-UIFVIE5F.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-KMNH4G6Y.js → chunk-V2X37U6J.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-E5AOEXF5.js → chunk-XKH2FC5D.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/{chunk-BULUJEOL.js → chunk-Y2M4QLAA.js} +2 -2
  40. package/dist/cli-bundle/main.js +22 -22
  41. package/dist/cli-bundle/sdk-authoring.js +1 -1
  42. package/dist/cli-bundle/sdk-contracts.js +1 -1
  43. package/dist/cli-bundle/sdk-core.js +30 -45
  44. package/dist/cli-bundle/sdk-governance.js +1 -1
  45. package/dist/cli-bundle/sdk-graph.js +1 -1
  46. package/dist/cli-bundle/sdk-merge.js +58 -42
  47. package/dist/cli-bundle/sdk-query.js +1 -1
  48. package/dist/cli-bundle/sdk-runtime.js +1 -1
  49. package/dist/cli-bundle/sdk-testing.js +1 -1
  50. package/dist/cli-bundle/sdk.js +9 -10
  51. package/dist/core/policy/workflow-policy-store.js +1 -1
  52. package/dist/core/shared/errors.d.ts +13 -0
  53. package/dist/core/shared/errors.js +1 -1
  54. package/dist/sdk/completion/bash.js +1 -1
  55. package/dist/sdk/governance/health.d.ts +1 -1
  56. package/dist/sdk/governance/health.js +1 -1
  57. package/dist/sdk/init-agent-guidance.d.ts +2 -1
  58. package/dist/sdk/init-agent-guidance.js +2 -2
  59. package/dist/sdk/merge/install.js +2 -2
  60. package/dist/sdk/merge/worktree-config.d.ts +9 -0
  61. package/dist/sdk/merge/worktree-config.js +2 -0
  62. package/dist/sdk/public-surface.json +1 -1
  63. package/docs/AGENT_RECOVERY_AND_GUIDANCE.md +49 -0
  64. package/docs/CHATGPT_CODEX_PLUGIN_IMPLEMENTATION.md +2 -0
  65. package/docs/CLAUDE_CODE_PLUGIN.md +18 -7
  66. package/docs/CODEX_PLUGIN.md +5 -12
  67. package/docs/DEFECT_RECURRENCE.md +8 -1
  68. package/docs/DEPENDENCY_KIND_CONTRACT.md +27 -0
  69. package/docs/MERGE_SAFETY.md +28 -5
  70. package/docs/README.md +1 -0
  71. package/docs/RELEASE_RELIABILITY.md +70 -0
  72. package/docs/RELEASING.md +4 -0
  73. package/docs/TESTING.md +17 -0
  74. package/docs/VALIDATION_PORTABILITY.md +20 -11
  75. package/marketplace.json +2 -2
  76. package/package.json +6 -5
  77. package/packages/pm-beads/package.json +1 -1
  78. package/packages/pm-calendar/package.json +1 -1
  79. package/packages/pm-command-kit/package.json +1 -1
  80. package/packages/pm-digital-twin/package.json +1 -1
  81. package/packages/pm-governance-audit/package.json +1 -1
  82. package/packages/pm-guide-shell/package.json +1 -1
  83. package/packages/pm-kanban/package.json +1 -1
  84. package/packages/pm-lifecycle-hooks/package.json +1 -1
  85. package/packages/pm-linked-test-adapters/package.json +1 -1
  86. package/packages/pm-search-advanced/package.json +1 -1
  87. package/packages/pm-templates/package.json +1 -1
  88. package/packages/pm-todos/package.json +1 -1
  89. package/packages/pm-vcs/package.json +1 -1
  90. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  91. package/plugins/pm-claude/README.md +6 -5
  92. package/plugins/pm-claude/hooks/hooks.json +1 -1
  93. package/plugins/pm-claude/hooks/session-start.mjs +9 -6
  94. package/plugins/pm-claude/package.json +9 -0
  95. package/plugins/pm-claude/scripts/plugin-runtime.mjs +84 -0
  96. package/plugins/pm-claude/scripts/pm-mcp-server.mjs +39 -96
  97. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  98. package/plugins/pm-codex/.mcp.json +0 -3
  99. package/plugins/pm-codex/README.md +1 -1
  100. package/plugins/pm-codex/package.json +9 -0
  101. package/plugins/pm-codex/scripts/plugin-runtime.mjs +84 -0
  102. package/plugins/pm-codex/scripts/pm-mcp-server.mjs +38 -99
  103. package/dist/cli-bundle/focused-chunks/chunk-3JAEZ7WI.js +0 -59
@@ -0,0 +1,49 @@
1
+ # Agent Recovery and Guidance
2
+
3
+ Tracked by [pm-o5s22y](../.agents/pm/issues/pm-o5s22y.toon) and
4
+ [pm-80k965](../.agents/pm/issues/pm-80k965.toon).
5
+
6
+ ## Policy refusals preserve context
7
+
8
+ A workflow `require_fields` refusal names the missing metadata and the policy
9
+ that requires it. SDK `PmCliError.context` carries `policy_violations`, the
10
+ full refusal count, policy descriptions, and missing-field recovery. CLI JSON
11
+ adds that same evidence to `refusal.policies` and `refusal.missing_fields`.
12
+ Its `surface` identifies `policy:<id>` rather than attributing the failure to
13
+ an unrelated, valid flag such as `--resolution`.
14
+
15
+ Diagnostics show at most three policy rows and disclose the total. The complete
16
+ policy remains available through `pm schema policies`. Recovery maps metadata
17
+ to declared update flags; package-defined fields retain their SDK/package
18
+ contract instead of receiving an invented CLI option. For example, a missing
19
+ `actual_result` produces an update using `--actual-result`, followed by a retry
20
+ of the refused operation. Refusals preserve item state and record the policy
21
+ refusal in workspace history. Creation and import refusals instead direct the
22
+ caller to supply evidence in the original request, because no item was created.
23
+ Generated update commands include a shell-quoted `--pm-path` to retain the
24
+ refusing tracker even when an SDK caller works outside that project.
25
+
26
+ See [Declarative Workflow Policies](WORKFLOW_POLICIES.md) for portable policy
27
+ declarations and approval semantics.
28
+
29
+ ## Refresh managed agent instructions
30
+
31
+ Root and alias help examples use canonical commands. Help for a deprecated
32
+ alias explicitly identifies its replacement. Generated instructions use
33
+ `pm claim <id> --start` to claim and start work atomically.
34
+
35
+ `pm init --agent-guidance status` compares existing managed blocks with the
36
+ current template. `pm health --summary` reports `agent_guidance_outdated` as an
37
+ advisory and supplies this repair command:
38
+
39
+ ```bash
40
+ pm init --agent-guidance add
41
+ ```
42
+
43
+ The repair refreshes stale managed blocks in both `AGENTS.md` and `CLAUDE.md`,
44
+ preserves all surrounding user instructions, and becomes a no-op after the
45
+ first successful refresh. It does not replace handwritten guidance without
46
+ managed markers. Status and health inspection do not rewrite these files.
47
+ An unreadable guidance path produces an `agent_guidance_unreadable` advisory;
48
+ health still reports the remaining checks and suggests inspecting file types
49
+ and read permissions.
@@ -6,6 +6,8 @@ Tracked research: [pm-n28t](../.agents/pm/tasks/pm-n28t.toon). Future implementa
6
6
  Research date: **2026-07-11**. This page is a research and implementation plan. It does not record a completed
7
7
  plugin remediation, ChatGPT app deployment, or public plugin submission.
8
8
 
9
+ Update for [pm-95d7](../.agents/pm/features/pm-95d7.toon): the Claude and Codex cached launchers now resolve a runtime pinned to the plugin version and reuse it offline after first installation. The remaining sections preserve the July research baseline and the separate ChatGPT app/public distribution plan; historical `@latest` findings below describe the pre-remediation state.
10
+
9
11
  ## Executive Conclusion
10
12
 
11
13
  The current `plugins/pm-codex` package is an actual native Codex plugin, but it is not yet a complete,
@@ -24,7 +24,9 @@ pm-cli/ (repo root)
24
24
  │ │ └── session-start.mjs # Injects pm context at session start
25
25
  │ ├── agents/ # Subagent definitions (one .md per coordinator/triage/verification subagent)
26
26
  │ ├── scripts/
27
- │ │ └── pm-mcp-server.mjs # MCP server launcher (repo → npx fallback)
27
+ │ │ ├── pm-mcp-server.mjs # MCP server launcher
28
+ │ │ └── plugin-runtime.mjs # Exact-version runtime resolver
29
+ │ ├── package.json # Pinned pm-cli dependency
28
30
  │ └── README.md # User-facing installation guide
29
31
  └── scripts/
30
32
  └── smoke-claude-plugin.mjs # Full plugin smoke test (run in CI)
@@ -83,10 +85,10 @@ agent mutations do not need a hard-wired `PM_AUTHOR`.
83
85
  `plugins/pm-claude/scripts/pm-mcp-server.mjs` resolves the server in order:
84
86
 
85
87
  1. `PM_CLI_MCP_SERVER` env var (explicit override)
86
- 2. `dist/mcp/server.js` walking up from the launcher (repo checkout)
87
- 3. `npx -y --package=@unbrained/pm-cli@latest pm-mcp` (npm-installed fallback)
88
+ 2. `dist/mcp/server.js` at the matching repository root, when the checkout package and plugin versions agree
89
+ 3. The exact `@unbrained/pm-cli` version declared in the plugin's `package.json`, installed under the plugin data directory on first use
88
90
 
89
- This means the plugin works both from a repo checkout and from an npm-cached plugin install.
91
+ The cached runtime is reused offline. It never resolves npm's moving `latest` tag. A first install needs npm access; an unavailable pinned release causes an explicit startup failure.
90
92
 
91
93
  ## Session Start Hook
92
94
 
@@ -94,7 +96,7 @@ This means the plugin works both from a repo checkout and from an npm-cached plu
94
96
 
95
97
  1. Checks for `.agents/pm/settings.json` in the current workspace.
96
98
  2. Exits silently if pm is not initialized.
97
- 3. Runs `pm context --limit 5 --json` with a 5-second timeout.
99
+ 3. Runs `pm context --limit 5 --json` from the same pinned runtime as the MCP server, with a 15-second command timeout.
98
100
  4. Injects a compact status line into the session context.
99
101
 
100
102
  Example injection:
@@ -121,6 +123,15 @@ discovery for `2026-07-28`, 32 tools present, full workflow (init → create →
121
123
  claim → update → link files/docs/tests → get → context → search → validate →
122
124
  health), and session-start hook.
123
125
 
126
+ The copied-cache smoke packs the current build, installs it under a temporary
127
+ plugin data directory, copies both plugin bundles away from the checkout, and
128
+ restarts their MCP launchers with npm unavailable:
129
+
130
+ ```bash
131
+ pnpm build
132
+ pnpm smoke:plugin-cache
133
+ ```
134
+
124
135
  ### MCP server smoke test
125
136
 
126
137
  ```bash
@@ -182,9 +193,9 @@ After installing the plugin:
182
193
 
183
194
  | pm-cli version | Plugin version | Claude Code version |
184
195
  |---------------|----------------|---------------------|
185
- | 2026.5.x+ | 1.x | Any current |
196
+ | Exact same date-based version as the plugin | Exact same date-based version as pm-cli | Current supported Claude Code |
186
197
 
187
- The authoritative plugin version is `plugins/pm-claude/.claude-plugin/plugin.json`; this row stays on the `1.x` major line so it does not drift with each plugin release.
198
+ The authoritative plugin version is `plugins/pm-claude/.claude-plugin/plugin.json`; `pnpm version:check` also verifies the pinned runtime dependency.
188
199
 
189
200
  The MCP server uses JSON-RPC 2.0 over stdio with canonical protocol version
190
201
  `2026-07-28`. A bounded legacy path remains for unversioned older hosts, with
@@ -3,7 +3,7 @@
3
3
  pm-cli ships a repo-local Codex plugin at [`plugins/pm-codex`](../plugins/pm-codex/README.md).
4
4
 
5
5
  It is a real Codex plugin package: the repo marketplace installs it and Codex registers its skills and bundled
6
- MCP server. It is not yet a self-contained cached runtime or an Apps SDK-backed ChatGPT app. The official-source
6
+ MCP server. Its cached runtime installs the exact version declared by the plugin manifest and works offline after that first install. It is not yet an Apps SDK-backed ChatGPT app. The official-source
7
7
  audit, verified gaps, and phased remediation plan are documented in
8
8
  [Native ChatGPT and Codex Plugin Implementation Plan](CHATGPT_CODEX_PLUGIN_IMPLEMENTATION.md).
9
9
 
@@ -25,19 +25,12 @@ Keep this page as the public docs router so the MCP tool/action list has one mai
25
25
 
26
26
  ## Current MCP Runtime Note
27
27
 
28
- The plugin launcher uses the local repository build when `dist/mcp/server.js` is present. When the plugin is cached outside the repo, it falls back to:
29
-
30
- ```bash
31
- npx -y --package=@unbrained/pm-cli@latest pm-mcp
32
- ```
33
-
34
- The fallback starts the package MCP server, not the `pm` CLI command. Tool calls import pm command modules and return JSON-compatible structured results.
35
-
36
- This is current behavior, not the target distribution contract. A normal cached install has no repository
37
- `dist/` ancestor, so it depends on npm availability and can run a newer server than the installed plugin. Track
38
- the self-contained, version-coherent runtime work under
28
+ The plugin launcher uses the local repository build when `dist/mcp/server.js` is present. A copied plugin installs the exact `@unbrained/pm-cli` version in its `package.json` to persistent plugin data, then starts its `pm-mcp` server directly with Node. The installed runtime can be reused offline. Track the remaining native-plugin and ChatGPT app work under
39
29
  [pm-95d7](../.agents/pm/features/pm-95d7.toon).
40
30
 
31
+ Run `pnpm build && pnpm smoke:plugin-cache` to verify both copied plugin
32
+ bundles against a real packed install with npm unavailable at MCP startup.
33
+
41
34
  ## Safety
42
35
 
43
36
  For real repository tracking, leave `path` unset so pm uses the repository `.agents/pm` root. For tests, use a sandbox `cwd` or `path` and isolate `PM_GLOBAL_PATH`.
@@ -1,6 +1,6 @@
1
1
  # Defect Recurrence and Boundary Evidence
2
2
 
3
- Tracked by [pm-1qkivy](../.agents/pm/features/pm-1qkivy.toon), [pm-rtn5h6](../.agents/pm/tasks/pm-rtn5h6.toon), [pm-0pzgit](../.agents/pm/tasks/pm-0pzgit.toon), [pm-7c27ep](../.agents/pm/issues/pm-7c27ep.toon), and [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon).
3
+ Tracked by [pm-1qkivy](../.agents/pm/features/pm-1qkivy.toon), [pm-rtn5h6](../.agents/pm/tasks/pm-rtn5h6.toon), [pm-0pzgit](../.agents/pm/tasks/pm-0pzgit.toon), [pm-7c27ep](../.agents/pm/issues/pm-7c27ep.toon), [pm-h8tpeh](../.agents/pm/features/pm-h8tpeh.toon), and [pm-003j](../.agents/pm/tasks/pm-003j.toon).
4
4
 
5
5
  ## Agent Quick Context
6
6
 
@@ -192,6 +192,13 @@ adds a disconnected, unregistered recurrence pair and must also exit `1`. Focuse
192
192
 
193
193
  `repository-defect-evidence-required` is part of the blocking `repository-static-quality` assurance composition. That makes local and CI behavior share the same provider result, assertion negative control, enforcement, and immutable verdict semantics.
194
194
 
195
+ The static quality pipeline also runs `node scripts/check-workflow-permissions.mjs`.
196
+ It parses every GitHub workflow and requires an explicit read-only default token;
197
+ write scopes belong on jobs that use them. Run its `--negative-control` mode to
198
+ confirm a workflow-scope `contents: write` grant exits with status 1. This
199
+ protects the least-privilege workflow policy that [pm-003j](../.agents/pm/tasks/pm-003j.toon)
200
+ tracks, even between Scorecard scans.
201
+
195
202
  The mandatory `gate-registry` check also compares each recurrence family's `checks.hosted` values with concrete names derived from the repository workflows. It expands static matrix axes and applies exclusions before inclusions according to [GitHub's matrix rules](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrixinclude). Renamed or removed checks produce named findings. Runtime expressions, unnamed matrix jobs, and static expansions beyond 256 combinations cannot certify a required check name. The public SDK policy parser remains provider-neutral; this workflow binding belongs to the repository gate.
196
203
 
197
204
  Assurance request schemas declare each family's required identity, triggers,
@@ -78,3 +78,30 @@ Readiness, `pm next`, context blocker summaries, `pm list-blocked`, downstream `
78
78
  `pm deps` returns `legacy_alias_counts` for the workspace. `pm graph audit` returns the same field beside canonical `profile.edges_by_kind` counts, `profile.edge_share_by_kind` composition ratios, and the `semantic_edges`/`semantic_edge_share` context-preservation census. The semantic census counts `discovered_from`, `incident_from`, `recurs_from`, `supersedes`, and `verifies` over all deduplicated directed edges. Empty objects and zero shares are explicit, not omitted. These diagnostics are read-only; terminal history remains untouched until an explicitly governed migration is requested.
79
79
 
80
80
  Assurance `dependency_kind` measurements canonicalize both the declaration and stored row before comparing. A declaration using `related` and one using the accepted `related_to` alias therefore measure the same edge population; alias debt remains separately observable through `legacy_alias_counts`.
81
+
82
+ ## Composition policy when adding relationships
83
+
84
+ Tracked by [pm-r3o7x4](../.agents/pm/issues/pm-r3o7x4.toon).
85
+
86
+ Choose the kind that states the actual relationship. Use `related` for honest
87
+ association; never relabel it as evidence or ordering merely to pass a gate.
88
+ This workspace enforces `profile.semantic_edge_share` over canonical,
89
+ deduplicated directed edges in both graph-composition and tracker-context-quality.
90
+ The raw association count and declared-row share remain diagnostics. Neither
91
+ imposes a second blocking bound on otherwise healthy graph growth.
92
+
93
+ Adding a provenance or verification edge cannot lower that composition ratio.
94
+ Adding only association, hierarchy, implementation, or ordering edges can lower
95
+ it; a mixed addition that increases semantic share passes the composition floor
96
+ whenever its baseline passed. Ordering and hierarchy still have their own
97
+ integrity constraints. Inspect the active workspace policy before bulk changes:
98
+
99
+ ```bash
100
+ pm assurance show gate graph-composition
101
+ pm assurance show assertion graph-semantic-edge-share-floor
102
+ pm assurance run graph-composition --trigger ci --dry-run
103
+ ```
104
+
105
+ The floor is a declared minimum, not a promise that every small dilution fails.
106
+ Real growth is allowed above it; an associative-only pass crossing the floor is
107
+ refused. Both terminal and active history contribute to the same denominator.
@@ -51,12 +51,13 @@ shell quoting when it expands the placeholder. Receipt ingestion also removes
51
51
  one legacy matching quote pair so receipts written by older clone-local drivers
52
52
  remain reconcilable.
53
53
  `pm validate --check-storage-integrity` and `pm health` also compare every
54
- clone-local driver definition with the installed SDK. Exact commands remain the
55
- fast path. A command installed by another valid `@unbrained/pm-cli` package is
54
+ effective driver definition with the installed SDK. A command installed by
55
+ another valid `@unbrained/pm-cli` package is
56
56
  also accepted when its Node and `dist/cli.js` paths exist, its manifest owns the
57
- `pm` bin, and the driver arguments are semantically identical. This keeps
58
- copied worktrees and upgraded global installs healthy without accepting an
59
- arbitrary executable. A missing, malformed, or semantically stale definition is
57
+ `pm` bin, the driver arguments are semantically identical, and its version
58
+ matches any exact project runtime pins. A driver inside a sibling worktree of
59
+ the same repository is rejected, even when that package is otherwise valid.
60
+ Independent global installations remain supported. A missing, malformed, or semantically stale definition is
60
61
  reported even when the committed attribute fence is correct.
61
62
  Health and validation name `pm merge install` as the repair command for missing
62
63
  or drifted drivers. This upgrade behavior is tracked by
@@ -64,6 +65,28 @@ or drifted drivers. This upgrade behavior is tracked by
64
65
 
65
66
  The installer publishes the shared `.gitattributes` fence only after the clone-local driver commands are configured. If the repository Git config is read-only or another Git process holds its lock, the command returns the stable `merge_git_config_unwritable` error with recovery guidance and leaves an absent fence absent. Use `pm merge install --dry-run --json` to inspect the contract in intentionally read-only workspaces.
66
67
 
68
+ ### Independent worktree runtimes
69
+
70
+ Tracked by [pm-c1dwbt](../.agents/pm/issues/pm-c1dwbt.toon).
71
+
72
+ Run `pm merge install` from each worktree with that worktree's intended pm
73
+ installation. When installing in a linked worktree, the SDK enables Git's
74
+ `extensions.worktreeConfig` and writes drivers with `git config --worktree`.
75
+ Existing main-worktree drivers are preserved in its `config.worktree`; later
76
+ installs cannot replace another worktree's runtime. Main-only `core.worktree`
77
+ and `core.bare=true` settings migrate with their original scope. Ordinary
78
+ clones retain local configuration until worktree isolation is needed.
79
+ Git subprocesses discard inherited repository-location variables so an SDK
80
+ caller's `GIT_DIR` cannot redirect installation or diagnosis to another clone.
81
+ Configuration migration uses multiple Git writes: a failed write is reported,
82
+ and rerunning `pm merge install` after resolving the config lock or permissions
83
+ completes the migration while preserving values already copied for the main tree.
84
+
85
+ Health reads Git's effective configuration, including worktree overrides.
86
+ Removing a sibling worktree does not remove a separately installed main driver.
87
+ Use `pm merge install` in the affected worktree to repair stale, missing, or
88
+ incompatible commands. A dry run changes neither configuration nor attributes.
89
+
67
90
  ### Fence coverage contract
68
91
 
69
92
  The fenced block is generated by one shared coverage contract (`buildMergeAttributePatterns`) covering every mergeable artifact class: tracker-wide `**/*.toon` and `**/*.md` item patterns, explicit per-type diagnostic patterns, all tracker `**/*.jsonl` paths under the relationship-event driver with the more-specific `history/*.jsonl` rule overriding history streams, root `settings.json`, and every nested `**/*.json` document. The tracker-wide item rules protect extension-defined type folders even when a receiving branch has not installed the package that registered them; explicit type rows still make active-registry drift diagnosable. The broad JSON rules automatically cover schema, managed-extension, evaluation-corpus, and future package-owned authoritative JSON without another hand-maintained allowlist. The broad JSONL rule is required because `RelationshipEventStore` supports package-owned custom relative paths anywhere below the tracker root. Two mechanisms keep the committed fence from drifting out of that contract:
package/docs/README.md CHANGED
@@ -68,6 +68,7 @@ pm guide release --json
68
68
  - [History Algorithms and Detached Attestations](HISTORY_ATTESTATION.md) - named record digests, portable exact-byte proofs, and read-only verification.
69
69
  - [History-derived Governance Repair](HISTORY_GOVERNANCE_REPAIR.md) - verified closure timestamps and typed issue-code lineage.
70
70
  - [History Maintenance and Recovery](HISTORY_MAINTENANCE.md) - native history commands, permanent aliases, shared SDK transforms, and transactional recovery.
71
+ - [Agent Recovery and Guidance](AGENT_RECOVERY_AND_GUIDANCE.md) - policy refusal evidence, canonical help, and managed instruction freshness.
71
72
  - [Declarative Workflow Policies](WORKFLOW_POLICIES.md) - portable lifecycle requirements, independent approvals, and completeness reports.
72
73
  - [Mutation Integrity](MUTATION_INTEGRITY.md) - shared CLI/SDK/MCP author, secret, append-only disposition, and stale-work guardrails.
73
74
  - [Agent Provenance ADR Amendment](AGENT_PROVENANCE_ADR.md) - extensible model, effort, role, and host provenance with privacy and compatibility boundaries.
@@ -0,0 +1,70 @@
1
+ # Scheduled release reliability
2
+
3
+ Tracked by [pm-e70zh5](../.agents/pm/issues/pm-e70zh5.toon) and
4
+ [pm-44u3wt](../.agents/pm/issues/pm-44u3wt.toon).
5
+
6
+ The **Release Reliability** workflow evaluates the preceding 30 days after a
7
+ scheduled Auto Release completes, daily at nominal 04:35 UTC, and on manual
8
+ dispatch. It saves a JSON report and fails its own check when policy is breached.
9
+ The report is independent of candidate correctness: historical failures must
10
+ remain visible while a reviewed repair can still pass publication gates.
11
+
12
+ ## Policy and clock
13
+
14
+ [The versioned policy](../config/release-reliability-policy.json) declares the
15
+ nominal release cron as 02:35 UTC, a 60-minute dispatch allowance, a maximum
16
+ 10% failure rate, and at least seven completed observations. These are explicit
17
+ operational targets, not thresholds fitted to make the current history green.
18
+ Missing samples yield an insufficient-data failure, never a healthy zero rate.
19
+
20
+ Dispatch delay measures `created_at` against the nearest preceding nominal
21
+ daily occurrence. Queue delay separately measures `run_started_at - created_at`.
22
+ GitHub does not supply the intended scheduled timestamp: the inferred occurrence
23
+ cannot disambiguate delays greater than 24 hours. Missing the latest occurrence
24
+ whose 60-minute allowance has elapsed produces `missing_scheduled_run`. Before
25
+ 03:35 UTC, absence of today's run is still within the allowance; afterward,
26
+ inspect the report to distinguish missing dispatch, a pending attempt, and a
27
+ completed failure. A late run is visible even when it subsequently succeeds.
28
+
29
+ The release version and one-per-day guard use the UTC execution date captured
30
+ by release preparation, not the inferred cron occurrence. A delayed run cannot
31
+ backdate a tag. Reporting never creates, retargets, retries, or publishes a tag.
32
+ The unchanged [release recovery rules](RELEASING.md#failure-handling) apply.
33
+
34
+ ## Evidence and denominator
35
+
36
+ The collector paginates the schedule-only runs API over an explicit half-open
37
+ UTC window and checks returned counts and unique IDs. It retrieves attempt 1
38
+ when a run was rerun. A later successful attempt, manual dispatch, issue recovery,
39
+ or closed blocker cannot change the original scheduled failure. Pending runs
40
+ are listed separately; all completed non-success conclusions count as failures.
41
+ API errors, truncated pages, ambiguous artifacts, and mismatched run identities
42
+ fail collection rather than silently reducing the denominator.
43
+
44
+ Auto Release saves `release-observation-<attempt>` artifacts for 90 days. Each
45
+ contains only run/attempt identity, event, outcome and failure-stage name. Gate
46
+ stdout, stderr, credentials and environment values are not archived. A confirmed
47
+ publication, verified existing same-day release, unchanged source, tracker-only
48
+ changes, and an empty changelog are distinct outcomes. Failed gates retain their
49
+ structured stage; older failures fall back to failed job/step names from GitHub.
50
+ Receipt writing and upload are non-blocking so an evidence-service outage cannot
51
+ change publication success into a release blocker. Missing or expired success
52
+ receipts are `unknown_success`, with
53
+ `outcome_evidence_complete: false`; success alone does not prove publication.
54
+
55
+ Reports retain the input policy, window, per-run observations, outcome counts,
56
+ stage counts, denominator, failure rate and violations. Download a report using
57
+ `gh run download <report-run-id> --name <artifact-name> --dir <temporary-directory>`.
58
+ The pure evaluator in `scripts/release/release-reliability.mjs` permits offline
59
+ replay with a fixed clock and captured input; the collector is read-only and
60
+ downloads only data, never executable source. The reporting workflow checks out
61
+ the default branch rather than the triggering run's code and has read-only token
62
+ permissions.
63
+
64
+ The report is a rolling observation, not a permanent archive of all releases.
65
+ Retain exported receipts externally if a longer historical window is needed.
66
+ It does not implement the separate nightly per-leg reliability programme or
67
+ change the manual same-day version policy.
68
+
69
+ Provider contracts: [workflow run attempts](https://docs.github.com/en/rest/actions/workflow-runs#get-a-workflow-run-attempt)
70
+ and [completion-triggered workflows](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#workflow_run).
package/docs/RELEASING.md CHANGED
@@ -447,6 +447,10 @@ gh run watch <run-id> --exit-status
447
447
 
448
448
  ## Post-Release Verification
449
449
 
450
+ Use the [rolling reliability report](RELEASE_RELIABILITY.md) as well as the
451
+ latest release result. Its first-attempt denominator, explicit outcome receipts,
452
+ and UTC dispatch policy preserve failures even after a recovery succeeds.
453
+
450
454
  ```bash
451
455
  npm view @unbrained/pm-cli@<version> version dist.integrity dist.unpackedSize --json
452
456
  npx --yes --package @unbrained/pm-cli@<version> -- pm --json --no-extensions contracts --summary
package/docs/TESTING.md CHANGED
@@ -88,6 +88,23 @@ so PR-local CodeFactor maintainability annotations fail locally before commit or
88
88
  push. Existing legacy high-complexity test fixtures are tracked separately and
89
89
  must not be used as precedent for new changed production/script code.
90
90
 
91
+ The same required static gate validates an explicit seven-day Dependabot
92
+ cooldown for every updater and requires both npm and GitHub Actions entries.
93
+ Missing values, semver overrides outside 7–90 days, invalid YAML, removed
94
+ updaters, and include/exclude bypasses fail the gate. The maximum follows
95
+ [GitHub's cooldown limits](https://docs.github.com/en/code-security/tutorials/secure-your-dependencies/optimizing-pr-creation-version-updates).
96
+ Security updates retain GitHub's separate security-update behavior.
97
+ The negative controls are tracked by [pm-gkut](../.agents/pm/issues/pm-gkut.toon)
98
+ and [pm-dmo5](../.agents/pm/issues/pm-dmo5.toon).
99
+
100
+ Release synchronization and commit staging share one distribution manifest
101
+ inventory. The [pm-t4prek regression](../tests/unit/scripts/release/version-manifests.spec.ts)
102
+ bumps versions in a temporary Git repository and reads the resulting commit to
103
+ verify workspace versions and exact plugin runtime pins. The pipeline checks
104
+ version consistency immediately before staging, including required string
105
+ versions and runtime pins in both plugin package manifests; tests of a prepared working
106
+ tree alone cannot establish that the release commit contains those changes.
107
+
91
108
  `lint:duplicates` runs three zero-clone profiles: the broad repository profile,
92
109
  the production cross-format profile, and a supplemental long-table profile at
93
110
  28 lines / 80 tokens. The last profile detects the historical GH-508 normalizer
@@ -1,7 +1,8 @@
1
1
  # Completion portability and bounded replication checks
2
2
 
3
- Tracked by [pm-t6jl1f](../.agents/pm/issues/pm-t6jl1f.toon) and
4
- [pm-26y269](../.agents/pm/tasks/pm-26y269.toon).
3
+ Tracked by [pm-t6jl1f](../.agents/pm/issues/pm-t6jl1f.toon),
4
+ [pm-26y269](../.agents/pm/tasks/pm-26y269.toon), and
5
+ [pm-eswzn9](../.agents/pm/tasks/pm-eswzn9.toon).
5
6
 
6
7
  ## Bash completion data boundary
7
8
 
@@ -13,10 +14,15 @@ elements to `COMPREPLY`. Candidates containing shell metacharacters or Unicode
13
14
  use portable single-quote syntax, including embedded quote escaping, so accepting
14
15
  a candidate and pressing Enter also preserves its literal argument value.
15
16
 
16
- Already quoted or backslash-escaped prefixes return no suggestions before optional
17
- completion initialization can remove their quoting. This conservative boundary
18
- avoids inserting an unquoted-context escape inside a different shell quoting
19
- context. Normal unquoted prefixes retain literal matching.
17
+ The matcher decodes the current Readline word without evaluation. It recognizes
18
+ open single quotes, open double quotes, and backslash-escaped prefixes. Each
19
+ completion is encoded for its insertion context: apostrophes are split safely
20
+ inside single quotes; dollar signs, backticks, backslashes, and double quotes
21
+ are escaped inside double quotes; exclamation marks use a single-quoted segment
22
+ so history expansion cannot change the accepted bytes. Unquoted prefixes keep
23
+ the existing literal single-quote encoding for unsafe candidates. Mixed quoted
24
+ segments whose replacement span is ambiguous, and prefixes containing typed
25
+ backticks, still return no suggestions.
20
26
 
21
27
  The matcher never evaluates choices as shell programs. Dollar signs, backticks,
22
28
  quotes, backslashes, and wildcard characters remain literal. Unicode survives
@@ -37,9 +43,10 @@ and cache policy retain their existing contracts.
37
43
  `compgen -W` cannot safely serve as the data transport here: it performs another
38
44
  expansion pass, and Bash 3.2 does not round-trip the ANSI-C quoting emitted by
39
45
  `printf %q` for Unicode. Unquoted command-substitution arrays can additionally
40
- expand literal wildcard candidates into filenames. The regression executes the
41
- generated function and parses its accepted words with the real Bash parser,
42
- rather than inferring safety from source substrings.
46
+ expand literal wildcard candidates into filenames. The regression checks the
47
+ generated function and uses an interactive pseudo terminal to press Tab and
48
+ Enter in each supported insertion context. It checks the accepted argument
49
+ bytes and verifies that a command-substitution sentinel was not created.
43
50
 
44
51
  Run the focused native regression after building:
45
52
 
@@ -51,8 +58,10 @@ To test another installed Bash version, set `PM_COMPLETION_TEST_BASH` to its
51
58
  executable path. This is a test harness input, not a CLI configuration setting.
52
59
  The existing macOS runtime-smoke job pins `/bin/bash` so PATH cannot silently
53
60
  substitute a newer Homebrew Bash. It runs this regression before merge; Linux
54
- coverage runs the same matrix. Native Fish and Zsh acceptance remains in the
55
- required smoke gate.
61
+ coverage runs the same matrix. The macOS test drives Bash through a Python 3
62
+ pseudo terminal because BSD `script` requires terminal stdin; Linux uses
63
+ `script`. Set `PM_COMPLETION_TEST_PTY=python` to exercise the macOS driver on
64
+ Linux. Native Fish and Zsh acceptance remains in the required smoke gate.
56
65
 
57
66
  ## Replication diff collection
58
67
 
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.23"
9
+ "version": "2026.9.25"
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.23",
16
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
4
4
  "description": "Git-native project management CLI for humans and agents.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.10.0",
@@ -123,7 +123,7 @@
123
123
  "lint:complexity:baseline": "eslint . --suppress-rule complexity --suppress-rule sonarjs/cognitive-complexity",
124
124
  "lint:duplicates": "jscpd --config .jscpd.json && jscpd --config .jscpd.source.json && jscpd --config .jscpd.tables.json",
125
125
  "lint:codefactor": "pnpm quality:static",
126
- "quality:static": "pnpm quality:docstrings && pnpm quality:exports && pnpm lint:eslint && pnpm lint:duplicates && pnpm build && node scripts/contracts-snapshot.mjs --check && node scripts/generate-agent-capability-surfaces.mjs --check && node scripts/generate-error-code-catalog.mjs --check && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/command-grammar-gate.mjs && node scripts/release/flag-invocation-parity.mjs && node scripts/release/flag-lexicon-gate.mjs && node scripts/release/refusal-closure-gate.mjs && node scripts/release/agent-task-token-gate.mjs && pnpm quality:mcp-deprecations && 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 && pnpm quality:mutation -- --prebuilt",
126
+ "quality:static": "pnpm quality:docstrings && pnpm quality:exports && pnpm lint:eslint && pnpm lint:duplicates && node scripts/check-workflow-permissions.mjs && node scripts/check-dependency-cooldown.mjs && node scripts/gen-plugin-mcp-wrappers.mjs --check && pnpm build && node scripts/contracts-snapshot.mjs --check && node scripts/generate-agent-capability-surfaces.mjs --check && node scripts/generate-error-code-catalog.mjs --check && node scripts/release/repository-assurance.mjs repository-static-quality --trigger ci --json && node scripts/release/audit-package-boundary.mjs && node scripts/release/package-sdk-contract-parity.mjs && node scripts/release/surface-replication-gate.mjs && node scripts/release/command-grammar-gate.mjs && node scripts/release/flag-invocation-parity.mjs && node scripts/release/flag-lexicon-gate.mjs && node scripts/release/refusal-closure-gate.mjs && node scripts/release/agent-task-token-gate.mjs && pnpm quality:mcp-deprecations && 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 && pnpm quality:mutation -- --prebuilt",
127
127
  "quality:exports": "knip --no-config-hints && node scripts/run-tests.mjs test -- tests/unit/scripts/release/dead-exports.spec.ts",
128
128
  "quality:command-grammar": "pnpm build && node scripts/release/command-grammar-gate.mjs && node scripts/release/flag-invocation-parity.mjs && node scripts/release/flag-lexicon-gate.mjs",
129
129
  "quality:recovery-closure": "pnpm build && node scripts/release/refusal-closure-gate.mjs",
@@ -167,6 +167,7 @@
167
167
  "smoke:external-packages": "node scripts/smoke-external-packages.mjs",
168
168
  "smoke:codex-plugin": "node scripts/smoke-codex-plugin-mcp.mjs",
169
169
  "smoke:claude-plugin": "node scripts/smoke-claude-plugin.mjs",
170
+ "smoke:plugin-cache": "node tests/acceptance/plugin-cache-smoke.mjs",
170
171
  "version:check": "node scripts/release-version.mjs check && node scripts/sync-versions.mjs check",
171
172
  "version:next": "node scripts/release-version.mjs next",
172
173
  "version:sync": "node scripts/sync-versions.mjs apply",
@@ -211,7 +212,7 @@
211
212
  "node": ">=22.18.0"
212
213
  },
213
214
  "dependencies": {
214
- "@sentry/node": "10.75.0",
215
+ "@sentry/node": "10.75.1",
215
216
  "@toon-format/toon": "^4.1.1",
216
217
  "@types/node": ">=22",
217
218
  "commander": "^15.0.0",
@@ -238,13 +239,13 @@
238
239
  "fast-check": "^4.10.2",
239
240
  "github-slugger": "2.0.0",
240
241
  "greptile": "^3.5.3",
241
- "jscpd": "^5.3.0",
242
+ "jscpd": "^5.3.1",
242
243
  "knip": "^6.37.0",
243
244
  "marked": "18.0.13",
244
245
  "parse5": "8.0.1",
245
246
  "tsx": "^4.23.15",
246
247
  "typescript": "^6.0.3",
247
- "typescript-eslint": "^8.70.0",
248
+ "typescript-eslint": "^8.70.1",
248
249
  "vitest": "^4.1.11"
249
250
  }
250
251
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
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.23",
3
+ "version": "2026.9.25",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "First-party pm package for Todo markdown import and export.",