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 ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 - 2026-05-26
4
+
5
+ ### Other
6
+
7
+ - Release readiness hardening for pm-starter ([pm-starter-d7yd](https://github.com/unbraind/pm-starter/blob/main/.agents/pm/tasks/pm-starter-d7yd.toon))
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.
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ name: string;
3
+ version: string;
4
+ activate(api: any): void;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }