pm-starter 0.1.0
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/CHANGELOG.md +7 -0
- package/README.md +82 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/manifest.json +21 -0
- package/package.json +88 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# pm-starter
|
|
2
|
+
|
|
3
|
+
Complete scaffold for [pm-cli](https://github.com/unbraind/pm-cli) extensions. Demonstrates all 8 capability types in one file.
|
|
4
|
+
|
|
5
|
+
Use this as a starting template for building your own extensions.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pm install github.com/unbraind/pm-starter --project
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Capabilities
|
|
16
|
+
|
|
17
|
+
| # | Capability | What it does |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| 1 | **Commands** | `pm starter greet` and `pm starter summary` |
|
|
20
|
+
| 2 | **Schema** | Title validation (required, ≤ 200 chars) |
|
|
21
|
+
| 3 | **Hooks** | afterCreate, afterClose, beforeUpdate |
|
|
22
|
+
| 4 | **Importers** | Demo `starter-demo` importer |
|
|
23
|
+
| 5 | **Renderers** | `compact` (TSV) and `markdown-table` renderers |
|
|
24
|
+
| 6 | **Search** | `starter-substring` case-insensitive search |
|
|
25
|
+
| 7 | **Preflight** | `starter-preflight` workspace health check |
|
|
26
|
+
| 8 | **Services** | `starter-health` health check service |
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
### `pm starter greet`
|
|
31
|
+
```bash
|
|
32
|
+
pm starter greet
|
|
33
|
+
pm starter greet --name Developer --emoji 🚀 --uppercase
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### `pm starter summary`
|
|
37
|
+
```bash
|
|
38
|
+
pm starter summary
|
|
39
|
+
pm starter summary --verbose
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Creating a New Extension
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 1. Clone this repo
|
|
46
|
+
git clone https://github.com/unbraind/pm-starter.git my-extension
|
|
47
|
+
cd my-extension
|
|
48
|
+
|
|
49
|
+
# 2. Edit files
|
|
50
|
+
# - manifest.json: update name, description, capabilities
|
|
51
|
+
# - index.ts: keep only the capabilities you need, implement your logic
|
|
52
|
+
# - package.json: update name
|
|
53
|
+
|
|
54
|
+
# 3. Build and test
|
|
55
|
+
npm install
|
|
56
|
+
npm run build
|
|
57
|
+
|
|
58
|
+
# 4. Install locally
|
|
59
|
+
pm install ./my-extension
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Architecture
|
|
63
|
+
|
|
64
|
+
Each capability is in its own setup function for clarity:
|
|
65
|
+
- `setupCommands(api)` — Register CLI commands with flags
|
|
66
|
+
- `setupSchema(api)` — Register validation schemas
|
|
67
|
+
- `setupHooks(api)` — Register lifecycle hooks
|
|
68
|
+
- `setupImporters(api)` — Register data importers
|
|
69
|
+
- `setupRenderers(api)` — Register output renderers
|
|
70
|
+
- `setupSearch(api)` — Register search providers
|
|
71
|
+
- `setupPreflight(api)` — Register pre-flight checks
|
|
72
|
+
- `setupServices(api)` — Register background services
|
|
73
|
+
|
|
74
|
+
Delete the capabilities you don't need and update `manifest.json` accordingly.
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
|
79
|
+
|
|
80
|
+
## Release Automation
|
|
81
|
+
|
|
82
|
+
This package is release-ready for GitHub, npm, and Bun-compatible installs. CI runs type checking, build, production dependency audit, package packing, Bun install verification, and pm-changelog validation. The daily release workflow publishes only when commits exist after the latest release tag and uses pm-changelog to generate CHANGELOG.md and GitHub release notes.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;kBAuRgB,GAAG;;AAJnB,wBAmBG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// pm-starter — Complete scaffold for pm-cli extensions
|
|
2
|
+
// Demonstrates all capability types. Copy this file to start a new extension.
|
|
3
|
+
//
|
|
4
|
+
// CAPABILITIES OVERVIEW:
|
|
5
|
+
// 1. commands — Add custom CLI commands
|
|
6
|
+
// 2. schema — Provide validation schemas
|
|
7
|
+
// 3. hooks — React to lifecycle events (before/after create, update, close)
|
|
8
|
+
// 4. importers — Programmatic data import
|
|
9
|
+
// 5. renderers — Custom output formatting
|
|
10
|
+
// 6. search — Custom search providers
|
|
11
|
+
// 7. preflight — Pre-flight checks before commands run
|
|
12
|
+
// 8. services — Background services and health checks
|
|
13
|
+
//
|
|
14
|
+
// To create a new extension from this scaffold:
|
|
15
|
+
// 1. Copy this directory
|
|
16
|
+
// 2. Update manifest.json name and capabilities
|
|
17
|
+
// 3. Delete capabilities you don't need
|
|
18
|
+
// 4. Implement your logic
|
|
19
|
+
// 5. npm install && npm run build
|
|
20
|
+
// 6. pm install ./your-extension
|
|
21
|
+
const defineExtension = ((extension) => extension);
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// CAPABILITY 1: COMMANDS
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function setupCommands(api) {
|
|
26
|
+
// Example: a simple greeting command with flags
|
|
27
|
+
api.registerCommand({
|
|
28
|
+
name: "starter greet",
|
|
29
|
+
description: "A demo greeting command from the starter extension.",
|
|
30
|
+
intent: "demonstrate command registration",
|
|
31
|
+
examples: [
|
|
32
|
+
"pm starter greet",
|
|
33
|
+
"pm starter greet --name Developer",
|
|
34
|
+
"pm starter greet --name Dev --emoji 🚀",
|
|
35
|
+
],
|
|
36
|
+
flags: [
|
|
37
|
+
{ long: "--name", value_name: "name", description: "Name to greet (default: World)" },
|
|
38
|
+
{ long: "--emoji", value_name: "emoji", description: "Emoji to include (default: 👋)" },
|
|
39
|
+
{ long: "--uppercase", description: "Uppercase the output" },
|
|
40
|
+
],
|
|
41
|
+
async run(ctx) {
|
|
42
|
+
const name = ctx.options["name"] || "World";
|
|
43
|
+
const emoji = ctx.options["emoji"] || "👋";
|
|
44
|
+
const upper = Boolean(ctx.options["uppercase"]);
|
|
45
|
+
let msg = `${emoji} Hello, ${name}!`;
|
|
46
|
+
if (upper)
|
|
47
|
+
msg = msg.toUpperCase();
|
|
48
|
+
console.error(msg);
|
|
49
|
+
return { message: msg };
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
// Example: a command that demonstrates pm interaction
|
|
53
|
+
api.registerCommand({
|
|
54
|
+
name: "starter summary",
|
|
55
|
+
description: "Show a quick workspace summary using pm stats.",
|
|
56
|
+
intent: "demonstrate calling pm from an extension",
|
|
57
|
+
examples: ["pm starter summary"],
|
|
58
|
+
flags: [
|
|
59
|
+
{ long: "--verbose", description: "Include detailed breakdown" },
|
|
60
|
+
],
|
|
61
|
+
async run(ctx) {
|
|
62
|
+
const { spawnSync } = await import("node:child_process");
|
|
63
|
+
const result = spawnSync("pm", ["--path", ctx.pm_root, "stats", "--json"], {
|
|
64
|
+
encoding: "utf-8",
|
|
65
|
+
});
|
|
66
|
+
if (result.status !== 0) {
|
|
67
|
+
console.error("Failed to get stats");
|
|
68
|
+
return { error: "pm stats failed" };
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const stats = JSON.parse(result.stdout);
|
|
72
|
+
const total = stats.totals?.items ?? 0;
|
|
73
|
+
const byStatus = stats.by_status ?? {};
|
|
74
|
+
console.error(`\n Workspace Summary`);
|
|
75
|
+
console.error(` ================`);
|
|
76
|
+
console.error(` Total items: ${total}`);
|
|
77
|
+
for (const [status, count] of Object.entries(byStatus)) {
|
|
78
|
+
if (count > 0) {
|
|
79
|
+
console.error(` ${status}: ${count}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (ctx.options["verbose"] && stats.by_type) {
|
|
83
|
+
console.error(`\n By type:`);
|
|
84
|
+
for (const [type, count] of Object.entries(stats.by_type)) {
|
|
85
|
+
if (count > 0) {
|
|
86
|
+
console.error(` ${type}: ${count}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return stats;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
console.error("Could not parse stats output");
|
|
94
|
+
return { error: "parse failed" };
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// CAPABILITY 2: SCHEMA
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
function setupSchema(api) {
|
|
103
|
+
if (typeof api.registerSchema !== "function")
|
|
104
|
+
return;
|
|
105
|
+
api.registerSchema({
|
|
106
|
+
name: "starter-title-required",
|
|
107
|
+
description: "Ensures items have a non-empty title",
|
|
108
|
+
validate(item) {
|
|
109
|
+
const errors = [];
|
|
110
|
+
if (!item.title || item.title.trim().length === 0) {
|
|
111
|
+
errors.push("Title is required");
|
|
112
|
+
}
|
|
113
|
+
if (item.title && item.title.length > 200) {
|
|
114
|
+
errors.push("Title must be ≤ 200 characters");
|
|
115
|
+
}
|
|
116
|
+
return { valid: errors.length === 0, errors };
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// CAPABILITY 3: HOOKS
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
function setupHooks(api) {
|
|
124
|
+
if (typeof api.registerHook !== "function")
|
|
125
|
+
return;
|
|
126
|
+
// Hook: runs after any item is created
|
|
127
|
+
api.registerHook("afterCreate", (ctx) => {
|
|
128
|
+
const item = ctx.item;
|
|
129
|
+
if (item) {
|
|
130
|
+
console.error(`[starter] ✨ Item created: #${item.id} "${item.title}" (${item.type}/${item.status})`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
// Hook: runs after any item is closed
|
|
134
|
+
api.registerHook("afterClose", (ctx) => {
|
|
135
|
+
const item = ctx.item;
|
|
136
|
+
if (item) {
|
|
137
|
+
console.error(`[starter] ✅ Item closed: #${item.id} "${item.title}"`);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// Hook: runs before an item is updated
|
|
141
|
+
api.registerHook("beforeUpdate", (ctx) => {
|
|
142
|
+
// Could validate changes, log, or modify the update
|
|
143
|
+
// Return false to prevent the update
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// CAPABILITY 4: IMPORTERS
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
function setupImporters(api) {
|
|
150
|
+
if (typeof api.registerImporter !== "function")
|
|
151
|
+
return;
|
|
152
|
+
api.registerImporter("starter-demo", async (ctx) => {
|
|
153
|
+
console.error("[starter] Demo importer running with config:", JSON.stringify(ctx.options));
|
|
154
|
+
// Replace with real import logic:
|
|
155
|
+
// 1. Read data from ctx.options.file or ctx.options.url
|
|
156
|
+
// 2. Parse/transform
|
|
157
|
+
// 3. Call pm create for each item
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// CAPABILITY 5: RENDERERS
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
function setupRenderers(api) {
|
|
164
|
+
if (typeof api.registerRenderer !== "function")
|
|
165
|
+
return;
|
|
166
|
+
// Override the "json" format to add a compact table view
|
|
167
|
+
api.registerRenderer("json", (items) => {
|
|
168
|
+
return items
|
|
169
|
+
.map((item) => `${item.id}\t${item.type?.padEnd(8)}\t${item.status?.padEnd(12)}\t${item.title}`)
|
|
170
|
+
.join("\n");
|
|
171
|
+
});
|
|
172
|
+
// Override the "toon" format with a markdown table
|
|
173
|
+
api.registerRenderer("toon", (items) => {
|
|
174
|
+
const header = "| ID | Type | Status | Title |";
|
|
175
|
+
const sep = "|---|---|---|---|";
|
|
176
|
+
const rows = items.map((item) => `| ${item.id} | ${item.type || ""} | ${item.status || ""} | ${item.title} |`);
|
|
177
|
+
return [header, sep, ...rows].join("\n");
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// CAPABILITY 6: SEARCH
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
function setupSearch(api) {
|
|
184
|
+
if (typeof api.registerSearchProvider !== "function")
|
|
185
|
+
return;
|
|
186
|
+
// Simple substring search provider
|
|
187
|
+
api.registerSearchProvider({
|
|
188
|
+
name: "starter-substring",
|
|
189
|
+
async query(ctx) {
|
|
190
|
+
const query = ctx.query ?? "";
|
|
191
|
+
const { spawnSync } = await import("node:child_process");
|
|
192
|
+
const result = spawnSync("pm", ["--path", ctx.pm_root ?? ".", "list-all", "--json"], {
|
|
193
|
+
encoding: "utf-8",
|
|
194
|
+
});
|
|
195
|
+
if (result.status !== 0)
|
|
196
|
+
return { results: [] };
|
|
197
|
+
const data = JSON.parse(result.stdout);
|
|
198
|
+
const q = query.toLowerCase();
|
|
199
|
+
const items = (data.items || []).filter((item) => {
|
|
200
|
+
const title = (item.title || "").toLowerCase();
|
|
201
|
+
const desc = (item.description || "").toLowerCase();
|
|
202
|
+
return title.includes(q) || desc.includes(q);
|
|
203
|
+
});
|
|
204
|
+
return { results: items, query };
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// CAPABILITY 7: PREFLIGHT
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
function setupPreflight(api) {
|
|
212
|
+
if (typeof api.registerPreflight !== "function")
|
|
213
|
+
return;
|
|
214
|
+
// Preflight override — can modify preflight decisions before a command runs
|
|
215
|
+
api.registerPreflight(async (ctx) => {
|
|
216
|
+
console.error(`[starter] Preflight check for workspace: ${ctx.pm_root ?? "unknown"}`);
|
|
217
|
+
// Return the current decision unchanged (pass-through)
|
|
218
|
+
return {
|
|
219
|
+
enforce_item_format_gate: ctx.decision?.enforce_item_format_gate ?? true,
|
|
220
|
+
run_preflight_item_format_sync: ctx.decision?.run_preflight_item_format_sync ?? false,
|
|
221
|
+
run_extension_migrations: ctx.decision?.run_extension_migrations ?? true,
|
|
222
|
+
enforce_mandatory_migration_gate: ctx.decision?.enforce_mandatory_migration_gate ?? false,
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// CAPABILITY 8: SERVICES
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
function setupServices(api) {
|
|
230
|
+
if (typeof api.registerService !== "function")
|
|
231
|
+
return;
|
|
232
|
+
// Override the output_format service to add custom formatting
|
|
233
|
+
api.registerService("output_format", async (ctx) => {
|
|
234
|
+
console.error("[starter] output_format service override active");
|
|
235
|
+
return { format: "toon" };
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// EXTENSION ENTRY POINT
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
export default defineExtension({
|
|
242
|
+
name: "pm-starter",
|
|
243
|
+
version: "0.1.0",
|
|
244
|
+
activate(api) {
|
|
245
|
+
console.error("[pm-starter] Activating...");
|
|
246
|
+
setupCommands(api);
|
|
247
|
+
setupSchema(api);
|
|
248
|
+
setupHooks(api);
|
|
249
|
+
setupImporters(api);
|
|
250
|
+
setupRenderers(api);
|
|
251
|
+
setupSearch(api);
|
|
252
|
+
setupPreflight(api);
|
|
253
|
+
setupServices(api);
|
|
254
|
+
console.error("[pm-starter] All 8 capabilities registered.");
|
|
255
|
+
console.error("[pm-starter] Commands: pm starter greet, pm starter summary");
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pm-starter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Complete scaffold showing all 8 capability types: commands, schema, hooks, importers, renderers, preflight, search, services. Use as a starting template for new extensions.",
|
|
5
|
+
"author": "@unbraind",
|
|
6
|
+
"entry": "./dist/index.js",
|
|
7
|
+
"priority": 99,
|
|
8
|
+
"capabilities": [
|
|
9
|
+
"commands",
|
|
10
|
+
"schema",
|
|
11
|
+
"hooks",
|
|
12
|
+
"importers",
|
|
13
|
+
"renderers",
|
|
14
|
+
"preflight",
|
|
15
|
+
"search",
|
|
16
|
+
"services"
|
|
17
|
+
],
|
|
18
|
+
"pm": {
|
|
19
|
+
"compatibility": "v2"
|
|
20
|
+
}
|
|
21
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pm-starter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Complete starter/scaffold extension for pm-cli showing all capability types",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/unbraind/pm-starter.git"
|
|
8
|
+
},
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/unbraind/pm-starter/issues"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/unbraind/pm-starter#readme",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"types": "dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/",
|
|
18
|
+
"manifest.json",
|
|
19
|
+
"README.md",
|
|
20
|
+
"CHANGELOG.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"prepack": "npm run build",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"check": "npm run typecheck",
|
|
27
|
+
"audit:prod": "npm audit --omit=dev",
|
|
28
|
+
"pack:dry-run": "npm pack --dry-run",
|
|
29
|
+
"changelog": "pm-changelog --pm-root .agents/pm --mode prepend --output CHANGELOG.md --release-version-from-package --since-previous-tag --until-release-tag --item-url-base https://github.com/unbraind/pm-starter/blob/main/.agents/pm",
|
|
30
|
+
"changelog:full": "pm-changelog --pm-root .agents/pm --mode replace --output CHANGELOG.md --all-release-tags --release-version-from-package --item-url-base https://github.com/unbraind/pm-starter/blob/main/.agents/pm",
|
|
31
|
+
"changelog:check": "pm-changelog --pm-root .agents/pm --mode replace --output CHANGELOG.md --all-release-tags --release-version-from-package --item-url-base https://github.com/unbraind/pm-starter/blob/main/.agents/pm --check",
|
|
32
|
+
"release:check": "npm run typecheck && npm run build && npm run audit:prod && npm run pack:dry-run && npm run changelog:check"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@unbrained/pm-cli": ">=2026.5.24"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@unbrained/pm-cli": "^2026.5.24",
|
|
39
|
+
"typescript": "^6.0.3",
|
|
40
|
+
"pm-changelog": "^2026.5.25",
|
|
41
|
+
"@types/node": "^25.9.1"
|
|
42
|
+
},
|
|
43
|
+
"keywords": [
|
|
44
|
+
"extension",
|
|
45
|
+
"pm-cli",
|
|
46
|
+
"pm-extension",
|
|
47
|
+
"pm-package",
|
|
48
|
+
"scaffold",
|
|
49
|
+
"starter",
|
|
50
|
+
"template"
|
|
51
|
+
],
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=20.0.0"
|
|
55
|
+
},
|
|
56
|
+
"author": "@unbraind",
|
|
57
|
+
"pm": {
|
|
58
|
+
"aliases": [
|
|
59
|
+
"starter"
|
|
60
|
+
],
|
|
61
|
+
"extensions": [
|
|
62
|
+
"."
|
|
63
|
+
],
|
|
64
|
+
"catalog": {
|
|
65
|
+
"display_name": "Starter Extension",
|
|
66
|
+
"category": "starter",
|
|
67
|
+
"summary": "Complete starter/scaffold extension for pm-cli showing all capability types",
|
|
68
|
+
"tags": [
|
|
69
|
+
"starter",
|
|
70
|
+
"sdk",
|
|
71
|
+
"example"
|
|
72
|
+
],
|
|
73
|
+
"links": {
|
|
74
|
+
"docs": "https://github.com/unbraind/pm-starter#readme",
|
|
75
|
+
"npm": "https://www.npmjs.com/package/pm-starter",
|
|
76
|
+
"repository": "https://github.com/unbraind/pm-starter",
|
|
77
|
+
"report": "https://github.com/unbraind/pm-starter/issues"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"docs": [
|
|
81
|
+
"README.md",
|
|
82
|
+
"CHANGELOG.md"
|
|
83
|
+
],
|
|
84
|
+
"examples": [
|
|
85
|
+
"README.md"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
}
|