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 +24 -1
- package/README.md +63 -16
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +550 -154
- package/dist/index.js.map +1 -1
- package/manifest.json +3 -2
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 2026.6.
|
|
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,
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
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
|
|
60
|
-
| `--dry-run` | boolean | `false` |
|
|
61
|
-
| `--
|
|
62
|
-
| `--
|
|
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
|
|
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
|
|
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.
|
|
156
|
-
2. Sorts
|
|
157
|
-
3.
|
|
158
|
-
4.
|
|
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;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;
|
|
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
|
-
//
|
|
194
|
+
// Data fetch
|
|
64
195
|
// ---------------------------------------------------------------------------
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
204
|
+
console.error(`pm list-all failed: ${result.stderr ?? result.error?.message ?? ""}`);
|
|
69
205
|
return [];
|
|
70
206
|
}
|
|
71
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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(
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
143
|
-
lines.push(itemLine(item, format));
|
|
429
|
+
return parts.join("\n");
|
|
144
430
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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(
|
|
512
|
+
"Content-Length": Buffer.byteLength(body),
|
|
174
513
|
},
|
|
175
514
|
};
|
|
176
515
|
const req = https.request(options, (res) => {
|
|
177
|
-
let
|
|
178
|
-
res.on("data", (chunk) => (
|
|
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
|
-
|
|
520
|
+
resolvePromise();
|
|
182
521
|
}
|
|
183
522
|
else {
|
|
184
|
-
reject(new Error(`Slack webhook returned HTTP ${res.statusCode ?? "unknown"}: ${
|
|
523
|
+
reject(new Error(`Slack webhook returned HTTP ${res.statusCode ?? "unknown"}: ${respBody}`));
|
|
185
524
|
}
|
|
186
525
|
});
|
|
187
526
|
});
|
|
188
|
-
req.on("error", (err) => {
|
|
189
|
-
|
|
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.
|
|
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 --
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
|
246
|
-
const
|
|
247
|
-
const
|
|
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
|
-
|
|
270
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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,
|
|
623
|
+
await postToSlack(webhookUrl, { text: fallback, blocks, mrkdwn: true });
|
|
283
624
|
}
|
|
284
625
|
catch (err) {
|
|
285
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
43
|
-
"pm-changelog": "^2026.
|
|
42
|
+
"@unbrained/pm-cli": "^2026.5.31",
|
|
43
|
+
"pm-changelog": "^2026.6.2",
|
|
44
44
|
"typescript": "^6.0.3"
|
|
45
45
|
},
|
|
46
46
|
"keywords": [
|