@unbrained/pm-cli 2026.9.22 → 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 (107) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/AGENTS.md +6 -20
  3. package/CHANGELOG.md +43 -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 +144 -144
  8. package/dist/cli-bundle/chunks/{chunk-BJBBOUYQ.js → chunk-25KTCTBL.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-UDNYAMCM.js → chunk-3IB4THWX.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-3OFFMS2N.js → chunk-445ARBKY.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-SBTT42A4.js → chunk-5AP67ZXH.js} +3 -3
  12. package/dist/cli-bundle/chunks/{chunk-JSW33Q6R.js → chunk-COFQCKF4.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-4XOV7Q5R.js → chunk-CZ3VJJEA.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-ZSPZJOMK.js → chunk-GAU55CWI.js} +28 -28
  15. package/dist/cli-bundle/chunks/{chunk-ML42DLI3.js → chunk-GOWZEBTH.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-CM57QHVK.js → chunk-JDHWZYZU.js} +73 -73
  17. package/dist/cli-bundle/chunks/{chunk-GFTN5OS4.js → chunk-P7ZSJOWH.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-AVWHZUNC.js → chunk-YABJDOOX.js} +63 -62
  19. package/dist/cli-bundle/chunks/{chunk-D2OV2UBV.js → chunk-YDIGMRLZ.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-list-query-VOS5CBX4.js → register-list-query-IZ7ZVTDE.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-mutation-LWZH6UFJ.js → register-mutation-IPAZTFDZ.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-operations-YJK4DNFZ.js → register-operations-APN33LNI.js} +2 -2
  23. package/dist/cli-bundle/chunks/{register-setup-Q3CYF67Q.js → register-setup-HPHIKG5U.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-CASXNCNQ.js → chunk-ABA3KRPY.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-XR5EBU3B.js → chunk-HQPTDJLF.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-PRMQTT7X.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-QFEDRPPI.js → chunk-MK5AKKHK.js} +2 -2
  29. package/dist/cli-bundle/focused-chunks/{chunk-LH24XUPJ.js → chunk-NRHTXBTI.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-URH727T5.js → chunk-NVVB2HJC.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-TSI73EEM.js → chunk-O7MIBEMK.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-V2NARGRH.js → chunk-OY3VHCTX.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-UT7VS4X2.js → chunk-PMPFLA6X.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-FKYUTTFL.js → chunk-Q355NPLH.js} +28 -28
  35. package/dist/cli-bundle/focused-chunks/{chunk-JCD5YESL.js → chunk-TLF6N56J.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-MXESHALQ.js → chunk-UIFVIE5F.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-IOL25GKH.js → chunk-V2X37U6J.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-AO5FR7PN.js → chunk-XKH2FC5D.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/{chunk-UAU4DJSR.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/cli-contracts/commander-types.d.ts +11 -11
  55. package/dist/sdk/cli-contracts/commander-types.js +1 -1
  56. package/dist/sdk/completion/bash.js +1 -1
  57. package/dist/sdk/governance/health.d.ts +1 -1
  58. package/dist/sdk/governance/health.js +1 -1
  59. package/dist/sdk/init-agent-guidance.d.ts +2 -1
  60. package/dist/sdk/init-agent-guidance.js +2 -2
  61. package/dist/sdk/merge/install.js +2 -2
  62. package/dist/sdk/merge/worktree-config.d.ts +9 -0
  63. package/dist/sdk/merge/worktree-config.js +2 -0
  64. package/dist/sdk/pagination.js +1 -1
  65. package/dist/sdk/public-surface.json +1 -1
  66. package/docs/AGENT_RECOVERY_AND_GUIDANCE.md +49 -0
  67. package/docs/CHATGPT_CODEX_PLUGIN_IMPLEMENTATION.md +2 -0
  68. package/docs/CLAUDE_CODE_PLUGIN.md +18 -7
  69. package/docs/CODEX_PLUGIN.md +5 -12
  70. package/docs/DEFECT_RECURRENCE.md +8 -1
  71. package/docs/DEPENDENCY_KIND_CONTRACT.md +27 -0
  72. package/docs/MERGE_SAFETY.md +28 -5
  73. package/docs/QUALITY_EVIDENCE.md +70 -0
  74. package/docs/README.md +1 -0
  75. package/docs/RELEASE_RELIABILITY.md +70 -0
  76. package/docs/RELEASING.md +4 -0
  77. package/docs/TESTING.md +25 -0
  78. package/docs/VALIDATION_PORTABILITY.md +20 -11
  79. package/marketplace.json +2 -2
  80. package/package.json +12 -6
  81. package/packages/pm-beads/package.json +1 -1
  82. package/packages/pm-calendar/package.json +1 -1
  83. package/packages/pm-command-kit/package.json +1 -1
  84. package/packages/pm-digital-twin/package.json +1 -1
  85. package/packages/pm-governance-audit/package.json +1 -1
  86. package/packages/pm-guide-shell/package.json +1 -1
  87. package/packages/pm-kanban/package.json +1 -1
  88. package/packages/pm-lifecycle-hooks/package.json +1 -1
  89. package/packages/pm-linked-test-adapters/package.json +1 -1
  90. package/packages/pm-search-advanced/package.json +1 -1
  91. package/packages/pm-templates/package.json +1 -1
  92. package/packages/pm-todos/package.json +1 -1
  93. package/packages/pm-vcs/package.json +1 -1
  94. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  95. package/plugins/pm-claude/README.md +6 -5
  96. package/plugins/pm-claude/hooks/hooks.json +1 -1
  97. package/plugins/pm-claude/hooks/session-start.mjs +9 -6
  98. package/plugins/pm-claude/package.json +9 -0
  99. package/plugins/pm-claude/scripts/plugin-runtime.mjs +84 -0
  100. package/plugins/pm-claude/scripts/pm-mcp-server.mjs +39 -96
  101. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  102. package/plugins/pm-codex/.mcp.json +0 -3
  103. package/plugins/pm-codex/README.md +1 -1
  104. package/plugins/pm-codex/package.json +9 -0
  105. package/plugins/pm-codex/scripts/plugin-runtime.mjs +84 -0
  106. package/plugins/pm-codex/scripts/pm-mcp-server.mjs +38 -99
  107. package/dist/cli-bundle/focused-chunks/chunk-QYN77MQP.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:
@@ -0,0 +1,70 @@
1
+ # Test strength and documentation content
2
+
3
+ Tracked by [pm-zclzll](../.agents/pm/tasks/pm-zclzll.toon) and
4
+ [pm-dvwm](../.agents/pm/chores/pm-dvwm.toon).
5
+
6
+ ## SDK mutation testing
7
+
8
+ `pnpm quality:mutation` uses Stryker's Vitest runner to mutate the SDK cursor and
9
+ external-dependency primitives. The declared partition in
10
+ `scripts/release/sdk-mutation.json` is deliberately bounded. It does not claim
11
+ a mutation score for the entire SDK. The existing behavioral tests run without
12
+ retries; no production functions are mocked in this partition. All-source
13
+ coverage remains a separate mandatory 100/100/100/100 gate.
14
+
15
+ The sandboxed runner creates external temporary project/global trackers,
16
+ disables external telemetry, removes ambient source-workspace references, and
17
+ copies mutation sources without the real tracker. It holds the build lease
18
+ until the engine exits and removes the owned temporary directory afterward.
19
+ The normal source tree is never mutated. Every run executes all mutants;
20
+ incremental results cannot supply stale evidence. Four workers and per-mutant
21
+ timeouts bound this partition inside the existing 20-minute static job.
22
+ The runner fixes sandboxing, fresh execution and the complete mutator set after
23
+ loading configuration, so configuration overrides cannot disable those controls.
24
+
25
+ The gate verifies source bytes, exact module scope, nonempty mutant populations,
26
+ and unique mutation identities. Only assertion-killed mutants contribute to the
27
+ raw score. Timeouts, compiler errors, uncovered mutants and ignored mutants fail.
28
+ A survivor requires an exact identity, a behavioral equivalence explanation,
29
+ and an owning pm item in `sdk-mutation-baseline.json`. The initial seven waivers
30
+ cover redundant guards and JavaScript serialization and absent-date equivalences;
31
+ there are no blanket mutator exclusions or source-ignore directives.
32
+
33
+ Inspect `.cache/mutation/report.json` for individual mutations and
34
+ `.cache/mutation/receipt.json` for the gate verdict. On a new survivor, first add
35
+ a behavioral assertion to the existing test that owns the contract. If the
36
+ mutation is observably equivalent, record its exact identity and justification
37
+ for review. Remove waivers that disappear or become killed. Improvements require
38
+ raising `minimumScore`; CI compares the floor and module scope with the PR base
39
+ and refuses regression. Do not round the score when updating the baseline.
40
+
41
+ Both `pnpm quality:static` and the existing required hosted static job run the
42
+ partition, as do nightly and release static validation. The runner rejects
43
+ command-line mutation policy overrides. The static chain uses `--prebuilt` to
44
+ reuse its completed build while still acquiring the build lease and rejecting
45
+ an incomplete generation; standalone mutation runs retain their default build.
46
+ Extending the partition requires adding the
47
+ module and its behavioral tests together, measuring runtime, and reviewing every
48
+ survivor. Gate unit tests inject report/engine boundaries to prove failure paths;
49
+ the actual Stryker execution is an additional required gate.
50
+
51
+ ## Documentation content ratchet
52
+
53
+ `pnpm quality:docstrings` parses documentation comments across runtime sources,
54
+ packages, scripts, plugins and executable examples. It detects four known filler
55
+ templates, including wrapped comments, without matching quoted strings or
56
+ ordinary comments. Module, exported-declaration and member documentation coverage
57
+ remain independently enforced by the existing static gate.
58
+
59
+ The initial census found 4,192 filler comments. This delivery removes ten from
60
+ the Commander alias contract and records the remaining per-file counts. The
61
+ remaining debt is visible; an enforced inventory is not a claim that every
62
+ existing comment is now informative.
63
+
64
+ When editing a declaration, replace its filler with the actual behavior,
65
+ precedence, units or invariants. Do not merely restate the identifier. After
66
+ reducing a file's count, run `pnpm quality:docstrings:update` and commit the
67
+ smaller baseline. The update refuses growth, including in new files. Counts
68
+ cannot be traded between files, and CI refuses baseline increases against the
69
+ PR base via `PM_QUALITY_BASE_REF`. Removed filler cannot silently return by
70
+ leaving a stale larger ceiling.
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
@@ -177,6 +194,14 @@ quality:static`: every `src/**/*.ts` source file needs a module TSDoc block,
177
194
  every exported declaration needs a non-module TSDoc block, and known generated
178
195
  boilerplate summaries are rejected.
179
196
 
197
+ ## Test Strength and Documentation Content
198
+
199
+ The required static gate also runs [SDK mutation testing and the documentation
200
+ content ratchet](QUALITY_EVIDENCE.md), tracked by
201
+ [pm-zclzll](../.agents/pm/tasks/pm-zclzll.toon) and
202
+ [pm-dvwm](../.agents/pm/chores/pm-dvwm.toon). These add behavioral and content
203
+ checks while retaining exact 100/100/100/100 coverage and all docstring floors.
204
+
180
205
  ## TOON Storage Round-Trip Gate
181
206
 
182
207
  History-only lifecycle reconstruction and recovery contracts are described in
@@ -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.22"
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.22",
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.22",
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: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",
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",
@@ -188,7 +189,10 @@
188
189
  "sentry:inject": "sentry-cli sourcemaps inject dist/",
189
190
  "sentry:upload": "sentry-cli sourcemaps upload --org unbrained --project pm-cli --release \"pm-cli@$npm_package_version\" --validate dist/",
190
191
  "build:sentry": "pnpm build && pnpm sentry:inject && pnpm sentry:upload",
191
- "prepublishOnly": "pnpm build"
192
+ "prepublishOnly": "pnpm build",
193
+ "quality:docstrings": "node --input-type=module --eval \"import { main } from './scripts/release/docstring-quality.mjs'; console.log(JSON.stringify(main()));\"",
194
+ "quality:docstrings:update": "node --input-type=module --eval \"import { main } from './scripts/release/docstring-quality.mjs'; console.log(JSON.stringify(main(['--update'])));\"",
195
+ "quality:mutation": "node scripts/run-tests.mjs mutation"
192
196
  },
193
197
  "keywords": [
194
198
  "cli",
@@ -208,7 +212,7 @@
208
212
  "node": ">=22.18.0"
209
213
  },
210
214
  "dependencies": {
211
- "@sentry/node": "10.75.0",
215
+ "@sentry/node": "10.75.1",
212
216
  "@toon-format/toon": "^4.1.1",
213
217
  "@types/node": ">=22",
214
218
  "commander": "^15.0.0",
@@ -223,6 +227,8 @@
223
227
  "@eslint/js": "^10.0.1",
224
228
  "@modelcontextprotocol/ext-apps": "2.0.0",
225
229
  "@sentry/cli": "^3.8.0",
230
+ "@stryker-mutator/core": "10.0.0",
231
+ "@stryker-mutator/vitest-runner": "10.0.0",
226
232
  "@types/node": "^26.6.2",
227
233
  "@types/npm-package-arg": "^6.1.4",
228
234
  "@vitest/coverage-v8": "^4.1.11",
@@ -233,13 +239,13 @@
233
239
  "fast-check": "^4.10.2",
234
240
  "github-slugger": "2.0.0",
235
241
  "greptile": "^3.5.3",
236
- "jscpd": "^5.3.0",
242
+ "jscpd": "^5.3.1",
237
243
  "knip": "^6.37.0",
238
244
  "marked": "18.0.13",
239
245
  "parse5": "8.0.1",
240
246
  "tsx": "^4.23.15",
241
247
  "typescript": "^6.0.3",
242
- "typescript-eslint": "^8.70.0",
248
+ "typescript-eslint": "^8.70.1",
243
249
  "vitest": "^4.1.11"
244
250
  }
245
251
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unbrained/pm-beads",
3
- "version": "2026.9.22",
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.",