pm-brief 2026.6.7

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,15 @@
1
+ # Changelog
2
+
3
+ ## 2026.6.7 - 2026-06-06
4
+
5
+ ### Added
6
+
7
+ - Build pm-brief MVP ([pm-brief-ogmd](https://github.com/unbraind/pm-brief/blob/main/.agents/pm/features/pm-brief-ogmd.toon))
8
+
9
+ ### Fixed
10
+
11
+ - Fix release workflow staging when dist is gitignored ([pm-brief-bald](https://github.com/unbraind/pm-brief/blob/main/.agents/pm/tasks/pm-brief-bald.toon))
12
+
13
+ ### Other
14
+
15
+ - Verify pm-brief release readiness ([pm-brief-sub4](https://github.com/unbraind/pm-brief/blob/main/.agents/pm/tasks/pm-brief-sub4.toon))
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 unbraind
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # pm-brief
2
+
3
+ `pm-brief` generates compact, deterministic project briefs for coding agents.
4
+ It turns pm items into an execution-oriented summary: what to work on next,
5
+ what is blocked, what context is stale, and which pm updates should be made.
6
+
7
+ Project management is context management. `pm-brief` makes that practical when
8
+ an agent needs a low-token handoff instead of a full project dump.
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ pm install github.com/unbraind/pm-brief --project
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```bash
19
+ pm brief
20
+ pm brief --token-budget 4000 --format markdown
21
+ pm brief --focus pm-1234 --include-closed --format json
22
+ pm brief next --count 5 --format json
23
+ pm brief stale --days 7
24
+ ```
25
+
26
+ ## Commands
27
+
28
+ - `pm brief` renders a markdown or JSON project brief.
29
+ - `pm brief next` returns the ranked next items only.
30
+ - `pm brief stale` returns stale open or in-progress items.
31
+
32
+ ## Agent Brief Contents
33
+
34
+ - workspace and item counts
35
+ - top next items with `whyNow` reasons
36
+ - blocker relationships and dependency context
37
+ - stale context findings
38
+ - decision items that need human or agent follow-up
39
+ - safe suggested pm commands, never auto-applied
40
+ - deterministic token-budget trimming
41
+
42
+ ## TypeScript API
43
+
44
+ ```ts
45
+ import { buildBrief, renderMarkdownBrief } from "pm-brief";
46
+
47
+ const brief = buildBrief(items, {
48
+ tokenBudget: 4000,
49
+ focusIds: ["pm-1234"],
50
+ generatedAt: "2026-06-06T00:00:00Z",
51
+ });
52
+
53
+ console.log(renderMarkdownBrief(brief));
54
+ ```
55
+
56
+ ## Release Readiness
57
+
58
+ This package uses TypeScript, `pm-changelog`, and the same daily release shape
59
+ as the other public pm packages. `npm run release:check` runs typecheck, build,
60
+ tests, production audit, dry-run packing, and changelog validation.
@@ -0,0 +1,122 @@
1
+ export declare const EXIT_CODE: {
2
+ readonly GENERIC_FAILURE: 1;
3
+ readonly USAGE: 2;
4
+ };
5
+ export declare class CommandError extends Error {
6
+ exitCode: number;
7
+ constructor(message: string, exitCode?: number);
8
+ }
9
+ export interface PmItem {
10
+ id: string;
11
+ title?: string;
12
+ type?: string;
13
+ status?: string;
14
+ priority?: number;
15
+ assignee?: string;
16
+ tags?: string[];
17
+ body?: string;
18
+ description?: string;
19
+ parent?: string;
20
+ sprint?: string;
21
+ release?: string;
22
+ deadline?: string;
23
+ created_at?: string;
24
+ updated_at?: string;
25
+ deps?: unknown;
26
+ dependencies?: unknown;
27
+ blocked_by?: unknown;
28
+ blockedBy?: unknown;
29
+ docs?: unknown;
30
+ files?: unknown;
31
+ [key: string]: unknown;
32
+ }
33
+ export interface BriefOptions {
34
+ tokenBudget?: number;
35
+ focusIds?: string[];
36
+ statuses?: string[];
37
+ assignee?: string;
38
+ includeClosed?: boolean;
39
+ staleDays?: number;
40
+ nextCount?: number;
41
+ generatedAt?: string;
42
+ pmRoot?: string;
43
+ pmVersion?: string;
44
+ }
45
+ export interface BriefItem {
46
+ id: string;
47
+ title: string;
48
+ type: string;
49
+ status: string;
50
+ priority?: number;
51
+ assignee?: string;
52
+ tags: string[];
53
+ whyNow: string;
54
+ requiredContext: string[];
55
+ dependencyIds: string[];
56
+ dependentIds: string[];
57
+ tokenCostEstimate: number;
58
+ }
59
+ export interface BriefBlocker {
60
+ itemId: string;
61
+ blockedBy: string;
62
+ kind: string;
63
+ title?: string;
64
+ status?: string;
65
+ }
66
+ export interface BriefRisk {
67
+ itemId: string;
68
+ severity: "low" | "medium" | "high";
69
+ reason: string;
70
+ }
71
+ export interface StaleContextFinding {
72
+ itemId: string;
73
+ title: string;
74
+ updatedAt?: string;
75
+ daysStale: number;
76
+ }
77
+ export interface RecommendedPmUpdate {
78
+ itemId: string;
79
+ command: string;
80
+ reason: string;
81
+ safeToAutoApply: boolean;
82
+ }
83
+ export interface AgentBrief {
84
+ generatedAt: string;
85
+ workspace: {
86
+ root: string;
87
+ pmVersion: string;
88
+ itemCount: number;
89
+ };
90
+ budget: {
91
+ requestedTokens: number;
92
+ estimatedTokens: number;
93
+ truncated: boolean;
94
+ };
95
+ focus: BriefItem[];
96
+ next: BriefItem[];
97
+ blockers: BriefBlocker[];
98
+ risks: BriefRisk[];
99
+ staleContext: StaleContextFinding[];
100
+ decisionsNeeded: BriefItem[];
101
+ recommendedPmUpdates: RecommendedPmUpdate[];
102
+ }
103
+ interface Relationship {
104
+ from: string;
105
+ to: string;
106
+ kind: string;
107
+ }
108
+ export declare function extractRelationships(item: PmItem): Relationship[];
109
+ export declare function selectNextItems(items: PmItem[], options?: BriefOptions): BriefItem[];
110
+ export declare function detectStaleContext(items: PmItem[], options?: BriefOptions): StaleContextFinding[];
111
+ export declare function summarizeRisks(items: PmItem[], options?: BriefOptions): BriefRisk[];
112
+ export declare function buildBrief(items: PmItem[], options?: BriefOptions): AgentBrief;
113
+ export declare function renderMarkdownBrief(brief: AgentBrief): string;
114
+ export declare function readPmItems(pmRoot: string): PmItem[];
115
+ declare const _default: {
116
+ name: string;
117
+ version: string;
118
+ description: string;
119
+ activate(api: any): void;
120
+ };
121
+ export default _default;
122
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,447 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { writeFileSync } from "node:fs";
3
+ const defineExtension = ((extension) => extension);
4
+ export const EXIT_CODE = {
5
+ GENERIC_FAILURE: 1,
6
+ USAGE: 2,
7
+ };
8
+ export class CommandError extends Error {
9
+ exitCode;
10
+ constructor(message, exitCode = EXIT_CODE.GENERIC_FAILURE) {
11
+ super(message);
12
+ this.name = "CommandError";
13
+ this.exitCode = exitCode;
14
+ }
15
+ }
16
+ function text(value) {
17
+ return typeof value === "string" ? value.trim() : "";
18
+ }
19
+ function asArray(value) {
20
+ if (Array.isArray(value))
21
+ return value.flatMap(asArray);
22
+ if (typeof value !== "string")
23
+ return [];
24
+ return value.split(",").map((entry) => entry.trim()).filter(Boolean);
25
+ }
26
+ function readBool(options, ...keys) {
27
+ return keys.some((key) => options[key] === true || options[key] === "true" || options[key] === "1");
28
+ }
29
+ function readString(options, ...keys) {
30
+ for (const key of keys) {
31
+ const value = options[key];
32
+ if (typeof value === "string" && value.trim())
33
+ return value.trim();
34
+ }
35
+ return undefined;
36
+ }
37
+ function readInt(options, keys, fallback) {
38
+ for (const key of keys) {
39
+ const value = options[key];
40
+ if (value === undefined || value === null || value === "")
41
+ continue;
42
+ const parsed = Number.parseInt(String(value), 10);
43
+ if (!Number.isFinite(parsed) || parsed < 1) {
44
+ throw new CommandError(`--${key} must be a positive integer`, EXIT_CODE.USAGE);
45
+ }
46
+ return parsed;
47
+ }
48
+ return fallback;
49
+ }
50
+ function readNonNegativeInt(options, keys, fallback) {
51
+ for (const key of keys) {
52
+ const value = options[key];
53
+ if (value === undefined || value === null || value === "")
54
+ continue;
55
+ const parsed = Number.parseInt(String(value), 10);
56
+ if (!Number.isFinite(parsed) || parsed < 0) {
57
+ throw new CommandError(`--${key} must be zero or a positive integer`, EXIT_CODE.USAGE);
58
+ }
59
+ return parsed;
60
+ }
61
+ return fallback;
62
+ }
63
+ function statusOf(item) {
64
+ return text(item.status) || "unknown";
65
+ }
66
+ function typeOf(item) {
67
+ return text(item.type) || "Item";
68
+ }
69
+ function titleOf(item) {
70
+ return text(item.title) || "(untitled)";
71
+ }
72
+ function isClosed(item) {
73
+ const status = statusOf(item).toLowerCase();
74
+ return status === "closed" || status === "done" || status === "canceled" || status === "cancelled";
75
+ }
76
+ function parseRelationshipValue(value, fallbackKind) {
77
+ if (!value)
78
+ return [];
79
+ if (typeof value === "string")
80
+ return asArray(value).map((to) => ({ to, kind: fallbackKind }));
81
+ if (Array.isArray(value))
82
+ return value.flatMap((entry) => parseRelationshipValue(entry, fallbackKind));
83
+ if (typeof value === "object") {
84
+ const record = value;
85
+ const to = text(record.id) || text(record.to) || text(record.target) || text(record.target_id) || text(record.item_id);
86
+ if (!to)
87
+ return [];
88
+ return [{ to, kind: text(record.kind) || text(record.type) || fallbackKind }];
89
+ }
90
+ return [];
91
+ }
92
+ export function extractRelationships(item) {
93
+ return [
94
+ ...parseRelationshipValue(item.deps, "depends_on"),
95
+ ...parseRelationshipValue(item.dependencies, "depends_on"),
96
+ ...parseRelationshipValue(item.blocked_by, "blocked_by"),
97
+ ...parseRelationshipValue(item.blockedBy, "blocked_by"),
98
+ ].filter((rel) => rel.to && rel.to !== item.id).map((rel) => ({ from: item.id, to: rel.to, kind: rel.kind }));
99
+ }
100
+ function estimateTokens(value) {
101
+ return Math.max(1, Math.ceil(JSON.stringify(value).length / 4));
102
+ }
103
+ function itemUpdatedAt(item) {
104
+ return text(item.updated_at) || text(item.created_at);
105
+ }
106
+ function ageDays(item, now) {
107
+ const raw = itemUpdatedAt(item);
108
+ if (!raw)
109
+ return 0;
110
+ const time = Date.parse(raw);
111
+ if (!Number.isFinite(time))
112
+ return 0;
113
+ return Math.max(0, Math.floor((now.getTime() - time) / 86_400_000));
114
+ }
115
+ function linksFor(item) {
116
+ return [...asArray(item.docs), ...asArray(item.files)].slice(0, 6);
117
+ }
118
+ function toBriefItem(item, rels, allItems, now) {
119
+ const dependencyIds = rels.filter((rel) => rel.from === item.id).map((rel) => rel.to);
120
+ const dependentIds = rels.filter((rel) => rel.to === item.id).map((rel) => rel.from);
121
+ const stale = ageDays(item, now);
122
+ const requiredContext = [
123
+ ...dependencyIds.map((id) => `dependency:${id}`),
124
+ ...dependentIds.map((id) => `dependent:${id}`),
125
+ ...linksFor(item),
126
+ ].slice(0, 8);
127
+ const priority = typeof item.priority === "number" ? item.priority : undefined;
128
+ const blocked = rels.some((rel) => rel.from === item.id && (rel.kind === "blocked_by" || rel.kind === "depends_on"));
129
+ const whyNow = blocked
130
+ ? "blocked: resolve prerequisite before implementation"
131
+ : priority !== undefined
132
+ ? `priority ${priority}`
133
+ : stale > 0
134
+ ? `updated ${stale} day(s) ago`
135
+ : "active open work";
136
+ const compact = {
137
+ id: item.id,
138
+ title: titleOf(item),
139
+ body: text(item.body) || text(item.description),
140
+ deps: dependencyIds,
141
+ dependents: dependentIds,
142
+ context: requiredContext,
143
+ visible: allItems.length,
144
+ };
145
+ return {
146
+ id: item.id,
147
+ title: titleOf(item),
148
+ type: typeOf(item),
149
+ status: statusOf(item),
150
+ priority,
151
+ assignee: text(item.assignee) || undefined,
152
+ tags: Array.isArray(item.tags) ? item.tags.map(String) : [],
153
+ whyNow,
154
+ requiredContext,
155
+ dependencyIds,
156
+ dependentIds,
157
+ tokenCostEstimate: estimateTokens(compact),
158
+ };
159
+ }
160
+ function scoreItem(item, rels, now) {
161
+ const priority = typeof item.priority === "number" ? item.priority : 5;
162
+ const blockedPenalty = rels.some((rel) => rel.from === item.id && (rel.kind === "blocked_by" || rel.kind === "depends_on")) ? 100 : 0;
163
+ const activeBoost = statusOf(item).toLowerCase() === "in_progress" ? -10 : 0;
164
+ const stalePenalty = Math.min(ageDays(item, now), 30) / 10;
165
+ return priority * 10 + blockedPenalty + activeBoost + stalePenalty;
166
+ }
167
+ export function selectNextItems(items, options = {}) {
168
+ const now = new Date(options.generatedAt ?? Date.now());
169
+ const rels = items.flatMap(extractRelationships);
170
+ return items
171
+ .filter((item) => !isClosed(item))
172
+ .filter((item) => !options.assignee || text(item.assignee) === options.assignee)
173
+ .filter((item) => !options.statuses?.length || options.statuses.includes(statusOf(item)))
174
+ .sort((a, b) => scoreItem(a, rels, now) - scoreItem(b, rels, now) || itemUpdatedAt(b).localeCompare(itemUpdatedAt(a)) || a.id.localeCompare(b.id))
175
+ .slice(0, options.nextCount ?? 5)
176
+ .map((item) => toBriefItem(item, rels, items, now));
177
+ }
178
+ export function detectStaleContext(items, options = {}) {
179
+ const now = new Date(options.generatedAt ?? Date.now());
180
+ const staleDays = options.staleDays ?? 7;
181
+ return items
182
+ .filter((item) => !isClosed(item))
183
+ .map((item) => ({ item, days: ageDays(item, now) }))
184
+ .filter(({ days }) => days >= staleDays)
185
+ .sort((a, b) => b.days - a.days || a.item.id.localeCompare(b.item.id))
186
+ .map(({ item, days }) => ({ itemId: item.id, title: titleOf(item), updatedAt: itemUpdatedAt(item) || undefined, daysStale: days }));
187
+ }
188
+ export function summarizeRisks(items, options = {}) {
189
+ const now = new Date(options.generatedAt ?? Date.now());
190
+ const risks = [];
191
+ const rels = items.flatMap(extractRelationships);
192
+ for (const item of items.filter((candidate) => !isClosed(candidate))) {
193
+ if (rels.some((rel) => rel.from === item.id && (rel.kind === "blocked_by" || rel.kind === "depends_on"))) {
194
+ risks.push({ itemId: item.id, severity: "high", reason: "blocked by visible dependency" });
195
+ }
196
+ if (item.deadline && Date.parse(item.deadline) < now.getTime()) {
197
+ risks.push({ itemId: item.id, severity: "high", reason: `deadline passed: ${item.deadline}` });
198
+ }
199
+ const days = ageDays(item, now);
200
+ if (days >= (options.staleDays ?? 7)) {
201
+ risks.push({ itemId: item.id, severity: "medium", reason: `stale context: ${days} day(s) since update` });
202
+ }
203
+ }
204
+ return risks;
205
+ }
206
+ function selectedFocus(items, options) {
207
+ const ids = new Set(options.focusIds ?? []);
208
+ const candidates = ids.size > 0 ? items.filter((item) => ids.has(item.id)) : selectNextItems(items, { ...options, nextCount: 3 }).map((next) => items.find((item) => item.id === next.id)).filter((item) => Boolean(item));
209
+ return candidates.filter((item) => options.includeClosed || !isClosed(item));
210
+ }
211
+ function compactToBudget(brief) {
212
+ const budget = brief.budget.requestedTokens;
213
+ let estimated = estimateTokens(brief);
214
+ if (estimated <= budget)
215
+ return { ...brief, budget: { ...brief.budget, estimatedTokens: estimated, truncated: false } };
216
+ const next = { ...brief, recommendedPmUpdates: brief.recommendedPmUpdates.slice(0, 5), staleContext: brief.staleContext.slice(0, 5), risks: brief.risks.slice(0, 8) };
217
+ estimated = estimateTokens(next);
218
+ if (estimated <= budget)
219
+ return { ...next, budget: { ...next.budget, estimatedTokens: estimated, truncated: true } };
220
+ const tighter = { ...next, next: next.next.slice(0, 3), blockers: next.blockers.slice(0, 6), focus: next.focus.slice(0, 3), decisionsNeeded: next.decisionsNeeded.slice(0, 3) };
221
+ estimated = estimateTokens(tighter);
222
+ return { ...tighter, budget: { ...tighter.budget, estimatedTokens: estimated, truncated: true } };
223
+ }
224
+ export function buildBrief(items, options = {}) {
225
+ const generatedAt = options.generatedAt ?? new Date().toISOString();
226
+ const now = new Date(generatedAt);
227
+ const rels = items.flatMap(extractRelationships);
228
+ const focus = selectedFocus(items, options).map((item) => toBriefItem(item, rels, items, now));
229
+ const next = selectNextItems(items, options);
230
+ const blockers = rels
231
+ .filter((rel) => rel.kind === "blocked_by" || rel.kind === "depends_on")
232
+ .map((rel) => {
233
+ const blocker = items.find((item) => item.id === rel.to);
234
+ return { itemId: rel.from, blockedBy: rel.to, kind: rel.kind, title: blocker ? titleOf(blocker) : undefined, status: blocker ? statusOf(blocker) : undefined };
235
+ });
236
+ const decisionsNeeded = items
237
+ .filter((item) => !isClosed(item) && typeOf(item).toLowerCase() === "decision")
238
+ .slice(0, 5)
239
+ .map((item) => toBriefItem(item, rels, items, now));
240
+ const staleContext = detectStaleContext(items, options).slice(0, 10);
241
+ const risks = summarizeRisks(items, options).slice(0, 12);
242
+ const recommendedPmUpdates = [
243
+ ...staleContext.slice(0, 5).map((finding) => ({
244
+ itemId: finding.itemId,
245
+ command: `pm append ${finding.itemId} "Context refreshed: <summary>"`,
246
+ reason: `${finding.daysStale} day(s) since last update`,
247
+ safeToAutoApply: false,
248
+ })),
249
+ ...blockers.slice(0, 5).map((blocker) => ({
250
+ itemId: blocker.itemId,
251
+ command: `pm deps ${blocker.itemId}`,
252
+ reason: `inspect ${blocker.kind} relationship before changing code`,
253
+ safeToAutoApply: false,
254
+ })),
255
+ ];
256
+ return compactToBudget({
257
+ generatedAt,
258
+ workspace: {
259
+ root: options.pmRoot ?? ".agents/pm",
260
+ pmVersion: options.pmVersion ?? "unknown",
261
+ itemCount: items.length,
262
+ },
263
+ budget: {
264
+ requestedTokens: options.tokenBudget ?? 4000,
265
+ estimatedTokens: 0,
266
+ truncated: false,
267
+ },
268
+ focus,
269
+ next,
270
+ blockers,
271
+ risks,
272
+ staleContext,
273
+ decisionsNeeded,
274
+ recommendedPmUpdates,
275
+ });
276
+ }
277
+ function escapeLine(value) {
278
+ return String(value ?? "").replace(/\r?\n/g, " ").trim();
279
+ }
280
+ export function renderMarkdownBrief(brief) {
281
+ const lines = [
282
+ "# pm brief",
283
+ "",
284
+ `Generated: ${brief.generatedAt}`,
285
+ `Workspace: ${brief.workspace.root} | pm ${brief.workspace.pmVersion} | items ${brief.workspace.itemCount}`,
286
+ `Budget: requested ${brief.budget.requestedTokens}, estimated ${brief.budget.estimatedTokens}, truncated ${brief.budget.truncated}`,
287
+ "",
288
+ "## Next Work",
289
+ "",
290
+ ];
291
+ if (brief.next.length === 0)
292
+ lines.push("_No open work matched the filters._");
293
+ for (const item of brief.next)
294
+ lines.push(`- ${item.id}: ${escapeLine(item.title)} (${item.type}, ${item.status}) - ${item.whyNow}`);
295
+ lines.push("", "## Focus", "");
296
+ if (brief.focus.length === 0)
297
+ lines.push("_No focus items._");
298
+ for (const item of brief.focus) {
299
+ lines.push(`- ${item.id}: ${escapeLine(item.title)} (${item.type}, ${item.status})`);
300
+ if (item.requiredContext.length > 0)
301
+ lines.push(` - context: ${item.requiredContext.join(", ")}`);
302
+ }
303
+ lines.push("", "## Blockers", "");
304
+ if (brief.blockers.length === 0)
305
+ lines.push("_No visible blockers._");
306
+ for (const blocker of brief.blockers) {
307
+ const label = blocker.title ? `${blocker.blockedBy} ${escapeLine(blocker.title)}` : blocker.blockedBy;
308
+ const status = blocker.status ? ` (${blocker.status})` : "";
309
+ lines.push(`- ${blocker.itemId} ${blocker.kind} ${label}${status}`);
310
+ }
311
+ lines.push("", "## Risks", "");
312
+ if (brief.risks.length === 0)
313
+ lines.push("_No risks detected from visible pm metadata._");
314
+ for (const risk of brief.risks)
315
+ lines.push(`- ${risk.severity}: ${risk.itemId} - ${risk.reason}`);
316
+ lines.push("", "## Stale Context", "");
317
+ if (brief.staleContext.length === 0)
318
+ lines.push("_No stale open items detected._");
319
+ for (const stale of brief.staleContext)
320
+ lines.push(`- ${stale.itemId}: ${escapeLine(stale.title)} - ${stale.daysStale} day(s) stale`);
321
+ lines.push("", "## Recommended PM Updates", "");
322
+ if (brief.recommendedPmUpdates.length === 0)
323
+ lines.push("_No update suggestions._");
324
+ for (const update of brief.recommendedPmUpdates)
325
+ lines.push(`- ${update.itemId}: \`${update.command}\` - ${update.reason}`);
326
+ lines.push("");
327
+ return `${lines.join("\n")}\n`;
328
+ }
329
+ export function readPmItems(pmRoot) {
330
+ const result = spawnSync("pm", ["--path", pmRoot, "list-all", "--json", "--include-body"], {
331
+ encoding: "utf-8",
332
+ maxBuffer: 64 * 1024 * 1024,
333
+ });
334
+ if (result.status !== 0)
335
+ throw new CommandError(result.stderr.trim() || "`pm list-all --json --include-body` failed");
336
+ const parsed = JSON.parse(result.stdout);
337
+ const items = Array.isArray(parsed) ? parsed : parsed.items ?? parsed.results ?? [];
338
+ return items.filter((item) => Boolean(item) && typeof item === "object" && typeof item.id === "string");
339
+ }
340
+ function pmVersion() {
341
+ const result = spawnSync("pm", ["--version"], { encoding: "utf-8" });
342
+ return result.status === 0 ? result.stdout.trim() : "unknown";
343
+ }
344
+ function registerCommands(api) {
345
+ const commonFlags = [
346
+ { long: "--token-budget", value_name: "n", description: "Approximate maximum output token budget (default: 4000)", type: "string" },
347
+ { long: "--focus", value_name: "id", description: "Focus item id (repeatable or comma-separated)", type: "string" },
348
+ { long: "--status", value_name: "status", description: "Statuses to include (comma-separated)", type: "string" },
349
+ { long: "--assignee", value_name: "name", description: "Only include items assigned to this actor", type: "string" },
350
+ { long: "--stale-days", value_name: "n", description: "Days before an open item is stale (default: 7)", type: "string" },
351
+ { long: "--format", value_name: "format", description: "Output format: markdown or json", type: "string" },
352
+ { long: "--output", value_name: "file", description: "Write output to a file", type: "string" },
353
+ { long: "--include-closed", description: "Allow closed focus items in the brief", type: "boolean" },
354
+ ];
355
+ api.registerCommand({
356
+ name: "brief",
357
+ description: "Generate a token-budgeted agent brief from pm items.",
358
+ intent: "turn pm state into compact next-work context for agents",
359
+ examples: ["pm brief", "pm brief --focus pm-1234 --token-budget 3000", "pm brief --format json"],
360
+ flags: commonFlags,
361
+ async run(ctx) {
362
+ const options = ctx.options;
363
+ const format = (readString(options, "format") ?? (readBool(options, "json") ? "json" : "markdown")).toLowerCase();
364
+ if (format !== "markdown" && format !== "json")
365
+ throw new CommandError("--format must be markdown or json", EXIT_CODE.USAGE);
366
+ const brief = buildBrief(readPmItems(ctx.pm_root), {
367
+ tokenBudget: readInt(options, ["token-budget", "tokenBudget"], 4000),
368
+ focusIds: asArray(options.focus),
369
+ statuses: asArray(options.status),
370
+ assignee: readString(options, "assignee"),
371
+ includeClosed: readBool(options, "include-closed", "includeClosed"),
372
+ staleDays: readNonNegativeInt(options, ["stale-days", "staleDays"], 7),
373
+ generatedAt: new Date().toISOString(),
374
+ pmRoot: ctx.pm_root,
375
+ pmVersion: pmVersion(),
376
+ });
377
+ const output = format === "json" ? `${JSON.stringify(brief, null, 2)}\n` : renderMarkdownBrief(brief);
378
+ const outputPath = readString(options, "output");
379
+ if (outputPath)
380
+ writeFileSync(outputPath, output, "utf-8");
381
+ else
382
+ console.error(output.trimEnd());
383
+ return format === "json" ? brief : { ok: true, format, next: brief.next.length, risks: brief.risks.length, truncated: brief.budget.truncated };
384
+ },
385
+ });
386
+ api.registerCommand({
387
+ name: "brief next",
388
+ description: "Return ranked next work items from pm state.",
389
+ examples: ["pm brief next --count 5", "pm brief next --format json"],
390
+ flags: [
391
+ { long: "--count", short: "-n", value_name: "n", description: "Number of next items (default: 5)", type: "string" },
392
+ { long: "--assignee", value_name: "name", description: "Only include items assigned to this actor", type: "string" },
393
+ { long: "--format", value_name: "format", description: "Output format: text or json", type: "string" },
394
+ ],
395
+ async run(ctx) {
396
+ const options = ctx.options;
397
+ const format = (readString(options, "format") ?? "text").toLowerCase();
398
+ if (format !== "text" && format !== "json")
399
+ throw new CommandError("--format must be text or json", EXIT_CODE.USAGE);
400
+ const next = selectNextItems(readPmItems(ctx.pm_root), {
401
+ nextCount: readInt(options, ["count"], 5),
402
+ assignee: readString(options, "assignee"),
403
+ generatedAt: new Date().toISOString(),
404
+ });
405
+ if (format === "json") {
406
+ console.error(JSON.stringify({ next }, null, 2));
407
+ return { next: next.length, format };
408
+ }
409
+ console.error(next.map((item) => `${item.id}: ${item.title} - ${item.whyNow}`).join("\n"));
410
+ return { next: next.length, format };
411
+ },
412
+ });
413
+ api.registerCommand({
414
+ name: "brief stale",
415
+ description: "List stale open or in-progress pm items.",
416
+ examples: ["pm brief stale --days 14", "pm brief stale --format json"],
417
+ flags: [
418
+ { long: "--days", value_name: "n", description: "Days before an item is stale (default: 7)", type: "string" },
419
+ { long: "--format", value_name: "format", description: "Output format: text or json", type: "string" },
420
+ ],
421
+ async run(ctx) {
422
+ const options = ctx.options;
423
+ const format = (readString(options, "format") ?? "text").toLowerCase();
424
+ if (format !== "text" && format !== "json")
425
+ throw new CommandError("--format must be text or json", EXIT_CODE.USAGE);
426
+ const stale = detectStaleContext(readPmItems(ctx.pm_root), {
427
+ staleDays: readNonNegativeInt(options, ["days"], 7),
428
+ generatedAt: new Date().toISOString(),
429
+ });
430
+ if (format === "json") {
431
+ console.error(JSON.stringify({ stale }, null, 2));
432
+ return { stale: stale.length, format };
433
+ }
434
+ console.error(stale.map((item) => `${item.itemId}: ${item.title} - ${item.daysStale} day(s) stale`).join("\n"));
435
+ return { stale: stale.length, format };
436
+ },
437
+ });
438
+ }
439
+ export default defineExtension({
440
+ name: "pm-brief",
441
+ version: "2026.6.7",
442
+ description: "Token-budgeted agent briefs and next-work plans for pm workspaces",
443
+ activate(api) {
444
+ registerCommands(api);
445
+ },
446
+ });
447
+ //# 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,14 @@
1
+ {
2
+ "name": "pm-brief",
3
+ "version": "2026.6.7",
4
+ "description": "Token-budgeted agent briefs and next-work plans for pm workspaces",
5
+ "author": "@unbraind",
6
+ "entry": "dist/index.js",
7
+ "capabilities": [
8
+ "commands",
9
+ "schema"
10
+ ],
11
+ "compatibility": {
12
+ "pm": ">=2026.6.6"
13
+ }
14
+ }
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "pm-brief",
3
+ "version": "2026.6.7",
4
+ "description": "Token-budgeted agent briefs and next-work plans for pm workspaces",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "manifest.json",
11
+ "README.md",
12
+ "LICENSE",
13
+ "CHANGELOG.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "build:test": "tsc -p tsconfig.test.json",
18
+ "test": "npm run build && npm run build:test && node --test dist-test/*.js",
19
+ "prepack": "npm run build",
20
+ "typecheck": "tsc --noEmit",
21
+ "check": "npm run typecheck",
22
+ "audit:prod": "npm audit --omit=dev",
23
+ "pack:dry-run": "npm pack --dry-run",
24
+ "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-brief/blob/main/.agents/pm",
25
+ "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-brief/blob/main/.agents/pm",
26
+ "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-brief/blob/main/.agents/pm --check",
27
+ "release:check": "npm run typecheck && npm run build && npm test && npm run audit:prod && npm run pack:dry-run && npm run changelog:check"
28
+ },
29
+ "keywords": [
30
+ "agent",
31
+ "brief",
32
+ "context",
33
+ "handoff",
34
+ "pm-cli",
35
+ "pm-package",
36
+ "project-management"
37
+ ],
38
+ "author": "@unbraind",
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/unbraind/pm-brief.git"
43
+ },
44
+ "homepage": "https://github.com/unbraind/pm-brief#readme",
45
+ "bugs": {
46
+ "url": "https://github.com/unbraind/pm-brief/issues"
47
+ },
48
+ "engines": {
49
+ "node": ">=20.0.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@unbrained/pm-cli": ">=2026.6.6"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^25.9.2",
56
+ "@unbrained/pm-cli": "^2026.6.6",
57
+ "pm-changelog": "^2026.6.6",
58
+ "typescript": "^6.0.3"
59
+ },
60
+ "pm": {
61
+ "aliases": [
62
+ "brief"
63
+ ],
64
+ "extensions": [
65
+ "."
66
+ ],
67
+ "catalog": {
68
+ "display_name": "Brief",
69
+ "category": "context",
70
+ "summary": "Token-budgeted agent briefs and next-work plans for pm workspaces",
71
+ "tags": [
72
+ "agent",
73
+ "context",
74
+ "handoff"
75
+ ],
76
+ "links": {
77
+ "docs": "https://github.com/unbraind/pm-brief#readme",
78
+ "npm": "https://www.npmjs.com/package/pm-brief",
79
+ "repository": "https://github.com/unbraind/pm-brief",
80
+ "report": "https://github.com/unbraind/pm-brief/issues"
81
+ }
82
+ },
83
+ "docs": [
84
+ "README.md",
85
+ "CHANGELOG.md"
86
+ ],
87
+ "examples": [
88
+ "README.md"
89
+ ],
90
+ "capabilities": [
91
+ "commands",
92
+ "schema"
93
+ ]
94
+ }
95
+ }