@unbrained/pm-cli 2026.5.11 → 2026.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/AGENTS.md +3 -116
  2. package/CHANGELOG.md +18 -0
  3. package/PRD.md +18 -39
  4. package/README.md +8 -5
  5. package/dist/cli/commander-usage.js +27 -0
  6. package/dist/cli/commander-usage.js.map +1 -1
  7. package/dist/cli/commands/activity.js +19 -4
  8. package/dist/cli/commands/activity.js.map +1 -1
  9. package/dist/cli/commands/calendar.js +5 -2
  10. package/dist/cli/commands/calendar.js.map +1 -1
  11. package/dist/cli/commands/contracts.js +63 -19
  12. package/dist/cli/commands/contracts.js.map +1 -1
  13. package/dist/cli/commands/create.js +58 -3
  14. package/dist/cli/commands/create.js.map +1 -1
  15. package/dist/cli/commands/extension.d.ts +14 -3
  16. package/dist/cli/commands/extension.js +481 -95
  17. package/dist/cli/commands/extension.js.map +1 -1
  18. package/dist/cli/commands/index.d.ts +1 -8
  19. package/dist/cli/commands/index.js +1 -8
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/reindex.d.ts +8 -0
  22. package/dist/cli/commands/reindex.js +96 -23
  23. package/dist/cli/commands/reindex.js.map +1 -1
  24. package/dist/cli/commands/search.js +51 -25
  25. package/dist/cli/commands/search.js.map +1 -1
  26. package/dist/cli/commands/test.js +14 -6
  27. package/dist/cli/commands/test.js.map +1 -1
  28. package/dist/cli/commands/upgrade.d.ts +63 -0
  29. package/dist/cli/commands/upgrade.js +260 -0
  30. package/dist/cli/commands/upgrade.js.map +1 -0
  31. package/dist/cli/guide-topics.js +18 -16
  32. package/dist/cli/guide-topics.js.map +1 -1
  33. package/dist/cli/help-content.js +57 -18
  34. package/dist/cli/help-content.js.map +1 -1
  35. package/dist/cli/main.js +73 -7
  36. package/dist/cli/main.js.map +1 -1
  37. package/dist/cli/register-list-query.js +24 -142
  38. package/dist/cli/register-list-query.js.map +1 -1
  39. package/dist/cli/register-mutation.js +49 -257
  40. package/dist/cli/register-mutation.js.map +1 -1
  41. package/dist/cli/register-operations.js +29 -198
  42. package/dist/cli/register-operations.js.map +1 -1
  43. package/dist/cli/register-setup.js +181 -204
  44. package/dist/cli/register-setup.js.map +1 -1
  45. package/dist/cli/registration-helpers.d.ts +2 -2
  46. package/dist/cli/registration-helpers.js +1 -19
  47. package/dist/cli/registration-helpers.js.map +1 -1
  48. package/dist/core/extensions/loader.js +7 -1
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/packages/manifest.d.ts +38 -0
  51. package/dist/core/packages/manifest.js +221 -0
  52. package/dist/core/packages/manifest.js.map +1 -0
  53. package/dist/core/search/embedding-batches.d.ts +13 -1
  54. package/dist/core/search/embedding-batches.js +19 -1
  55. package/dist/core/search/embedding-batches.js.map +1 -1
  56. package/dist/core/store/front-matter-cache.d.ts +8 -1
  57. package/dist/core/store/front-matter-cache.js +20 -11
  58. package/dist/core/store/front-matter-cache.js.map +1 -1
  59. package/dist/mcp/server.d.ts +8 -0
  60. package/dist/mcp/server.js +100 -43
  61. package/dist/mcp/server.js.map +1 -1
  62. package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -0
  63. package/dist/sdk/cli-contracts/commander-mutation-options.js +477 -0
  64. package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -0
  65. package/dist/sdk/cli-contracts/commander-types.d.ts +21 -0
  66. package/dist/sdk/cli-contracts/commander-types.js +92 -0
  67. package/dist/sdk/cli-contracts/commander-types.js.map +1 -0
  68. package/dist/sdk/cli-contracts.d.ts +22 -32
  69. package/dist/sdk/cli-contracts.js +155 -296
  70. package/dist/sdk/cli-contracts.js.map +1 -1
  71. package/dist/sdk/index.d.ts +2 -0
  72. package/dist/sdk/index.js +2 -0
  73. package/dist/sdk/index.js.map +1 -1
  74. package/dist/sdk/runtime.d.ts +29 -0
  75. package/dist/sdk/runtime.js +28 -0
  76. package/dist/sdk/runtime.js.map +1 -0
  77. package/docs/ARCHITECTURE.md +1 -1
  78. package/docs/COMMANDS.md +17 -1
  79. package/docs/EXTENSIONS.md +169 -61
  80. package/docs/QUICKSTART.md +11 -2
  81. package/docs/README.md +4 -6
  82. package/docs/RELEASING.md +4 -2
  83. package/docs/SDK.md +79 -438
  84. package/package.json +6 -23
  85. package/packages/pm-beads/README.md +10 -0
  86. package/packages/pm-beads/extensions/beads/index.js +113 -0
  87. package/{.agents/pm/extensions/beads/index.js → packages/pm-beads/extensions/beads/index.ts} +42 -20
  88. package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.js +2 -17
  89. package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.ts +41 -18
  90. package/packages/pm-beads/package.json +50 -0
  91. package/packages/pm-calendar/README.md +13 -0
  92. package/packages/pm-calendar/extensions/calendar/index.js +56 -0
  93. package/packages/pm-calendar/extensions/calendar/index.ts +62 -0
  94. package/packages/pm-calendar/extensions/calendar/manifest.json +7 -0
  95. package/packages/pm-calendar/extensions/calendar/runtime.js +95 -0
  96. package/packages/pm-calendar/extensions/calendar/runtime.ts +104 -0
  97. package/packages/pm-calendar/package.json +51 -0
  98. package/packages/pm-governance-audit/README.md +23 -0
  99. package/packages/pm-governance-audit/extensions/governance-audit/index.js +117 -0
  100. package/packages/pm-governance-audit/extensions/governance-audit/index.ts +118 -0
  101. package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +7 -0
  102. package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +159 -0
  103. package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +176 -0
  104. package/packages/pm-governance-audit/package.json +52 -0
  105. package/packages/pm-guide-shell/README.md +23 -0
  106. package/packages/pm-guide-shell/extensions/guide-shell/index.js +76 -0
  107. package/packages/pm-guide-shell/extensions/guide-shell/index.ts +81 -0
  108. package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +7 -0
  109. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +263 -0
  110. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +327 -0
  111. package/packages/pm-guide-shell/package.json +52 -0
  112. package/packages/pm-linked-test-adapters/README.md +24 -0
  113. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +101 -0
  114. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +102 -0
  115. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +7 -0
  116. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +142 -0
  117. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +173 -0
  118. package/packages/pm-linked-test-adapters/package.json +53 -0
  119. package/packages/pm-search-advanced/README.md +27 -0
  120. package/packages/pm-search-advanced/extensions/search-advanced/index.js +93 -0
  121. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +94 -0
  122. package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +7 -0
  123. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +120 -0
  124. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +144 -0
  125. package/packages/pm-search-advanced/package.json +54 -0
  126. package/packages/pm-templates/README.md +20 -0
  127. package/packages/pm-templates/extensions/templates/index.js +101 -0
  128. package/packages/pm-templates/extensions/templates/index.ts +109 -0
  129. package/packages/pm-templates/extensions/templates/manifest.json +7 -0
  130. package/packages/pm-templates/extensions/templates/runtime.js +226 -0
  131. package/packages/pm-templates/extensions/templates/runtime.ts +283 -0
  132. package/packages/pm-templates/package.json +50 -0
  133. package/packages/pm-todos/README.md +11 -0
  134. package/packages/pm-todos/extensions/todos/index.js +130 -0
  135. package/{.agents/pm/extensions/todos/index.js → packages/pm-todos/extensions/todos/index.ts} +47 -23
  136. package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.js +3 -18
  137. package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.ts +42 -20
  138. package/packages/pm-todos/package.json +51 -0
  139. package/plugins/pm-cli-claude/README.md +1 -2
  140. package/plugins/pm-cli-claude/hooks/session-start.mjs +4 -55
  141. package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +4 -2
  142. package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +4 -2
  143. package/.agents/pm/extensions/.managed-extensions.json +0 -42
  144. package/.agents/skills/HARNESS_COMPATIBILITY.md +0 -45
  145. package/.agents/skills/README.md +0 -21
  146. package/.agents/skills/pm-developer/SKILL.md +0 -73
  147. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +0 -48
  148. package/.agents/skills/pm-developer/references/PROMPTS.md +0 -17
  149. package/.agents/skills/pm-extensions/SKILL.md +0 -57
  150. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +0 -40
  151. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +0 -25
  152. package/.agents/skills/pm-sdk/SKILL.md +0 -50
  153. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +0 -31
  154. package/.agents/skills/pm-sdk/references/PROMPTS.md +0 -13
  155. package/.agents/skills/pm-user/SKILL.md +0 -59
  156. package/.agents/skills/pm-user/references/PROMPTS.md +0 -17
  157. package/.agents/skills/pm-user/references/WORKFLOWS.md +0 -35
  158. package/.pi/README.md +0 -35
  159. package/.pi/agents/pm-triage-agent.md +0 -19
  160. package/.pi/agents/pm-verification-agent.md +0 -21
  161. package/.pi/chains/pm-native-delivery.chain.md +0 -11
  162. package/.pi/extensions/pm-cli/index.js +0 -387
  163. package/.pi/prompts/pm-workflow.md +0 -5
  164. package/.pi/skills/pm-native/SKILL.md +0 -44
  165. package/.pi/skills/pm-release/SKILL.md +0 -35
  166. package/dist/pi/native.d.ts +0 -5
  167. package/dist/pi/native.js +0 -236
  168. package/dist/pi/native.js.map +0 -1
  169. package/docs/PI_PACKAGE.md +0 -141
  170. /package/{.agents/pm → packages/pm-beads}/extensions/beads/manifest.json +0 -0
  171. /package/{.agents/pm → packages/pm-todos}/extensions/todos/manifest.json +0 -0
package/docs/RELEASING.md CHANGED
@@ -40,7 +40,7 @@ pnpm version:check
40
40
  - Keep any `release` environment compatible with free GitHub features. This repository is public, so environment secrets and tag/branch deployment rules are compatible with the free GitHub path; do not add paid-only release gates.
41
41
  - Ensure `GITHUB_TOKEN` has `contents: write` for GitHub Release creation.
42
42
  - Keep `package.json` repository, homepage, and bugs URLs aligned with `https://github.com/unbraind/pm-cli`.
43
- - Keep npm automation token settings compatible with provenance publishing. The release workflow must keep `id-token: write`, a GitHub-hosted runner, and `npm publish --access public --provenance`.
43
+ - Keep npm automation token settings compatible with provenance publishing. The release workflow must keep `id-token: write`, a GitHub-hosted runner, and `npm publish --access public --provenance`. npm Trusted Publishing is preferred because it uses OIDC short-lived credentials; if the npm package is configured for Trusted Publishing, restrict traditional token publishing after verifying the workflow.
44
44
 
45
45
  ## Automated Daily Driver
46
46
 
@@ -134,8 +134,9 @@ git push origin v<version>
134
134
  - generated release notes from changelog plus sanitized tracker metadata
135
135
  - artifact uploads
136
136
  - `npm publish --access public --provenance`, skipped on retry when the exact version is already present on npm
137
- - post-publish npm/npx/bunx verification
137
+ - post-publish npm/npx/bunx verification through `scripts/release/verify-published-release.mjs`
138
138
  - GitHub Release creation
139
+ - GitHub Release metadata verification through the same local verification script
139
140
 
140
141
  Monitor:
141
142
 
@@ -151,6 +152,7 @@ npm view @unbrained/pm-cli@<version> version dist.integrity dist.unpackedSize --
151
152
  npx --yes --package @unbrained/pm-cli@<version> -- pm --version
152
153
  bunx --bun @unbrained/pm-cli@<version> pm --version
153
154
  gh release view v<version> --json tagName,name,isDraft,isPrerelease,url
155
+ pnpm release:verify-published -- --version <version>
154
156
  ```
155
157
 
156
158
  The executable remains `pm` even though the npm package is scoped.
package/docs/SDK.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The supported programmatic surface is `@unbrained/pm-cli/sdk`.
4
4
 
5
- Use this package for extension authoring, command/action contract discovery, and deterministic app or CI automation. Do not import private `src/core/...` modules from external integrations.
5
+ Use it for extension authoring, package authoring, command/action contract discovery, and deterministic app or CI automation. Do not import private `src/core/...` modules from external integrations or packages.
6
6
 
7
7
  ## Install
8
8
 
@@ -10,461 +10,78 @@ Use this package for extension authoring, command/action contract discovery, and
10
10
  npm install @unbrained/pm-cli
11
11
  ```
12
12
 
13
- ## Core Exports
14
-
15
- ### Extension authoring
16
-
17
- - `defineExtension`
18
- - `EXTENSION_CAPABILITIES`
19
- - `EXTENSION_CAPABILITY_CONTRACT`
20
- - `EXTENSION_CAPABILITY_CONTRACT_VERSION`
21
- - `EXTENSION_CAPABILITY_LEGACY_ALIASES`
22
- - `EXTENSION_POLICY_MODES`
23
- - `EXTENSION_POLICY_SURFACES`
24
- - `EXTENSION_TRUST_MODES`
25
- - `EXTENSION_SANDBOX_PROFILES`
26
-
27
- ### Command and action contracts
28
-
29
- - `PM_CORE_COMMAND_NAMES`
30
- - `PM_TOOL_ACTIONS`
31
- - `PM_TOOL_PARAMETERS_SCHEMA`
32
- - `PM_PI_TOOL_PARAMETERS_SCHEMA`
33
- - `PM_TOOL_ACTION_PARAMETER_CONTRACTS`
34
-
35
- ### Runtime contract constants
36
-
37
- - `PM_EXTENSION_CAPABILITY_CONTRACTS`
38
- - `PM_EXTENSION_SERVICE_NAME_CONTRACTS`
39
- - `PM_EXTENSION_POLICY_MODE_CONTRACTS`
40
- - `PM_EXTENSION_POLICY_SURFACE_CONTRACTS`
41
- - `PM_EXTENSION_TRUST_MODE_CONTRACTS`
42
- - `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
43
-
44
- ### Type guards
45
-
46
- - `isPmToolAction`
47
- - `isPmExtensionCapabilityContract`
48
- - `isPmExtensionServiceNameContract`
49
- - `isPmExtensionPolicyModeContract`
50
- - `isPmExtensionPolicySurfaceContract`
51
-
52
- ## Capability Mapping
53
-
54
- - `commands` -> `registerCommand`
55
- - `schema` -> `registerFlags`, `registerItemFields`, `registerItemTypes`, `registerMigration`
56
- - `importers` -> `registerImporter`, `registerExporter`
57
- - `search` -> `registerSearchProvider`, `registerVectorStoreAdapter`
58
- - `hooks` -> `api.hooks.*`
59
- - `parser` -> `registerParser`
60
- - `preflight` -> `registerPreflight`
61
- - `services` -> `registerService`
62
- - `renderers` -> `registerRenderer`
63
-
64
- ## Extension Example
13
+ ## Import Surfaces
65
14
 
66
15
  ```ts
67
16
  import { defineExtension } from "@unbrained/pm-cli/sdk";
68
-
69
- export default defineExtension({
70
- activate(api) {
71
- api.registerCommand({
72
- name: "release audit",
73
- action: "release-audit",
74
- description: "Collect release-readiness diagnostics.",
75
- intent: "Produce deterministic gate payloads for CI.",
76
- flags: [{ long: "--strict", description: "Enable strict gate mode." }],
77
- run: async (context) => ({
78
- ok: true,
79
- command: context.command,
80
- strict: context.options.strict === true,
81
- }),
82
- });
83
- },
84
- });
85
- ```
86
-
87
- ## Contracts-First Automation
88
-
89
- Use runtime contracts for extension-aware schemas:
90
-
91
- ```bash
92
- pm contracts --json
93
- pm contracts --schema-only --json
94
- pm contracts --command extension --flags-only --json
95
- pm contracts --action create --schema-only --json
96
- ```
97
-
98
- Minimal script pattern:
99
-
100
- ```ts
101
- import { PM_TOOL_ACTION_PARAMETER_CONTRACTS, isPmToolAction } from "@unbrained/pm-cli/sdk";
102
- import { spawnSync } from "node:child_process";
103
-
104
- const action = "extension-reload";
105
- if (!isPmToolAction(action)) throw new Error("Unsupported action");
106
- const contract = PM_TOOL_ACTION_PARAMETER_CONTRACTS[action];
107
- console.log(contract.required, contract.optional);
108
-
109
- const result = spawnSync("pm", ["contracts", "--json"], { encoding: "utf8" });
110
- if (result.status !== 0) throw new Error(result.stderr);
111
17
  ```
112
18
 
113
- ## Compatibility Metadata
114
-
115
- `pm contracts --json` includes compatibility metadata for extension integrations:
116
-
117
- - `extension_contracts.trust_modes`
118
- - `extension_contracts.sandbox_profiles`
119
- - `extension_contracts.manifest_versions`
120
- - `extension_contracts.compatibility`
121
- - `action_availability[].policy_state`
122
-
123
- Current compatibility model:
124
-
125
- - manifest current: `v2`
126
- - supported previous: `v1`
127
- - strategy: `versioned_breaking`
128
-
129
- ## Runnable Examples
130
-
131
- - `docs/examples/sdk-contract-consumer/`
132
- - `docs/examples/sdk-app-embedding/`
133
- - `docs/examples/ci/`
134
-
135
- ## Related Docs
136
-
137
- - `docs/EXTENSIONS.md`
138
- - `docs/CLAUDE_CODE_PLUGIN.md`
139
- # SDK
140
-
141
- The supported programmatic surface is `@unbrained/pm-cli/sdk`.
142
-
143
- Use this for:
144
-
145
- - extension authoring (`defineExtension`)
146
- - command/action schema discovery (`PM_TOOL_PARAMETERS_SCHEMA`)
147
- - runtime action contracts (`PM_TOOL_ACTION_PARAMETER_CONTRACTS`)
148
- - capability/policy/trust/sandbox contract constants
19
+ Supported package exports:
149
20
 
150
- Do not import private `src/core/...` modules from external integrations.
21
+ - `@unbrained/pm-cli/sdk` - stable extension and package authoring API plus CLI contract exports.
22
+ - `@unbrained/pm-cli/cli` - runtime CLI module entrypoint for package resolution, not a typed library API.
151
23
 
152
- ## Install
24
+ ## Public Exports
153
25
 
154
- ```bash
155
- npm install @unbrained/pm-cli
156
- ```
26
+ Source of truth:
157
27
 
158
- ## Key Exports
28
+ - [`src/sdk/index.ts`](../src/sdk/index.ts)
29
+ - [`src/sdk/runtime.ts`](../src/sdk/runtime.ts)
30
+ - [`src/sdk/cli-contracts.ts`](../src/sdk/cli-contracts.ts)
31
+ - [`src/sdk/cli-contracts/commander-types.ts`](../src/sdk/cli-contracts/commander-types.ts)
32
+ - [`src/sdk/cli-contracts/commander-mutation-options.ts`](../src/sdk/cli-contracts/commander-mutation-options.ts)
159
33
 
160
- ### Extension Authoring
34
+ Common authoring exports:
161
35
 
162
36
  - `defineExtension`
163
37
  - `EXTENSION_CAPABILITIES`
38
+ - `EXTENSION_CAPABILITY_CONTRACT`
39
+ - `EXTENSION_CAPABILITY_CONTRACT_VERSION`
40
+ - `EXTENSION_CAPABILITY_LEGACY_ALIASES`
164
41
  - `EXTENSION_POLICY_MODES`
165
42
  - `EXTENSION_POLICY_SURFACES`
166
43
  - `EXTENSION_TRUST_MODES`
167
44
  - `EXTENSION_SANDBOX_PROFILES`
168
- - `EXTENSION_CAPABILITY_CONTRACT`
169
- - `EXTENSION_CAPABILITY_CONTRACT_VERSION`
170
- - `EXTENSION_CAPABILITY_LEGACY_ALIASES`
171
-
172
- ### Command/Action Contracts
173
-
174
- - `PM_CORE_COMMAND_NAMES`
175
- - `PM_TOOL_ACTIONS`
176
- - `PM_TOOL_PARAMETERS_SCHEMA`
177
- - `PM_PI_TOOL_PARAMETERS_SCHEMA`
178
- - `PM_TOOL_ACTION_PARAMETER_CONTRACTS`
179
-
180
- ### Extension Runtime Contract Constants
181
-
182
- - `PM_EXTENSION_CAPABILITY_CONTRACTS`
183
- - `PM_EXTENSION_SERVICE_NAME_CONTRACTS`
184
- - `PM_EXTENSION_POLICY_MODE_CONTRACTS`
185
- - `PM_EXTENSION_POLICY_SURFACE_CONTRACTS`
186
- - `PM_EXTENSION_TRUST_MODE_CONTRACTS`
187
- - `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
188
-
189
- ### Type Guards
190
-
191
- - `isPmToolAction`
192
- - `isPmExtensionCapabilityContract`
193
- - `isPmExtensionServiceNameContract`
194
- - `isPmExtensionPolicyModeContract`
195
- - `isPmExtensionPolicySurfaceContract`
196
-
197
- ## Extension Example
198
-
199
- ```ts
200
- import { defineExtension } from "@unbrained/pm-cli/sdk";
201
-
202
- export default defineExtension({
203
- activate(api) {
204
- api.registerCommand({
205
- name: "release audit",
206
- action: "release-audit",
207
- description: "Collect release-readiness diagnostics.",
208
- intent: "Produce deterministic gate payloads for CI.",
209
- run: async (context) => ({
210
- ok: true,
211
- command: context.command,
212
- }),
213
- });
214
- },
215
- });
216
- ```
217
-
218
- ## Contracts-First Automation Pattern
219
-
220
- ```ts
221
- import { PM_TOOL_ACTION_PARAMETER_CONTRACTS, isPmToolAction } from "@unbrained/pm-cli/sdk";
222
- import { spawnSync } from "node:child_process";
223
-
224
- const action = "extension-reload";
225
- if (!isPmToolAction(action)) throw new Error("Unsupported action");
226
- const contract = PM_TOOL_ACTION_PARAMETER_CONTRACTS[action];
227
- console.log(contract.required, contract.optional);
228
-
229
- const contracts = spawnSync("pm", ["contracts", "--json"], { encoding: "utf8" });
230
- if (contracts.status !== 0) throw new Error(contracts.stderr);
231
- ```
232
-
233
- ## Runtime Metadata Added For v2
234
-
235
- `pm contracts --json` now includes richer extension metadata:
236
-
237
- - `extension_contracts.trust_modes`
238
- - `extension_contracts.sandbox_profiles`
239
- - `extension_contracts.manifest_versions`
240
- - `extension_contracts.compatibility`
241
- - `action_availability[].policy_state` for extension-backed actions
242
-
243
- Use these fields to gate CI and to route compatibility behavior in embedded runtimes.
244
-
245
- ## Versioned-Breaking Compatibility
246
45
 
247
- Current contract compatibility model:
46
+ Package manifest exports:
248
47
 
249
- - `manifest` current: `v2`
250
- - supported previous: `v1`
251
- - strategy: `versioned_breaking`
252
-
253
- Recommended migration flow:
254
-
255
- 1. read runtime contracts (`pm contracts --json`)
256
- 2. branch behavior by compatibility metadata
257
- 3. migrate manifests/policy to v2
258
- 4. enforce trust/sandbox policy gates in CI
259
-
260
- ## Runnable Examples
261
-
262
- - contracts consumer: `docs/examples/sdk-contract-consumer/`
263
- - app embedding runner: `docs/examples/sdk-app-embedding/`
264
- - CI gates: `docs/examples/ci/`
265
-
266
- ## Related Docs
267
-
268
- - `docs/EXTENSIONS.md`
269
- - `docs/CLAUDE_CODE_PLUGIN.md`
270
- # SDK
271
-
272
- The stable integration surface is `@unbrained/pm-cli/sdk`. Use it for extension authoring, action/flag contract discovery, and deterministic app/CI automation.
273
-
274
- ## Install
275
-
276
- ```bash
277
- npm install @unbrained/pm-cli
278
- ```
279
-
280
- ```ts
281
- import {
282
- defineExtension,
283
- EXTENSION_CAPABILITIES,
284
- EXTENSION_POLICY_MODES,
285
- EXTENSION_POLICY_SURFACES,
286
- PM_TOOL_ACTIONS,
287
- PM_TOOL_PARAMETERS_SCHEMA,
288
- PM_TOOL_ACTION_PARAMETER_CONTRACTS,
289
- PM_EXTENSION_CAPABILITY_CONTRACTS,
290
- PM_EXTENSION_SERVICE_NAME_CONTRACTS,
291
- PM_EXTENSION_POLICY_MODE_CONTRACTS,
292
- PM_EXTENSION_POLICY_SURFACE_CONTRACTS,
293
- isPmToolAction,
294
- isPmExtensionCapabilityContract,
295
- } from "@unbrained/pm-cli/sdk";
296
- ```
297
-
298
- ## What Is Exported
299
-
300
- Core authoring exports:
301
-
302
- - `defineExtension`
303
- - `EXTENSION_CAPABILITIES`
304
- - `EXTENSION_CAPABILITY_CONTRACT`
305
- - `EXTENSION_POLICY_MODES`
306
- - `EXTENSION_POLICY_SURFACES`
48
+ - `PM_PACKAGE_RESOURCE_KINDS` (`extensions`, `docs`, `examples`)
49
+ - `PM_PACKAGE_CONVENTIONAL_RESOURCE_ROOTS`
50
+ - `readPmPackageManifest`
51
+ - `collectPackageExtensionDirectories`
307
52
 
308
53
  Command/action contract exports:
309
54
 
310
55
  - `PM_CORE_COMMAND_NAMES`
311
56
  - `PM_TOOL_ACTIONS`
312
57
  - `PM_TOOL_PARAMETERS_SCHEMA`
313
- - `PM_PI_TOOL_PARAMETERS_SCHEMA`
58
+ - `PM_PROVIDER_TOOL_PARAMETERS_SCHEMA`
314
59
  - `PM_TOOL_ACTION_PARAMETER_CONTRACTS`
315
60
 
61
+ Commander option contract exports:
62
+
63
+ - `CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS`
64
+ - `UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS`
65
+ - `CREATE_COMMANDER_STRING_OPTION_CONTRACTS`
66
+ - `CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS`
67
+ - `UPDATE_COMMANDER_STRING_OPTION_CONTRACTS`
68
+ - `UPDATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS`
69
+ - `LIST_COMMANDER_STRING_OPTION_CONTRACTS`
70
+ - `SEARCH_COMMANDER_STRING_OPTION_CONTRACTS`
71
+ - `CALENDAR_COMMANDER_STRING_OPTION_CONTRACTS`
72
+ - `CONTEXT_COMMANDER_STRING_OPTION_CONTRACTS`
73
+ - `ACTIVITY_COMMANDER_STRING_OPTION_CONTRACTS`
74
+ - `readFirstStringFromCommanderOptions`
75
+ - `readStringArrayFromCommanderOptions`
76
+
316
77
  Extension runtime contract exports:
317
78
 
318
79
  - `PM_EXTENSION_CAPABILITY_CONTRACTS`
319
80
  - `PM_EXTENSION_SERVICE_NAME_CONTRACTS`
320
81
  - `PM_EXTENSION_POLICY_MODE_CONTRACTS`
321
82
  - `PM_EXTENSION_POLICY_SURFACE_CONTRACTS`
322
-
323
- Type guards:
324
-
325
- - `isPmToolAction(value)`
326
- - `isPmExtensionCapabilityContract(value)`
327
- - `isPmExtensionServiceNameContract(value)`
328
- - `isPmExtensionPolicyModeContract(value)`
329
- - `isPmExtensionPolicySurfaceContract(value)`
330
-
331
- ## Capability Mapping
332
-
333
- - `commands` -> `registerCommand`
334
- - `schema` -> `registerFlags`, `registerItemFields`, `registerItemTypes`, `registerMigration`
335
- - `importers` -> `registerImporter`, `registerExporter`
336
- - `search` -> `registerSearchProvider`, `registerVectorStoreAdapter`
337
- - `hooks` -> `api.hooks.*`
338
- - `parser` -> `registerParser`
339
- - `preflight` -> `registerPreflight`
340
- - `services` -> `registerService`
341
- - `renderers` -> `registerRenderer`
342
-
343
- ## Extension Authoring Example
344
-
345
- ```ts
346
- import { defineExtension } from "@unbrained/pm-cli/sdk";
347
-
348
- export default defineExtension({
349
- activate(api) {
350
- api.registerCommand({
351
- name: "release audit",
352
- action: "release-audit",
353
- description: "Collect release readiness diagnostics.",
354
- intent: "provide deterministic audit payloads for CI gates",
355
- examples: ["pm release audit --strict"],
356
- failure_hints: ["Run pm extension --doctor --detail deep --trace on activation failures."],
357
- flags: [{ long: "--strict", description: "Enable strict gate mode." }],
358
- run: async (context) => ({
359
- ok: true,
360
- command: context.command,
361
- strict: context.options.strict === true,
362
- }),
363
- });
364
- },
365
- });
366
- ```
367
-
368
- ## Programmatic Contracts (App/Script)
369
-
370
- Use runtime `pm contracts` for extension-aware schemas:
371
-
372
- ```bash
373
- pm contracts --json
374
- pm contracts --schema-only --json
375
- pm contracts --command extension --flags-only --json
376
- pm contracts --action create --schema-only --json
377
- ```
378
-
379
- The result includes:
380
-
381
- - `actions`: runtime-invocable action list
382
- - `action_availability`: invocable/disabled reasons
383
- - `schema`: strict action-scoped JSON schema
384
- - `command_flags`: merged core + extension + runtime field flags
385
- - `extension_contracts`: capabilities/services/policy mode/surface contract metadata
386
-
387
- ## Robust Script Pattern
388
-
389
- See runnable example: `docs/examples/sdk-contract-consumer/inspect-contracts.mjs`.
390
-
391
- Minimal pattern:
392
-
393
- 1. Read contracts JSON.
394
- 2. Validate action exists in `actions`.
395
- 3. Validate required fields with `PM_TOOL_ACTION_PARAMETER_CONTRACTS`.
396
- 4. Execute the action only after preflight passes.
397
-
398
- ## CI/CD Pattern
399
-
400
- Recommended gate sequence:
401
-
402
- ```bash
403
- pnpm build
404
- pm contracts --schema-only --json > /tmp/pm-contracts.json
405
- pm extension --doctor --project --detail summary --strict-exit
406
- node scripts/run-tests.mjs test -- tests/unit/contracts-command.spec.ts
407
- node scripts/run-tests.mjs coverage
408
- ```
409
-
410
- Reference workflow file:
411
-
412
- - `docs/examples/ci/github-actions-pm-extension-gate.yml`
413
-
414
- ## Pi / Tooling Compatibility
415
-
416
- For provider-safe schemas, use `PM_PI_TOOL_PARAMETERS_SCHEMA`. It is flat, non-`oneOf`, and designed for tool providers that reject advanced schema constructs.
417
-
418
- The bundled Pi wrapper (`.pi/extensions/pm-cli/index.js`) consumes this schema directly to reduce contract drift.
419
-
420
- ## Related Docs
421
-
422
- - `docs/EXTENSIONS.md`
423
- - `docs/examples/starter-extension/README.md`
424
- - `docs/examples/sdk-contract-consumer/README.md`
425
- # SDK
426
-
427
- The public SDK is exported from `@unbrained/pm-cli/sdk`. Use it for extension authoring and command-contract introspection. Do not import internal `src/core/...` modules from extensions.
428
-
429
- ## Agent Quick Context
430
-
431
- - Primary import: `@unbrained/pm-cli/sdk`.
432
- - Runtime extension lifecycle is documented in [Extensions](EXTENSIONS.md).
433
- - Exact command/action contracts are available through `pm contracts`.
434
- - Local deep-dive routing is available through `pm guide sdk --depth deep`.
435
-
436
- Tracked documentation work: [pm-1sb2](../.agents/pm/tasks/pm-1sb2.toon).
437
-
438
- ## Import Surfaces
439
-
440
- ```ts
441
- import { defineExtension } from "@unbrained/pm-cli/sdk";
442
- ```
443
-
444
- Supported package exports:
445
-
446
- - `@unbrained/pm-cli/sdk` - stable extension authoring API and CLI contract exports.
447
- - `@unbrained/pm-cli/cli` - runtime CLI module entrypoint for package resolution, not a typed library API.
448
-
449
- ## Public Exports
450
-
451
- Source of truth:
452
-
453
- - [`src/sdk/index.ts`](../src/sdk/index.ts)
454
- - [`src/sdk/cli-contracts.ts`](../src/sdk/cli-contracts.ts)
455
-
456
- Common authoring exports:
457
-
458
- - `defineExtension`
459
- - `EXTENSION_CAPABILITIES`
460
- - `EXTENSION_CAPABILITY_CONTRACT`
461
- - `EXTENSION_CAPABILITY_CONTRACT_VERSION`
462
- - `EXTENSION_CAPABILITY_LEGACY_ALIASES`
463
- - `PM_CORE_COMMAND_NAMES`
464
- - `PM_TOOL_ACTIONS`
465
- - `PM_TOOL_PARAMETERS_SCHEMA`
466
- - `PM_EXTENSION_CAPABILITY_CONTRACTS`
467
- - `PM_EXTENSION_SERVICE_NAME_CONTRACTS`
83
+ - `PM_EXTENSION_TRUST_MODE_CONTRACTS`
84
+ - `PM_EXTENSION_SANDBOX_PROFILE_CONTRACTS`
468
85
 
469
86
  Common types:
470
87
 
@@ -472,13 +89,35 @@ Common types:
472
89
  - `ExtensionManifest`
473
90
  - `CommandDefinition`
474
91
  - `FlagDefinition`
92
+ - `ServiceOverrideContext`
475
93
  - `SchemaFieldDefinition`
476
94
  - `SchemaItemTypeDefinition`
477
95
  - `SearchProviderDefinition`
478
96
  - `VectorStoreAdapterDefinition`
479
97
  - `GlobalOptions`
98
+ - `ItemDocument`
480
99
  - `PmSettings`
481
100
 
101
+ ## Static And Runtime Contracts
102
+
103
+ `PM_TOOL_ACTIONS` and `PM_TOOL_PARAMETERS_SCHEMA` describe the always-on static core action surface. They include core project-management primitives, package lifecycle actions, and `upgrade`.
104
+
105
+ Package-owned actions such as `beads-import`, `todos-export`, `calendar`, and `templates-save` are intentionally not advertised as static core actions. Discover installed package actions with runtime contracts:
106
+
107
+ ```bash
108
+ pm contracts --runtime-only --json
109
+ pm contracts --action calendar --runtime-only --schema-only --json
110
+ pm contracts --command templates --runtime-only --flags-only --json
111
+ ```
112
+
113
+ Use static SDK contracts for baseline validation, then use `pm contracts --runtime-only` in the target project before invoking package-provided commands or actions.
114
+
115
+ When a package-owned command is missing at runtime, CLI usage guidance now includes a deterministic install hint (for example `pm install calendar` or `pm install search-advanced`) so agents can recover in one retry.
116
+
117
+ Package installs currently activate only extension resources. Additional package resource kinds (`docs`, `examples`) are metadata-first and available through package manifest/catalog inspection.
118
+
119
+ For provider-safe schemas, use `PM_PROVIDER_TOOL_PARAMETERS_SCHEMA`. It is flat and avoids advanced schema constructs such as root `oneOf`.
120
+
482
121
  ## Capability Requirements
483
122
 
484
123
  | Registration | Manifest capability |
@@ -508,9 +147,11 @@ export default defineExtension({
508
147
  activate(api) {
509
148
  api.registerCommand({
510
149
  name: "hello",
150
+ action: "hello",
511
151
  description: "Return a deterministic hello payload.",
512
152
  intent: "verify SDK extension activation",
513
153
  examples: ["pm hello"],
154
+ failure_hints: ["Run pm package doctor --detail deep --trace on activation failures."],
514
155
  run: async () => ({ ok: true, message: "hello" }),
515
156
  });
516
157
  },
@@ -579,23 +220,23 @@ export default defineExtension({
579
220
 
580
221
  Manifest capability: `search`.
581
222
 
582
- ## Command Contracts
223
+ ## Robust Automation Pattern
583
224
 
584
- For machine clients:
225
+ 1. Read `PM_TOOL_ACTIONS` or `PM_TOOL_PARAMETERS_SCHEMA` for baseline static validation.
226
+ 2. Run `pm contracts --runtime-only --json` inside the target project.
227
+ 3. Verify the action appears in `actions` and has `action_availability[].invocable: true`.
228
+ 4. Validate required fields with `PM_TOOL_ACTION_PARAMETER_CONTRACTS` for static actions or the runtime schema for package actions.
229
+ 5. Execute only after preflight passes.
585
230
 
586
- ```bash
587
- pm contracts --json
588
- pm contracts --command create --flags-only --json
589
- pm contracts --action create --schema-only --json
590
- ```
231
+ Runnable examples:
591
232
 
592
- Use the runtime command because active extensions can add command/action metadata.
233
+ - [SDK contract consumer](examples/sdk-contract-consumer/README.md)
234
+ - [SDK app embedding](examples/sdk-app-embedding/README.md)
235
+ - [CI examples](examples/ci/)
593
236
 
594
237
  ## CLI Simplification Migration
595
238
 
596
- The conservative full-surface simplification pass updated invocation parsing and error envelopes. Integration details are documented in:
597
-
598
- - [CLI Simplification Migration](MIGRATION_CLI_SIMPLIFICATION.md)
239
+ The conservative full-surface simplification pass updated invocation parsing and error envelopes. Integration details are documented in [CLI Simplification Migration](MIGRATION_CLI_SIMPLIFICATION.md).
599
240
 
600
241
  For SDK and automation consumers, the key runtime change is the optional `recovery` object in CLI usage/error JSON payloads:
601
242
 
@@ -610,15 +251,15 @@ Treat `recovery.suggested_retry` as the first-choice deterministic replay comman
610
251
  ## Authoring Pattern
611
252
 
612
253
  - Keep handlers deterministic and JSON-like.
613
- - Return data, not pre-rendered terminal text, unless implementing a renderer.
254
+ - Return data, not pre-rendered terminal text, unless implementing a renderer or output service.
614
255
  - Keep service and preflight overrides narrow.
615
256
  - Declare only capabilities in use.
616
257
  - Include examples and failure hints in dynamic commands.
617
- - Add `pm extension doctor` diagnostics to testing instructions.
258
+ - Add `pm package doctor` diagnostics to testing instructions.
618
259
 
619
260
  ## Related Docs
620
261
 
621
- - [Extensions](EXTENSIONS.md)
262
+ - [Extensions And Packages](EXTENSIONS.md)
622
263
  - [CLI Simplification Migration](MIGRATION_CLI_SIMPLIFICATION.md)
623
264
  - [Architecture](ARCHITECTURE.md)
624
- - [starter extension](examples/starter-extension/README.md)
265
+ - [Starter Extension](examples/starter-extension/README.md)