@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.
- package/AGENTS.md +3 -116
- package/CHANGELOG.md +18 -0
- package/PRD.md +18 -39
- package/README.md +8 -5
- package/dist/cli/commander-usage.js +27 -0
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/activity.js +19 -4
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/calendar.js +5 -2
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/contracts.js +63 -19
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +58 -3
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +14 -3
- package/dist/cli/commands/extension.js +481 -95
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -8
- package/dist/cli/commands/index.js +1 -8
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +8 -0
- package/dist/cli/commands/reindex.js +96 -23
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/search.js +51 -25
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test.js +14 -6
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +63 -0
- package/dist/cli/commands/upgrade.js +260 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/guide-topics.js +18 -16
- package/dist/cli/guide-topics.js.map +1 -1
- package/dist/cli/help-content.js +57 -18
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/main.js +73 -7
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +24 -142
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +49 -257
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +29 -198
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +181 -204
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +2 -2
- package/dist/cli/registration-helpers.js +1 -19
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/core/extensions/loader.js +7 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/packages/manifest.d.ts +38 -0
- package/dist/core/packages/manifest.js +221 -0
- package/dist/core/packages/manifest.js.map +1 -0
- package/dist/core/search/embedding-batches.d.ts +13 -1
- package/dist/core/search/embedding-batches.js +19 -1
- package/dist/core/search/embedding-batches.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +8 -1
- package/dist/core/store/front-matter-cache.js +20 -11
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.js +100 -43
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-mutation-options.d.ts +7 -0
- package/dist/sdk/cli-contracts/commander-mutation-options.js +477 -0
- package/dist/sdk/cli-contracts/commander-mutation-options.js.map +1 -0
- package/dist/sdk/cli-contracts/commander-types.d.ts +21 -0
- package/dist/sdk/cli-contracts/commander-types.js +92 -0
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +22 -32
- package/dist/sdk/cli-contracts.js +155 -296
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runtime.d.ts +29 -0
- package/dist/sdk/runtime.js +28 -0
- package/dist/sdk/runtime.js.map +1 -0
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/COMMANDS.md +17 -1
- package/docs/EXTENSIONS.md +169 -61
- package/docs/QUICKSTART.md +11 -2
- package/docs/README.md +4 -6
- package/docs/RELEASING.md +4 -2
- package/docs/SDK.md +79 -438
- package/package.json +6 -23
- package/packages/pm-beads/README.md +10 -0
- package/packages/pm-beads/extensions/beads/index.js +113 -0
- package/{.agents/pm/extensions/beads/index.js → packages/pm-beads/extensions/beads/index.ts} +42 -20
- package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.js +2 -17
- package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.ts +41 -18
- package/packages/pm-beads/package.json +50 -0
- package/packages/pm-calendar/README.md +13 -0
- package/packages/pm-calendar/extensions/calendar/index.js +56 -0
- package/packages/pm-calendar/extensions/calendar/index.ts +62 -0
- package/packages/pm-calendar/extensions/calendar/manifest.json +7 -0
- package/packages/pm-calendar/extensions/calendar/runtime.js +95 -0
- package/packages/pm-calendar/extensions/calendar/runtime.ts +104 -0
- package/packages/pm-calendar/package.json +51 -0
- package/packages/pm-governance-audit/README.md +23 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.js +117 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +118 -0
- package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +7 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +159 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +176 -0
- package/packages/pm-governance-audit/package.json +52 -0
- package/packages/pm-guide-shell/README.md +23 -0
- package/packages/pm-guide-shell/extensions/guide-shell/index.js +76 -0
- package/packages/pm-guide-shell/extensions/guide-shell/index.ts +81 -0
- package/packages/pm-guide-shell/extensions/guide-shell/manifest.json +7 -0
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +263 -0
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +327 -0
- package/packages/pm-guide-shell/package.json +52 -0
- package/packages/pm-linked-test-adapters/README.md +24 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.js +101 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/index.ts +102 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/manifest.json +7 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +142 -0
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +173 -0
- package/packages/pm-linked-test-adapters/package.json +53 -0
- package/packages/pm-search-advanced/README.md +27 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +93 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +94 -0
- package/packages/pm-search-advanced/extensions/search-advanced/manifest.json +7 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +120 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +144 -0
- package/packages/pm-search-advanced/package.json +54 -0
- package/packages/pm-templates/README.md +20 -0
- package/packages/pm-templates/extensions/templates/index.js +101 -0
- package/packages/pm-templates/extensions/templates/index.ts +109 -0
- package/packages/pm-templates/extensions/templates/manifest.json +7 -0
- package/packages/pm-templates/extensions/templates/runtime.js +226 -0
- package/packages/pm-templates/extensions/templates/runtime.ts +283 -0
- package/packages/pm-templates/package.json +50 -0
- package/packages/pm-todos/README.md +11 -0
- package/packages/pm-todos/extensions/todos/index.js +130 -0
- package/{.agents/pm/extensions/todos/index.js → packages/pm-todos/extensions/todos/index.ts} +47 -23
- package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.js +3 -18
- package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.ts +42 -20
- package/packages/pm-todos/package.json +51 -0
- package/plugins/pm-cli-claude/README.md +1 -2
- package/plugins/pm-cli-claude/hooks/session-start.mjs +4 -55
- package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +4 -2
- package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +4 -2
- package/.agents/pm/extensions/.managed-extensions.json +0 -42
- package/.agents/skills/HARNESS_COMPATIBILITY.md +0 -45
- package/.agents/skills/README.md +0 -21
- package/.agents/skills/pm-developer/SKILL.md +0 -73
- package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +0 -48
- package/.agents/skills/pm-developer/references/PROMPTS.md +0 -17
- package/.agents/skills/pm-extensions/SKILL.md +0 -57
- package/.agents/skills/pm-extensions/references/LIFECYCLE.md +0 -40
- package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +0 -25
- package/.agents/skills/pm-sdk/SKILL.md +0 -50
- package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +0 -31
- package/.agents/skills/pm-sdk/references/PROMPTS.md +0 -13
- package/.agents/skills/pm-user/SKILL.md +0 -59
- package/.agents/skills/pm-user/references/PROMPTS.md +0 -17
- package/.agents/skills/pm-user/references/WORKFLOWS.md +0 -35
- package/.pi/README.md +0 -35
- package/.pi/agents/pm-triage-agent.md +0 -19
- package/.pi/agents/pm-verification-agent.md +0 -21
- package/.pi/chains/pm-native-delivery.chain.md +0 -11
- package/.pi/extensions/pm-cli/index.js +0 -387
- package/.pi/prompts/pm-workflow.md +0 -5
- package/.pi/skills/pm-native/SKILL.md +0 -44
- package/.pi/skills/pm-release/SKILL.md +0 -35
- package/dist/pi/native.d.ts +0 -5
- package/dist/pi/native.js +0 -236
- package/dist/pi/native.js.map +0 -1
- package/docs/PI_PACKAGE.md +0 -141
- /package/{.agents/pm → packages/pm-beads}/extensions/beads/manifest.json +0 -0
- /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
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
24
|
+
## Public Exports
|
|
153
25
|
|
|
154
|
-
|
|
155
|
-
npm install @unbrained/pm-cli
|
|
156
|
-
```
|
|
26
|
+
Source of truth:
|
|
157
27
|
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
Package manifest exports:
|
|
248
47
|
|
|
249
|
-
- `
|
|
250
|
-
-
|
|
251
|
-
-
|
|
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
|
-
- `
|
|
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
|
-
|
|
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
|
-
##
|
|
223
|
+
## Robust Automation Pattern
|
|
583
224
|
|
|
584
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
- [
|
|
265
|
+
- [Starter Extension](examples/starter-extension/README.md)
|