pm-slack-standup 2026.6.1 → 2026.6.3

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 CHANGED
@@ -1,6 +1,29 @@
1
1
  # Changelog
2
2
 
3
- ## 2026.6.1 - 2026-06-01
3
+ ## 2026.6.3 - 2026-06-02
4
+
5
+ ### Added
6
+
7
+ - Deep feature expansion: multi-format output, grouping, sections, date windows ([pm-slack-standup-h64p](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/features/pm-slack-standup-h64p.toon))
8
+ - Add --days relative date window alongside --since ([pm-slack-standup-5sow](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-5sow.toon))
9
+ - Add --sections selection/ordering with dedicated Blocked section ([pm-slack-standup-jimx](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-jimx.toon))
10
+ - Add --group-by sprint and type \(extend assignee/status\) ([pm-slack-standup-f4m6](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-f4m6.toon))
11
+ - Add --format slack\|blockkit\|markdown\|plain unified output ([pm-slack-standup-dgyy](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-dgyy.toon))
12
+
13
+ ### Other
14
+
15
+ - Keep slack message text byte-identical; --format governs printed output only \(blockkit JSON no longer always dumped in dry-run\) ([pm-slack-standup-rttw](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/decisions/pm-slack-standup-rttw.toon))
16
+ - Block Kit schema: single header \(150ch\), one mrkdwn section per bucket \(3000ch truncation\), divider + context footer ([pm-slack-standup-rpty](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/decisions/pm-slack-standup-rpty.toon))
17
+ - Export pure helpers + node:test unit suite \(formatters/grouping/window\) ([pm-slack-standup-uf4j](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-uf4j.toon))
18
+ - Missing-creds real post -\> CommandError \(exit 1\); no network in dry-run ([pm-slack-standup-m9ze](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/tasks/pm-slack-standup-m9ze.toon))
19
+
20
+ ## 2026.06.02 - 2026-06-02
21
+
22
+ ### Added
23
+
24
+ - Block Kit standup + standup export exporter + grouping/window/mention flags ([pm-slack-standup-ddta](https://github.com/unbraind/pm-slack-standup/blob/main/.agents/pm/features/pm-slack-standup-ddta.toon))
25
+
26
+ ## 2026.06.01 - 2026-06-01
4
27
 
5
28
  ### Fixed
6
29
 
package/README.md CHANGED
@@ -4,12 +4,15 @@ A [pm-cli](https://github.com/unbraind/pm-cli) extension that posts your current
4
4
 
5
5
  ## Features
6
6
 
7
- - Posts WIP, Blocked, and Up Next items to a Slack channel via incoming webhook
8
- - Optional Done Today section (`--include-done`)
9
- - Dry-run mode to preview the message without posting
10
- - Slack mrkdwn formatting or plain text output
11
- - Channel prefix support
12
- - Webhook URL configurable via flag or environment variable
7
+ - Posts WIP, Blocked, Up Next (and optional Done) items to Slack as a rich **Block Kit** message (header, one section per bucket, context footer) with an automatic plain-text fallback
8
+ - **Four output formats** (`--format`): `slack` (Slack mrkdwn, the default), `blockkit` (the raw Block Kit `blocks` JSON), `markdown` (GitHub/CommonMark), and `plain` text
9
+ - **`--dry-run`** build and print the message in the chosen format **without** posting to Slack (no network call is made)
10
+ - Group section items by `status` (default), `assignee`, `sprint`, or `type` (`--group-by`)
11
+ - Choose which sections to render and in what order with `--sections` (`in_progress`, `blocked`, `done`, `up_next`); a dedicated **Blocked** section always surfaces blocked items
12
+ - Scope the "recently closed / Done" window with `--since <iso>` **or** `--days <n>` (relative)
13
+ - Map pm authors to Slack handles so they get mentioned (`--mention-map`)
14
+ - `pm standup export` — write the standup to a file as Markdown or JSON (the JSON form includes the full Block Kit payload for archiving or re-posting)
15
+ - `--channel` override; webhook URL configurable via flag or environment variable. A real post with **no webhook configured** fails with a clear, structured error (exit 1) rather than crashing — use `--dry-run` to preview without credentials
13
16
 
14
17
  ## Installation
15
18
 
@@ -56,10 +59,49 @@ pm standup [flags]
56
59
  | Flag | Type | Default | Description |
57
60
  |------|------|---------|-------------|
58
61
  | `--webhook <url>` | string | — | Slack incoming webhook URL (overrides `PM_SLACK_WEBHOOK`) |
59
- | `--channel <name>` | string | — | Channel name to prepend to the message (e.g. `#team-eng`) |
60
- | `--dry-run` | boolean | `false` | Print the message without posting to Slack |
61
- | `--include-done` | boolean | `false` | Include items with `done` status in a Done Today section |
62
- | `--format <slack\|text>` | string | `slack` | Output format: `slack` uses mrkdwn, `text` is plain |
62
+ | `--channel <name>` | string | — | Channel name shown in the message (e.g. `#team-eng`) |
63
+ | `--dry-run` | boolean | `false` | Build and print the message in the chosen format **without** posting |
64
+ | `--format <fmt>` | string | `slack` | Output format: `slack` (mrkdwn) \| `blockkit` (JSON) \| `markdown` \| `plain` |
65
+ | `--include-done` | boolean | `false` | Include recently-closed items in a Done section |
66
+ | `--since <iso>` | string | — | ISO date/time window; scopes the Done section to items updated since then |
67
+ | `--days <n>` | number | — | Relative window: scope Done to items updated in the last N days (combines with `--since`, more restrictive bound wins) |
68
+ | `--group-by <field>` | string | `status` | Group section items by `status` \| `assignee` \| `sprint` \| `type` |
69
+ | `--sections <list>` | string | all | Comma list of sections to render/order: `in_progress`, `blocked`, `done`, `up_next` |
70
+ | `--mention-map <map>` | string | — | Map pm authors to Slack handles, e.g. `alice=@alice,bob=@bob` |
71
+
72
+ > **Note on `text`:** the legacy `--format text` value is still accepted as an alias for `plain`.
73
+
74
+ ### Output formats
75
+
76
+ `--format` selects what the command prints (in `--dry-run`) and how it renders the Slack message text:
77
+
78
+ - **`slack`** (default) — Slack mrkdwn (`*bold*`, `_italic_`). The message posted to Slack is unchanged from previous versions.
79
+ - **`blockkit`** — the raw Slack Block Kit `{ "blocks": [...] }` JSON, ready to POST to `chat.postMessage` or paste into Block Kit Builder.
80
+ - **`markdown`** — GitHub/CommonMark with `#`/`##` headings and `-` bullets, for issues, wikis, or PR comments.
81
+ - **`plain`** — emphasis-free plain text for email or terminals.
82
+
83
+ ```bash
84
+ pm standup --dry-run --format blockkit # raw Block Kit JSON
85
+ pm standup --dry-run --format markdown --include-done # CommonMark
86
+ pm standup --dry-run --format plain --days 7 # plain text, last 7 days
87
+ ```
88
+
89
+ ## Export
90
+
91
+ `pm standup export` writes the standup to a file (or stdout) instead of posting it to Slack:
92
+
93
+ ```bash
94
+ pm standup export --format md --output standup.md --include-done
95
+ pm standup export --format json --output standup.json --group-by assignee
96
+ pm standup export # Markdown to stdout
97
+ ```
98
+
99
+ | Flag | Default | Description |
100
+ |------|---------|-------------|
101
+ | `--format <md\|json>` | `md` | File format. `json` includes the full Block Kit payload under `slack.blocks` |
102
+ | `--output <file>` | stdout | Output file path |
103
+
104
+ The `--since`, `--group-by`, `--include-done`, `--channel` and `--mention-map` flags above also apply to the export.
63
105
 
64
106
  ### Examples
65
107
 
@@ -75,7 +117,12 @@ pm standup --channel '#team-eng' --dry-run
75
117
 
76
118
  **Include done items and use plain text format:**
77
119
  ```bash
78
- pm standup --include-done --format text
120
+ pm standup --include-done --format plain
121
+ ```
122
+
123
+ **Group by sprint, only In Progress + Blocked:**
124
+ ```bash
125
+ pm standup --dry-run --group-by sprint --sections in_progress,blocked
79
126
  ```
80
127
 
81
128
  **Full explicit invocation:**
@@ -111,7 +158,7 @@ pm standup \
111
158
  • [Chore] Update dependencies (priority 3)
112
159
  ```
113
160
 
114
- ### Plain Text (`--format text`)
161
+ ### Plain Text (`--format plain`)
115
162
 
116
163
  ```
117
164
  📊 pm standup — 2026-05-09
@@ -152,10 +199,10 @@ npm run dev # watch mode
152
199
 
153
200
  ## How It Works
154
201
 
155
- 1. Fetches items from pm-cli with statuses `wip`, `blocked`, `todo`, and optionally `done`.
156
- 2. Sorts `todo` items by priority (ascending) and takes the top 3 as "Up Next".
157
- 3. Formats a message using either Slack mrkdwn or plain text.
158
- 4. Posts the message to the configured Slack webhook using Node.js native `https`.
202
+ 1. Reads every item once via `pm --path <root> list-all --json --include-body` and buckets them locally into In Progress, Blocked, open (Up Next) and optionally Done.
203
+ 2. Sorts open items by priority (ascending) and takes the top 3 as "Up Next".
204
+ 3. Builds a Slack Block Kit `blocks` array (header + a section per bucket + context footer) plus a plain-text `fallback`, optionally grouped by assignee and annotated with Slack mentions.
205
+ 4. In `--dry-run`, prints the message in the chosen `--format` and exits without any network call. Otherwise posts `{ text, blocks }` to the configured Slack webhook using Node.js native `https`. A missing webhook (on a real post) or a failed post raises a structured `CommandError` and exits non-zero.
159
206
 
160
207
  ## License
161
208
 
package/dist/index.d.ts CHANGED
@@ -1,3 +1,150 @@
1
+ export declare class CommandError extends Error {
2
+ exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export interface PmItem {
6
+ id: string;
7
+ title: string;
8
+ status: string;
9
+ type?: string;
10
+ priority?: number;
11
+ tags?: string[];
12
+ milestone?: string;
13
+ release?: string;
14
+ sprint?: string;
15
+ assignee?: string;
16
+ author?: string;
17
+ body?: string;
18
+ created_at?: string;
19
+ updated_at?: string;
20
+ }
21
+ export type Format = "slack" | "blockkit" | "markdown" | "plain";
22
+ export type GroupBy = "status" | "assignee" | "sprint" | "type";
23
+ export type SectionKey = "in_progress" | "blocked" | "done" | "up_next";
24
+ export declare const ALL_SECTIONS: readonly SectionKey[];
25
+ export interface StandupData {
26
+ wip: PmItem[];
27
+ blocked: PmItem[];
28
+ done: PmItem[];
29
+ upNext: PmItem[];
30
+ total: number;
31
+ }
32
+ export interface StandupOptions {
33
+ channel?: string;
34
+ format: Format;
35
+ includeDone: boolean;
36
+ since?: string;
37
+ groupBy: GroupBy;
38
+ sections: SectionKey[];
39
+ mentionMap: Record<string, string>;
40
+ }
41
+ export declare function readBoolOption(options: Record<string, unknown>, key: string): boolean;
42
+ export declare function readStrOption(options: Record<string, unknown>, key: string): string | undefined;
43
+ /**
44
+ * Parse a `--mention-map` spec mapping pm authors to Slack handles.
45
+ * Accepts `author=@handle,other=@h2` (commas) or semicolon separators.
46
+ * A leading `@` on the handle is optional and normalized on.
47
+ */
48
+ export declare function parseMentionMap(spec: string | undefined): Record<string, string>;
49
+ /**
50
+ * Normalize a `--format` value. Accepts the four public formats plus the
51
+ * legacy `text` alias (== `plain`). Unknown values raise a USAGE CommandError.
52
+ */
53
+ export declare function parseFormat(raw: string | undefined): Format;
54
+ export declare function parseGroupBy(raw: string | undefined): GroupBy;
55
+ /**
56
+ * Parse a `--sections` spec (comma/semicolon list) into an ordered, de-duped
57
+ * list of section keys. Empty spec → all sections in default order. An
58
+ * unknown token is a USAGE error rather than a silent drop.
59
+ */
60
+ export declare function parseSections(spec: string | undefined): SectionKey[];
61
+ /**
62
+ * Resolve the "recently closed" window start (ms epoch) from `--since` and/or
63
+ * `--days`. `--since` is an explicit ISO date/time; `--days <n>` is N days
64
+ * before now. If both are given the *later* (more restrictive) bound wins.
65
+ * Returns NaN when neither is set (no windowing). Invalid input → USAGE error.
66
+ */
67
+ export declare function resolveSinceMs(since: string | undefined, days: number | undefined, now?: number): number;
68
+ export declare function parseDays(raw: string | undefined): number | undefined;
69
+ /**
70
+ * Read every item once via `list-all --json --include-body`, then bucket by
71
+ * status locally. This is a single pm invocation (vs. four list-by-status
72
+ * calls) and gives us bodies + assignee + timestamps for grouping/windowing.
73
+ */
74
+ export declare function fetchAllItems(pmRoot: string): PmItem[];
75
+ /**
76
+ * True when an item's last activity falls within the [sinceMs, now] window.
77
+ * NaN sinceMs means "no window" → always true.
78
+ */
79
+ export declare function withinWindow(item: PmItem, sinceMs: number): boolean;
80
+ /**
81
+ * Bucket items into standup sections.
82
+ * `sinceMs` (epoch ms, NaN = no window) filters the Done section to items
83
+ * updated within the window; WIP/blocked/up-next always reflect current state.
84
+ */
85
+ export declare function buildStandupData(items: PmItem[], opts: StandupOptions, sinceMs?: number): StandupData;
86
+ interface SectionDef {
87
+ key: SectionKey;
88
+ emoji: string;
89
+ title: string;
90
+ items: PmItem[];
91
+ emptyNote: string | null;
92
+ withPriority: boolean;
93
+ }
94
+ /**
95
+ * Resolve the ordered, selected section definitions for the given data.
96
+ * `in_progress` and `blocked` always render (even empty, with their note);
97
+ * `done` and `up_next` only render when they hold items — preserving the
98
+ * historical message shape. `--sections` filters which keys are eligible.
99
+ */
100
+ export declare function resolveSections(data: StandupData, opts: StandupOptions): SectionDef[];
101
+ export declare function itemText(item: PmItem, mentionMap: Record<string, string>, withPriority?: boolean): string;
102
+ /**
103
+ * Group a list of items by the configured field (assignee, sprint or type).
104
+ * Items missing the field bucket under a synthetic "_none" key (rendered as a
105
+ * friendly label). Returns entries sorted by group key for stable output.
106
+ */
107
+ export declare function groupItems(items: PmItem[], groupBy: GroupBy): Array<[string, PmItem[]]>;
108
+ /**
109
+ * Render the standup as a single text blob for the chosen non-Block-Kit
110
+ * format. `slack` is byte-identical to the historical output (mrkdwn);
111
+ * `plain` drops emphasis punctuation; `markdown` uses `#`/`**`/`-`.
112
+ */
113
+ export declare function buildTextMessage(data: StandupData, opts: StandupOptions): string;
114
+ export interface SlackBlock {
115
+ type: string;
116
+ [key: string]: unknown;
117
+ }
118
+ /**
119
+ * Build a Slack Block Kit `blocks` array: a header, a section per selected
120
+ * standup bucket and a context footer. Returns the blocks plus a plain-text
121
+ * `fallback` Slack renders in notifications and old clients.
122
+ *
123
+ * Block Kit schema choices: a single `header` block (plain_text, capped at
124
+ * Slack's 150-char limit), one `section`/`mrkdwn` block per bucket (Slack
125
+ * caps section text at 3000 chars — long buckets are truncated with an
126
+ * ellipsis to stay valid), a `divider`, then a `context` footer summarizing
127
+ * counts / window / grouping.
128
+ */
129
+ export declare function buildBlockKit(data: StandupData, opts: StandupOptions): {
130
+ blocks: SlackBlock[];
131
+ fallback: string;
132
+ };
133
+ /**
134
+ * Render the standup in whichever `--format` was selected, as the string the
135
+ * command prints (dry-run) or the exporter writes. `blockkit` returns the
136
+ * pretty-printed `{ blocks }` JSON; everything else returns text.
137
+ */
138
+ export declare function renderStandup(data: StandupData, opts: StandupOptions): string;
139
+ /**
140
+ * Resolve every standup option except the render `format`, which differs
141
+ * between the command (slack|blockkit|markdown|plain) and the exporter
142
+ * (md|json file format). Callers supply the format they want.
143
+ */
144
+ export declare function resolveStandupOptions(options: Record<string, unknown>, format: Format): {
145
+ opts: StandupOptions;
146
+ sinceMs: number;
147
+ };
1
148
  declare const _default: {
2
149
  name: string;
3
150
  version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;AA2PA,wBAqHG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import https from "node:https";
2
2
  import { spawnSync } from "node:child_process";
3
+ import { writeFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
3
5
  const defineExtension = ((extension) => extension);
4
6
  // ---------------------------------------------------------------------------
5
7
  // Error contract
@@ -16,7 +18,7 @@ const EXIT_CODE = {
16
18
  USAGE: 2,
17
19
  NOT_FOUND: 3,
18
20
  };
19
- class CommandError extends Error {
21
+ export class CommandError extends Error {
20
22
  exitCode;
21
23
  constructor(message, exitCode = EXIT_CODE.GENERIC_FAILURE) {
22
24
  super(message);
@@ -24,6 +26,12 @@ class CommandError extends Error {
24
26
  this.exitCode = exitCode;
25
27
  }
26
28
  }
29
+ export const ALL_SECTIONS = [
30
+ "in_progress",
31
+ "blocked",
32
+ "done",
33
+ "up_next",
34
+ ];
27
35
  // ---------------------------------------------------------------------------
28
36
  // Option helpers
29
37
  // ---------------------------------------------------------------------------
@@ -35,7 +43,7 @@ class CommandError extends Error {
35
43
  function camelCase(key) {
36
44
  return key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
37
45
  }
38
- function readBoolOption(options, key) {
46
+ export function readBoolOption(options, key) {
39
47
  for (const candidate of [key, camelCase(key)]) {
40
48
  const value = options[candidate];
41
49
  if (typeof value === "boolean")
@@ -50,7 +58,7 @@ function readBoolOption(options, key) {
50
58
  }
51
59
  return false;
52
60
  }
53
- function readStrOption(options, key) {
61
+ export function readStrOption(options, key) {
54
62
  for (const candidate of [key, camelCase(key)]) {
55
63
  const value = options[candidate];
56
64
  if (typeof value === "string" && value.trim().length > 0) {
@@ -59,110 +67,441 @@ function readStrOption(options, key) {
59
67
  }
60
68
  return undefined;
61
69
  }
70
+ /**
71
+ * Parse a `--mention-map` spec mapping pm authors to Slack handles.
72
+ * Accepts `author=@handle,other=@h2` (commas) or semicolon separators.
73
+ * A leading `@` on the handle is optional and normalized on.
74
+ */
75
+ export function parseMentionMap(spec) {
76
+ const map = {};
77
+ if (!spec)
78
+ return map;
79
+ for (const pair of spec.split(/[,;]/)) {
80
+ const eq = pair.indexOf("=");
81
+ if (eq < 0)
82
+ continue;
83
+ const author = pair.slice(0, eq).trim();
84
+ let handle = pair.slice(eq + 1).trim();
85
+ if (!author || !handle)
86
+ continue;
87
+ if (!handle.startsWith("@"))
88
+ handle = `@${handle}`;
89
+ map[author] = handle;
90
+ }
91
+ return map;
92
+ }
93
+ /**
94
+ * Normalize a `--format` value. Accepts the four public formats plus the
95
+ * legacy `text` alias (== `plain`). Unknown values raise a USAGE CommandError.
96
+ */
97
+ export function parseFormat(raw) {
98
+ if (raw == null)
99
+ return "slack";
100
+ const v = raw.trim().toLowerCase();
101
+ if (v === "" || v === "slack")
102
+ return "slack";
103
+ if (v === "blockkit" || v === "block-kit" || v === "blocks")
104
+ return "blockkit";
105
+ if (v === "markdown" || v === "md")
106
+ return "markdown";
107
+ if (v === "plain" || v === "text" || v === "txt")
108
+ return "plain";
109
+ throw new CommandError(`Unknown --format '${raw}'. Valid: slack | blockkit | markdown | plain.`, EXIT_CODE.USAGE);
110
+ }
111
+ export function parseGroupBy(raw) {
112
+ if (raw == null)
113
+ return "status";
114
+ const v = raw.trim().toLowerCase();
115
+ if (v === "" || v === "status")
116
+ return "status";
117
+ if (v === "assignee" || v === "owner")
118
+ return "assignee";
119
+ if (v === "sprint")
120
+ return "sprint";
121
+ if (v === "type")
122
+ return "type";
123
+ throw new CommandError(`Unknown --group-by '${raw}'. Valid: status | assignee | sprint | type.`, EXIT_CODE.USAGE);
124
+ }
125
+ const SECTION_ALIASES = {
126
+ in_progress: "in_progress",
127
+ "in-progress": "in_progress",
128
+ wip: "in_progress",
129
+ progress: "in_progress",
130
+ blocked: "blocked",
131
+ done: "done",
132
+ closed: "done",
133
+ up_next: "up_next",
134
+ "up-next": "up_next",
135
+ upnext: "up_next",
136
+ next: "up_next",
137
+ };
138
+ /**
139
+ * Parse a `--sections` spec (comma/semicolon list) into an ordered, de-duped
140
+ * list of section keys. Empty spec → all sections in default order. An
141
+ * unknown token is a USAGE error rather than a silent drop.
142
+ */
143
+ export function parseSections(spec) {
144
+ if (!spec || !spec.trim())
145
+ return [...ALL_SECTIONS];
146
+ const out = [];
147
+ for (const raw of spec.split(/[,;]/)) {
148
+ const token = raw.trim().toLowerCase();
149
+ if (!token)
150
+ continue;
151
+ const key = SECTION_ALIASES[token];
152
+ if (!key) {
153
+ throw new CommandError(`Unknown --sections value '${raw.trim()}'. Valid: in_progress | blocked | done | up_next.`, EXIT_CODE.USAGE);
154
+ }
155
+ if (!out.includes(key))
156
+ out.push(key);
157
+ }
158
+ return out.length > 0 ? out : [...ALL_SECTIONS];
159
+ }
160
+ /**
161
+ * Resolve the "recently closed" window start (ms epoch) from `--since` and/or
162
+ * `--days`. `--since` is an explicit ISO date/time; `--days <n>` is N days
163
+ * before now. If both are given the *later* (more restrictive) bound wins.
164
+ * Returns NaN when neither is set (no windowing). Invalid input → USAGE error.
165
+ */
166
+ export function resolveSinceMs(since, days, now = Date.now()) {
167
+ let bound = NaN;
168
+ if (since != null) {
169
+ const ms = Date.parse(since);
170
+ if (isNaN(ms)) {
171
+ throw new CommandError(`Invalid --since value '${since}' (expected an ISO date/time).`, EXIT_CODE.USAGE);
172
+ }
173
+ bound = ms;
174
+ }
175
+ if (days != null) {
176
+ if (!Number.isFinite(days) || days < 0) {
177
+ throw new CommandError(`Invalid --days value '${days}' (expected a non-negative number).`, EXIT_CODE.USAGE);
178
+ }
179
+ const daysBound = now - days * 86_400_000;
180
+ bound = isNaN(bound) ? daysBound : Math.max(bound, daysBound);
181
+ }
182
+ return bound;
183
+ }
184
+ export function parseDays(raw) {
185
+ if (raw == null || raw.trim() === "")
186
+ return undefined;
187
+ const n = Number(raw.trim());
188
+ if (!Number.isFinite(n)) {
189
+ throw new CommandError(`Invalid --days value '${raw}' (expected a number).`, EXIT_CODE.USAGE);
190
+ }
191
+ return n;
192
+ }
62
193
  // ---------------------------------------------------------------------------
63
- // Helpers
194
+ // Data fetch
64
195
  // ---------------------------------------------------------------------------
65
- function fetchItemsByStatus(pmRoot, subcommand) {
66
- const result = spawnSync("pm", ["--path", pmRoot, subcommand, "--json"], { encoding: "utf-8" });
196
+ /**
197
+ * Read every item once via `list-all --json --include-body`, then bucket by
198
+ * status locally. This is a single pm invocation (vs. four list-by-status
199
+ * calls) and gives us bodies + assignee + timestamps for grouping/windowing.
200
+ */
201
+ export function fetchAllItems(pmRoot) {
202
+ const result = spawnSync("pm", ["--path", pmRoot, "list-all", "--json", "--include-body"], { encoding: "utf-8" });
67
203
  if (result.error || result.status !== 0) {
68
- console.error(`pm ${subcommand} failed: ${result.stderr}`);
204
+ console.error(`pm list-all failed: ${result.stderr ?? result.error?.message ?? ""}`);
69
205
  return [];
70
206
  }
71
- return (JSON.parse(result.stdout).items ?? []);
207
+ try {
208
+ return (JSON.parse(result.stdout).items ?? []);
209
+ }
210
+ catch (err) {
211
+ console.error(`pm list-all returned unparseable JSON: ${err instanceof Error ? err.message : String(err)}`);
212
+ return [];
213
+ }
214
+ }
215
+ const WIP_STATUSES = new Set(["in_progress", "wip", "doing"]);
216
+ const BLOCKED_STATUSES = new Set(["blocked", "on_hold"]);
217
+ const OPEN_STATUSES = new Set(["open", "todo", "new", "draft"]);
218
+ const DONE_STATUSES = new Set(["closed", "done", "complete", "completed"]);
219
+ function statusOf(item) {
220
+ return (item.status ?? "").trim().toLowerCase();
221
+ }
222
+ /**
223
+ * True when an item's last activity falls within the [sinceMs, now] window.
224
+ * NaN sinceMs means "no window" → always true.
225
+ */
226
+ export function withinWindow(item, sinceMs) {
227
+ if (isNaN(sinceMs))
228
+ return true;
229
+ const ts = Date.parse(item.updated_at ?? item.created_at ?? "");
230
+ return isNaN(ts) ? false : ts >= sinceMs;
231
+ }
232
+ /**
233
+ * Bucket items into standup sections.
234
+ * `sinceMs` (epoch ms, NaN = no window) filters the Done section to items
235
+ * updated within the window; WIP/blocked/up-next always reflect current state.
236
+ */
237
+ export function buildStandupData(items, opts, sinceMs = NaN) {
238
+ const wip = items.filter((i) => WIP_STATUSES.has(statusOf(i)));
239
+ const blocked = items.filter((i) => BLOCKED_STATUSES.has(statusOf(i)));
240
+ const open = items.filter((i) => OPEN_STATUSES.has(statusOf(i)));
241
+ const done = opts.includeDone
242
+ ? items.filter((i) => DONE_STATUSES.has(statusOf(i)) && withinWindow(i, sinceMs))
243
+ : [];
244
+ const upNext = [...open]
245
+ .sort((a, b) => (a.priority ?? 9999) - (b.priority ?? 9999))
246
+ .slice(0, 3);
247
+ return { wip, blocked, done, upNext, total: items.length };
248
+ }
249
+ const SECTION_META = {
250
+ in_progress: { emoji: "🏃", title: "In Progress", emptyNote: "nothing in progress", withPriority: false },
251
+ blocked: { emoji: "🚫", title: "Blocked", emptyNote: "nothing blocked", withPriority: false },
252
+ done: { emoji: "✅", title: "Done", emptyNote: null, withPriority: false },
253
+ up_next: { emoji: "📋", title: "Up Next", emptyNote: null, withPriority: true },
254
+ };
255
+ /**
256
+ * Resolve the ordered, selected section definitions for the given data.
257
+ * `in_progress` and `blocked` always render (even empty, with their note);
258
+ * `done` and `up_next` only render when they hold items — preserving the
259
+ * historical message shape. `--sections` filters which keys are eligible.
260
+ */
261
+ export function resolveSections(data, opts) {
262
+ const itemsFor = {
263
+ in_progress: data.wip,
264
+ blocked: data.blocked,
265
+ done: data.done,
266
+ up_next: data.upNext,
267
+ };
268
+ const alwaysShow = {
269
+ in_progress: true,
270
+ blocked: true,
271
+ done: false,
272
+ up_next: false,
273
+ };
274
+ const out = [];
275
+ for (const key of opts.sections) {
276
+ const items = itemsFor[key];
277
+ if (!alwaysShow[key] && items.length === 0)
278
+ continue;
279
+ const meta = SECTION_META[key];
280
+ out.push({ key, emoji: meta.emoji, title: meta.title, items, emptyNote: meta.emptyNote, withPriority: meta.withPriority });
281
+ }
282
+ return out;
72
283
  }
284
+ // ---------------------------------------------------------------------------
285
+ // Rendering helpers
286
+ // ---------------------------------------------------------------------------
73
287
  function typeLabel(item) {
74
288
  if (!item.type)
75
289
  return "";
76
290
  const label = item.type.charAt(0).toUpperCase() + item.type.slice(1);
77
291
  return `[${label}]`;
78
292
  }
79
- function itemLine(item, format) {
293
+ function mentionFor(item, mentionMap) {
294
+ const author = item.assignee ?? item.author;
295
+ if (author && mentionMap[author])
296
+ return ` (${mentionMap[author]})`;
297
+ return "";
298
+ }
299
+ export function itemText(item, mentionMap, withPriority = false) {
80
300
  const label = typeLabel(item);
81
301
  const title = label ? `${label} ${item.title}` : item.title;
82
- return format === "slack" ? `• ${title}` : `• ${title}`;
302
+ const prio = withPriority && item.priority != null ? ` (priority ${item.priority})` : "";
303
+ return `${title}${prio}${mentionFor(item, mentionMap)}`;
83
304
  }
84
305
  function todayISO() {
85
306
  return new Date().toISOString().slice(0, 10);
86
307
  }
87
- function buildMessage(wip, blocked, done, upNext, opts) {
88
- const { format } = opts;
89
- const lines = [];
90
- // Header
91
- const dateStr = todayISO();
92
- if (format === "slack") {
93
- lines.push(`📊 *pm standup* ${dateStr}`);
94
- }
95
- else {
96
- lines.push(`📊 pm standup — ${dateStr}`);
97
- }
98
- // Channel prefix (prepended at the very top when posting to Slack)
99
- // It's added to the message body so dry-run also shows it.
100
- if (opts.channel) {
101
- lines.unshift(`> Channel: ${opts.channel}`);
308
+ /**
309
+ * Group a list of items by the configured field (assignee, sprint or type).
310
+ * Items missing the field bucket under a synthetic "_none" key (rendered as a
311
+ * friendly label). Returns entries sorted by group key for stable output.
312
+ */
313
+ export function groupItems(items, groupBy) {
314
+ const groups = new Map();
315
+ for (const item of items) {
316
+ let key;
317
+ if (groupBy === "assignee")
318
+ key = item.assignee ?? "_none";
319
+ else if (groupBy === "sprint")
320
+ key = item.sprint ?? "_none";
321
+ else if (groupBy === "type")
322
+ key = item.type ?? "_none";
323
+ else
324
+ key = "_none";
325
+ const bucket = groups.get(key);
326
+ if (bucket)
327
+ bucket.push(item);
328
+ else
329
+ groups.set(key, [item]);
102
330
  }
103
- lines.push("");
104
- // In Progress
105
- if (format === "slack") {
106
- lines.push(`🏃 *In Progress* (${wip.length})`);
331
+ return [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0]));
332
+ }
333
+ function groupLabel(key, groupBy) {
334
+ if (key !== "_none")
335
+ return key;
336
+ if (groupBy === "assignee")
337
+ return "Unassigned";
338
+ if (groupBy === "sprint")
339
+ return "No sprint";
340
+ if (groupBy === "type")
341
+ return "Untyped";
342
+ return key;
343
+ }
344
+ const isGrouped = (opts) => opts.groupBy !== "status";
345
+ // ---------------------------------------------------------------------------
346
+ // Plain-text / mrkdwn / markdown message (fallback + dry-run preview)
347
+ // ---------------------------------------------------------------------------
348
+ function bold(text, format) {
349
+ if (format === "slack")
350
+ return `*${text}*`;
351
+ if (format === "markdown")
352
+ return `**${text}**`;
353
+ return text;
354
+ }
355
+ function italic(text, format) {
356
+ if (format === "slack")
357
+ return `_${text}_`;
358
+ if (format === "markdown")
359
+ return `_${text}_`;
360
+ return text;
361
+ }
362
+ function renderSection(lines, def, opts) {
363
+ const count = `(${def.items.length})`;
364
+ if (opts.format === "markdown") {
365
+ lines.push(`## ${def.emoji} ${def.title} ${count}`);
107
366
  }
108
367
  else {
109
- lines.push(`🏃 In Progress (${wip.length})`);
110
- }
111
- if (wip.length === 0) {
112
- lines.push("• _nothing in progress_");
368
+ lines.push(`${def.emoji} ${bold(def.title, opts.format)} ${count}`);
113
369
  }
114
- else {
115
- for (const item of wip)
116
- lines.push(itemLine(item, format));
370
+ if (def.items.length === 0) {
371
+ if (def.emptyNote) {
372
+ const bullet = opts.format === "markdown" ? "- " : "• ";
373
+ lines.push(`${bullet}${italic(def.emptyNote, opts.format)}`);
374
+ }
375
+ return;
117
376
  }
118
- lines.push("");
119
- // Blocked
120
- if (format === "slack") {
121
- lines.push(`🚫 *Blocked* (${blocked.length})`);
377
+ if (isGrouped(opts)) {
378
+ for (const [key, group] of groupItems(def.items, opts.groupBy)) {
379
+ const name = groupLabel(key, opts.groupBy);
380
+ if (opts.format === "markdown")
381
+ lines.push(`- ${bold(name, opts.format)}`);
382
+ else
383
+ lines.push(` ${bold(name, opts.format)}`);
384
+ for (const item of group) {
385
+ const bullet = opts.format === "markdown" ? " - " : " • ";
386
+ lines.push(`${bullet}${itemText(item, opts.mentionMap, def.withPriority)}`);
387
+ }
388
+ }
122
389
  }
123
390
  else {
124
- lines.push(`🚫 Blocked (${blocked.length})`);
391
+ const bullet = opts.format === "markdown" ? "- " : "• ";
392
+ for (const item of def.items)
393
+ lines.push(`${bullet}${itemText(item, opts.mentionMap, def.withPriority)}`);
125
394
  }
126
- if (blocked.length === 0) {
127
- lines.push("• _nothing blocked_");
128
- }
129
- else {
130
- for (const item of blocked)
131
- lines.push(itemLine(item, format));
395
+ }
396
+ /**
397
+ * Render the standup as a single text blob for the chosen non-Block-Kit
398
+ * format. `slack` is byte-identical to the historical output (mrkdwn);
399
+ * `plain` drops emphasis punctuation; `markdown` uses `#`/`**`/`-`.
400
+ */
401
+ export function buildTextMessage(data, opts) {
402
+ const lines = [];
403
+ const dateStr = todayISO();
404
+ if (opts.channel) {
405
+ lines.push(opts.format === "markdown" ? `> Channel: ${opts.channel}` : `> Channel: ${opts.channel}`);
132
406
  }
133
- // Done Today (optional)
134
- if (done.length > 0) {
135
- lines.push("");
136
- if (format === "slack") {
137
- lines.push(`✅ *Done Today* (${done.length})`);
138
- }
139
- else {
140
- lines.push(`✅ Done Today (${done.length})`);
407
+ const title = `📊 ${bold("pm standup", opts.format)} — ${dateStr}`;
408
+ lines.push(opts.format === "markdown" ? `# 📊 pm standup — ${dateStr}` : title);
409
+ lines.push("");
410
+ const sections = resolveSections(data, opts);
411
+ sections.forEach((def, idx) => {
412
+ if (idx > 0)
413
+ lines.push("");
414
+ renderSection(lines, def, opts);
415
+ });
416
+ return lines.join("\n");
417
+ }
418
+ function mrkdwnList(items, opts, withPriority = false) {
419
+ if (items.length === 0)
420
+ return "_none_";
421
+ if (isGrouped(opts)) {
422
+ const parts = [];
423
+ for (const [key, group] of groupItems(items, opts.groupBy)) {
424
+ const name = groupLabel(key, opts.groupBy);
425
+ parts.push(`*${name}*`);
426
+ for (const item of group)
427
+ parts.push(`• ${itemText(item, opts.mentionMap, withPriority)}`);
141
428
  }
142
- for (const item of done)
143
- lines.push(itemLine(item, format));
429
+ return parts.join("\n");
144
430
  }
145
- // Up Next
146
- if (upNext.length > 0) {
147
- lines.push("");
148
- if (format === "slack") {
149
- lines.push(`📋 *Up Next* (${upNext.length})`);
150
- }
151
- else {
152
- lines.push(`📋 Up Next (${upNext.length})`);
153
- }
154
- upNext.forEach((item) => {
155
- const label = typeLabel(item);
156
- const title = label ? `${label} ${item.title}` : item.title;
157
- const prio = item.priority != null ? ` (priority ${item.priority})` : "";
158
- lines.push(`• ${title}${prio}`);
431
+ return items.map((item) => `• ${itemText(item, opts.mentionMap, withPriority)}`).join("\n");
432
+ }
433
+ /**
434
+ * Build a Slack Block Kit `blocks` array: a header, a section per selected
435
+ * standup bucket and a context footer. Returns the blocks plus a plain-text
436
+ * `fallback` Slack renders in notifications and old clients.
437
+ *
438
+ * Block Kit schema choices: a single `header` block (plain_text, capped at
439
+ * Slack's 150-char limit), one `section`/`mrkdwn` block per bucket (Slack
440
+ * caps section text at 3000 chars — long buckets are truncated with an
441
+ * ellipsis to stay valid), a `divider`, then a `context` footer summarizing
442
+ * counts / window / grouping.
443
+ */
444
+ export function buildBlockKit(data, opts) {
445
+ const blocks = [];
446
+ const dateStr = todayISO();
447
+ const truncate = (text, max) => text.length <= max ? text : text.slice(0, max - 1) + "…";
448
+ blocks.push({
449
+ type: "header",
450
+ text: { type: "plain_text", text: truncate(`📊 pm standup — ${dateStr}`, 150), emoji: true },
451
+ });
452
+ if (opts.channel) {
453
+ blocks.push({
454
+ type: "context",
455
+ elements: [{ type: "mrkdwn", text: `Channel: ${opts.channel}` }],
159
456
  });
160
457
  }
161
- return lines.join("\n");
458
+ for (const def of resolveSections(data, opts)) {
459
+ blocks.push({
460
+ type: "section",
461
+ text: {
462
+ type: "mrkdwn",
463
+ text: truncate(`${def.emoji} *${def.title}* (${def.items.length})\n${mrkdwnList(def.items, opts, def.withPriority)}`, 3000),
464
+ },
465
+ });
466
+ }
467
+ blocks.push({ type: "divider" });
468
+ const groupNote = {
469
+ status: null,
470
+ assignee: "grouped by assignee",
471
+ sprint: "grouped by sprint",
472
+ type: "grouped by type",
473
+ };
474
+ const footerBits = [
475
+ `${data.total} item(s) total`,
476
+ opts.since ? `since ${opts.since}` : null,
477
+ groupNote[opts.groupBy],
478
+ ].filter(Boolean);
479
+ blocks.push({
480
+ type: "context",
481
+ elements: [{ type: "mrkdwn", text: `🤖 pm-slack-standup · ${footerBits.join(" · ")}` }],
482
+ });
483
+ // Plain-text fallback mirrors the slack-mrkdwn text message.
484
+ const fallback = buildTextMessage(data, { ...opts, format: "slack" });
485
+ return { blocks, fallback };
486
+ }
487
+ /**
488
+ * Render the standup in whichever `--format` was selected, as the string the
489
+ * command prints (dry-run) or the exporter writes. `blockkit` returns the
490
+ * pretty-printed `{ blocks }` JSON; everything else returns text.
491
+ */
492
+ export function renderStandup(data, opts) {
493
+ if (opts.format === "blockkit") {
494
+ const { blocks } = buildBlockKit(data, opts);
495
+ return JSON.stringify({ blocks }, null, 2);
496
+ }
497
+ return buildTextMessage(data, opts);
162
498
  }
163
- function postToSlack(webhookUrl, text) {
164
- return new Promise((resolve, reject) => {
165
- const payload = JSON.stringify({ text, mrkdwn: true });
499
+ // ---------------------------------------------------------------------------
500
+ // Slack transport
501
+ // ---------------------------------------------------------------------------
502
+ function postToSlack(webhookUrl, payload) {
503
+ return new Promise((resolvePromise, reject) => {
504
+ const body = JSON.stringify(payload);
166
505
  const url = new URL(webhookUrl);
167
506
  const options = {
168
507
  hostname: url.hostname,
@@ -170,131 +509,188 @@ function postToSlack(webhookUrl, text) {
170
509
  method: "POST",
171
510
  headers: {
172
511
  "Content-Type": "application/json",
173
- "Content-Length": Buffer.byteLength(payload),
512
+ "Content-Length": Buffer.byteLength(body),
174
513
  },
175
514
  };
176
515
  const req = https.request(options, (res) => {
177
- let body = "";
178
- res.on("data", (chunk) => (body += chunk.toString()));
516
+ let respBody = "";
517
+ res.on("data", (chunk) => (respBody += chunk.toString()));
179
518
  res.on("end", () => {
180
519
  if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
181
- resolve();
520
+ resolvePromise();
182
521
  }
183
522
  else {
184
- reject(new Error(`Slack webhook returned HTTP ${res.statusCode ?? "unknown"}: ${body}`));
523
+ reject(new Error(`Slack webhook returned HTTP ${res.statusCode ?? "unknown"}: ${respBody}`));
185
524
  }
186
525
  });
187
526
  });
188
- req.on("error", (err) => {
189
- reject(new Error(`Slack webhook request failed: ${err.message}`));
190
- });
191
- req.setTimeout(10_000, () => {
192
- req.destroy(new Error("Slack webhook request timed out after 10s"));
193
- });
194
- req.write(payload);
527
+ req.on("error", (err) => reject(new Error(`Slack webhook request failed: ${err.message}`)));
528
+ req.setTimeout(10_000, () => req.destroy(new Error("Slack webhook request timed out after 10s")));
529
+ req.write(body);
195
530
  req.end();
196
531
  });
197
532
  }
198
533
  // ---------------------------------------------------------------------------
534
+ // Shared option resolution
535
+ // ---------------------------------------------------------------------------
536
+ /**
537
+ * Resolve every standup option except the render `format`, which differs
538
+ * between the command (slack|blockkit|markdown|plain) and the exporter
539
+ * (md|json file format). Callers supply the format they want.
540
+ */
541
+ export function resolveStandupOptions(options, format) {
542
+ const since = readStrOption(options, "since");
543
+ const days = parseDays(readStrOption(options, "days"));
544
+ const opts = {
545
+ channel: readStrOption(options, "channel"),
546
+ format,
547
+ includeDone: readBoolOption(options, "include-done"),
548
+ since,
549
+ groupBy: parseGroupBy(readStrOption(options, "group-by")),
550
+ sections: parseSections(readStrOption(options, "sections")),
551
+ mentionMap: parseMentionMap(readStrOption(options, "mention-map")),
552
+ };
553
+ // `--days` implies windowing the Done section; surface it even without
554
+ // `--include-done` being set so the footer/window stays accurate.
555
+ const sinceMs = resolveSinceMs(since, days);
556
+ return { opts, sinceMs };
557
+ }
558
+ // ---------------------------------------------------------------------------
199
559
  // Extension
200
560
  // ---------------------------------------------------------------------------
201
561
  export default defineExtension({
202
562
  name: "pm-slack-standup",
203
- version: "2026.6.1",
563
+ version: "2026.6.3",
204
564
  activate(api) {
205
565
  api.registerCommand({
206
566
  name: "standup",
207
- description: "Post pm context as a Slack standup message",
208
- intent: "Share current work status (in-progress, blocked, up-next) to a Slack channel via webhook",
567
+ description: "Post pm context as a rich Slack standup (Block Kit) message",
568
+ intent: "Share current work status (in-progress, blocked, up-next, done) to a Slack channel via webhook",
209
569
  examples: [
210
570
  "pm standup --webhook https://hooks.slack.com/services/...",
211
571
  "pm standup --channel '#team-eng' --dry-run",
212
- "pm standup --include-done --format text",
572
+ "pm standup --dry-run --format blockkit",
573
+ "pm standup --dry-run --format markdown --include-done --days 7",
574
+ "pm standup --group-by assignee --mention-map 'alice=@alice.s,bob=@bob'",
575
+ "pm standup --group-by sprint --sections in_progress,blocked",
213
576
  "PM_SLACK_WEBHOOK=https://... pm standup --channel '#standups'",
214
577
  ],
215
578
  flags: [
216
- {
217
- long: "--webhook",
218
- value_name: "url",
219
- description: "Slack incoming webhook URL (overrides PM_SLACK_WEBHOOK env var)",
220
- },
221
- {
222
- long: "--channel",
223
- value_name: "name",
224
- description: "Channel name to prepend to the standup message (e.g. #team-eng)",
225
- },
226
- {
227
- long: "--dry-run",
228
- description: "Print the message without posting to Slack",
229
- },
230
- {
231
- long: "--include-done",
232
- description: "Include items with 'closed' status in a Done Today section",
233
- },
234
- {
235
- long: "--format",
236
- value_name: "fmt",
237
- description: "Output format: 'slack' uses mrkdwn bold/italic, 'text' is plain (default: slack)",
238
- },
579
+ { long: "--webhook", value_name: "url", description: "Slack incoming webhook URL (overrides PM_SLACK_WEBHOOK env var)" },
580
+ { long: "--channel", value_name: "name", description: "Channel name shown in the message (e.g. #team-eng)" },
581
+ { long: "--dry-run", description: "Build and print the message in the chosen format WITHOUT posting to Slack" },
582
+ { long: "--format", value_name: "fmt", description: "Output format: slack (mrkdwn, default) | blockkit (JSON) | markdown | plain" },
583
+ { long: "--include-done", description: "Include recently-closed items in a Done section" },
584
+ { long: "--since", value_name: "iso", description: "ISO date/time window; scopes the Done section to items updated since then" },
585
+ { long: "--days", value_name: "n", description: "Relative window: scope Done to items updated in the last N days" },
586
+ { long: "--group-by", value_name: "field", description: "Group section items by status (default) | assignee | sprint | type" },
587
+ { long: "--sections", value_name: "list", description: "Comma list of sections to render: in_progress,blocked,done,up_next" },
588
+ { long: "--mention-map", value_name: "map", description: "Map pm authors to Slack handles, e.g. 'alice=@alice,bob=@bob'" },
239
589
  ],
240
590
  async run(ctx) {
241
- // Resolve options. pm normalizes flags to camelCase at runtime, so we
242
- // read both kebab- and camelCase forms via the option helpers.
243
591
  const webhookUrl = readStrOption(ctx.options, "webhook") ?? process.env["PM_SLACK_WEBHOOK"] ?? "";
244
592
  const dryRun = readBoolOption(ctx.options, "dry-run");
245
- const includeDone = readBoolOption(ctx.options, "include-done");
246
- const rawFormat = readStrOption(ctx.options, "format");
247
- const format = rawFormat === "text" ? "text" : "slack";
248
- const channel = readStrOption(ctx.options, "channel");
249
- if (!dryRun && !webhookUrl) {
250
- // Throw so pm reports a non-zero exit code; returning an error object
251
- // would let the command exit 0 and mask the failure.
252
- throw new CommandError("No webhook URL provided. Set --webhook or PM_SLACK_WEBHOOK env var, or use --dry-run.", EXIT_CODE.USAGE);
253
- }
254
- // Fetch items using pm subcommands
255
- const wipItems = fetchItemsByStatus(ctx.pm_root, "list-in-progress");
256
- const blockedItems = fetchItemsByStatus(ctx.pm_root, "list-blocked");
257
- const todoItems = fetchItemsByStatus(ctx.pm_root, "list-open");
258
- const doneItems = includeDone ? fetchItemsByStatus(ctx.pm_root, "list-closed") : [];
259
- // Sort todo by priority (lower number = higher priority), take top 3
260
- const upNext = [...todoItems]
261
- .sort((a, b) => {
262
- const pa = a.priority ?? 9999;
263
- const pb = b.priority ?? 9999;
264
- return pa - pb;
265
- })
266
- .slice(0, 3);
267
- const message = buildMessage(wipItems, blockedItems, doneItems, upNext, { channel, format, includeDate: true });
593
+ const { opts, sinceMs } = resolveStandupOptions(ctx.options, parseFormat(readStrOption(ctx.options, "format")));
594
+ const items = fetchAllItems(ctx.pm_root);
595
+ const data = buildStandupData(items, opts, sinceMs);
268
596
  if (dryRun) {
269
- console.error("--- DRY RUN (message not posted) ---");
270
- process.stdout.write(message + "\n");
597
+ // No network call happens on this path.
598
+ const rendered = renderStandup(data, opts);
599
+ console.error(`--- DRY RUN (${opts.format}, message not posted) ---`);
600
+ process.stdout.write(rendered + "\n");
271
601
  console.error("--- END ---");
602
+ const { blocks, fallback } = buildBlockKit(data, opts);
272
603
  return {
273
604
  dryRun: true,
274
- message,
275
- wip: wipItems.length,
276
- blocked: blockedItems.length,
277
- done: doneItems.length,
278
- upNext: upNext.length,
605
+ format: opts.format,
606
+ rendered,
607
+ blocks,
608
+ fallback,
609
+ wip: data.wip.length,
610
+ blocked: data.blocked.length,
611
+ done: data.done.length,
612
+ upNext: data.upNext.length,
279
613
  };
280
614
  }
615
+ // Real post path: a missing webhook is a hard, structured error (exit 1)
616
+ // rather than a crash or silent success. Use --dry-run to preview.
617
+ if (!webhookUrl) {
618
+ throw new CommandError("No Slack webhook configured. Set PM_SLACK_WEBHOOK or pass --webhook <url>, " +
619
+ "or use --dry-run to preview the message without posting.", EXIT_CODE.GENERIC_FAILURE);
620
+ }
621
+ const { blocks, fallback } = buildBlockKit(data, opts);
281
622
  try {
282
- await postToSlack(webhookUrl, message);
623
+ await postToSlack(webhookUrl, { text: fallback, blocks, mrkdwn: true });
283
624
  }
284
625
  catch (err) {
285
- // Rethrow with a numeric exitCode so the runtime exits non-zero and
286
- // runs the handler exactly once (a plain Error re-invokes it).
287
- throw new CommandError(err instanceof Error ? err.message : String(err));
626
+ throw new CommandError(`Slack post failed: ${err instanceof Error ? err.message : String(err)}`, EXIT_CODE.GENERIC_FAILURE);
288
627
  }
289
628
  return {
290
629
  posted: true,
291
- wip: wipItems.length,
292
- blocked: blockedItems.length,
293
- done: doneItems.length,
294
- upNext: upNext.length,
630
+ channel: opts.channel,
631
+ wip: data.wip.length,
632
+ blocked: data.blocked.length,
633
+ done: data.done.length,
634
+ upNext: data.upNext.length,
295
635
  };
296
636
  },
297
637
  });
638
+ // -----------------------------------------------------------------------
639
+ // Exporter: standup → `pm standup export`
640
+ // Writes the standup to a file (or stdout) as Markdown or JSON. JSON emits
641
+ // the full Block Kit payload so it can be POSTed elsewhere or archived.
642
+ // (No collision with the `pm standup` command — different invocation.)
643
+ // -----------------------------------------------------------------------
644
+ api.registerExporter("standup", async (ctx) => {
645
+ const rawFormat = (readStrOption(ctx.options, "format") ?? "md").toLowerCase();
646
+ // For the exporter, --format selects the file format (md|json); the text
647
+ // rendering is always markdown. We resolve options with markdown rather
648
+ // than routing the exporter's md|json through the command's --format
649
+ // validator (which only knows slack|blockkit|markdown|plain).
650
+ const fileFormat = rawFormat === "json" ? "json" : "md";
651
+ const { opts, sinceMs } = resolveStandupOptions(ctx.options, "markdown");
652
+ const exportOpts = opts;
653
+ const items = fetchAllItems(ctx.pm_root);
654
+ const data = buildStandupData(items, exportOpts, sinceMs);
655
+ let output;
656
+ if (fileFormat === "json") {
657
+ const { blocks, fallback } = buildBlockKit(data, opts);
658
+ output = JSON.stringify({
659
+ date: todayISO(),
660
+ channel: opts.channel,
661
+ since: opts.since,
662
+ groupBy: opts.groupBy,
663
+ sections: opts.sections,
664
+ counts: {
665
+ wip: data.wip.length,
666
+ blocked: data.blocked.length,
667
+ done: data.done.length,
668
+ upNext: data.upNext.length,
669
+ total: data.total,
670
+ },
671
+ sections_data: {
672
+ in_progress: data.wip,
673
+ blocked: data.blocked,
674
+ up_next: data.upNext,
675
+ done: data.done,
676
+ },
677
+ slack: { text: fallback, blocks },
678
+ }, null, 2);
679
+ }
680
+ else {
681
+ output = buildTextMessage(data, exportOpts);
682
+ }
683
+ const outputPath = readStrOption(ctx.options, "output");
684
+ if (outputPath) {
685
+ const absolutePath = resolve(outputPath);
686
+ writeFileSync(absolutePath, output + "\n", "utf-8");
687
+ console.error(`standup export: wrote ${data.total} item(s) as ${fileFormat} to ${absolutePath}`);
688
+ return { exported: data.total, format: fileFormat, file: absolutePath };
689
+ }
690
+ console.log(output);
691
+ console.error(`standup export: rendered ${data.total} item(s) as ${fileFormat}.`);
692
+ return { exported: data.total, format: fileFormat, output };
693
+ });
298
694
  },
299
695
  });
300
696
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/manifest.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "pm-slack-standup",
3
- "version": "2026.6.1",
3
+ "version": "2026.6.3",
4
4
  "description": "Post pm context as a Slack standup message",
5
5
  "author": "@unbraind",
6
6
  "entry": "./dist/index.js",
7
7
  "priority": 50,
8
8
  "capabilities": [
9
9
  "commands",
10
- "schema"
10
+ "schema",
11
+ "importers"
11
12
  ],
12
13
  "pm": {
13
14
  "compatibility": "v2"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pm-slack-standup",
3
- "version": "2026.6.1",
3
+ "version": "2026.6.3",
4
4
  "description": "Post pm context as a Slack standup message",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,12 +35,12 @@
35
35
  "release:check": "npm run typecheck && npm run build && npm run audit:prod && npm run pack:dry-run && npm run changelog:check"
36
36
  },
37
37
  "peerDependencies": {
38
- "@unbrained/pm-cli": ">=2026.5.29"
38
+ "@unbrained/pm-cli": ">=2026.5.31"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^25.9.1",
42
- "@unbrained/pm-cli": "^2026.5.29",
43
- "pm-changelog": "^2026.5.29-2",
42
+ "@unbrained/pm-cli": "^2026.5.31",
43
+ "pm-changelog": "^2026.6.2",
44
44
  "typescript": "^6.0.3"
45
45
  },
46
46
  "keywords": [