pm-gantt-chart 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +112 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +314 -0
- package/dist/index.js.map +1 -0
- package/manifest.json +16 -0
- package/package.json +90 -0
package/CHANGELOG.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# pm-gantt-chart-chart
|
|
2
|
+
|
|
3
|
+
ASCII Gantt chart renderer for [pm-cli](https://github.com/unbraind/pm-cli).
|
|
4
|
+
|
|
5
|
+
Renders your pm items as a week-by-week timeline in the terminal, grouped by milestone, tag, or type.
|
|
6
|
+
|
|
7
|
+
## Example output
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
pm gantt • 8 weeks from 2026-05-09
|
|
11
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
12
|
+
GROUP ITEM S W1 W2 W3 W4 W5 W6 W7 W8
|
|
13
|
+
────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
May 11 May 18 May 25 Jun 1 Jun 8 Jun 15 Jun 22 Jun 29
|
|
15
|
+
────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
|
16
|
+
v1.0 Milestone Auth system ▶ ██ ██ ░░ ░░
|
|
17
|
+
User profile ○ ░░ ░░ ░░
|
|
18
|
+
v2.0 Milestone API redesign ▶ ██ ██ ██
|
|
19
|
+
(no milestone) Fix typos ○ ·· ·· ·· ·· ·· ·· ·· ··
|
|
20
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
21
|
+
Legend: ██ wip/blocked ░░ todo/planned ·· undated S: ▶wip !blocked ✓done ○todo
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
pm ext install unbraind/pm-gantt-chart-chart
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or from a local clone:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
pm ext install ./path/to/pm-cli-ext-gantt
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
# Default: 8 weeks, grouped by milestone, all statuses
|
|
40
|
+
pm gantt
|
|
41
|
+
|
|
42
|
+
# Show 12 weeks
|
|
43
|
+
pm gantt --weeks 12
|
|
44
|
+
|
|
45
|
+
# Group by tag
|
|
46
|
+
pm gantt --group-by tag
|
|
47
|
+
|
|
48
|
+
# Group by item type
|
|
49
|
+
pm gantt --group-by type
|
|
50
|
+
|
|
51
|
+
# Show only in-progress items
|
|
52
|
+
pm gantt --status wip
|
|
53
|
+
|
|
54
|
+
# Show only todo items for the next 16 weeks
|
|
55
|
+
pm gantt --status todo --weeks 16
|
|
56
|
+
|
|
57
|
+
# Show only blocked items grouped by tag
|
|
58
|
+
pm gantt --status blocked --group-by tag
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Options
|
|
62
|
+
|
|
63
|
+
| Flag | Values | Default | Description |
|
|
64
|
+
|------|--------|---------|-------------|
|
|
65
|
+
| `--weeks <n>` | 1–52 | `8` | Number of weeks to display in the chart |
|
|
66
|
+
| `--group-by <field>` | `milestone` \| `tag` \| `type` | `milestone` | How to group items into rows |
|
|
67
|
+
| `--status <filter>` | `todo` \| `wip` \| `blocked` \| `done` \| `all` | `all` | Filter items by status |
|
|
68
|
+
|
|
69
|
+
## How it works
|
|
70
|
+
|
|
71
|
+
- **Columns** — each column represents one calendar week, starting from the Monday of the current week
|
|
72
|
+
- **Rows** — items are grouped by the chosen field (milestone, tag, or type); items with no value go to a `(no milestone)` / `(no tag)` / `(no type)` group
|
|
73
|
+
- **Bars** — the bar spans from the item's creation date to its `due_date`. If only a due date is known, a one-week bar ending on that date is shown. Items with no dates at all are shown as `··` (undated) across all columns
|
|
74
|
+
- **Symbols** — `██` = wip or blocked (active work), `░░` = todo/planned, `··` = undated
|
|
75
|
+
|
|
76
|
+
## Item fields used
|
|
77
|
+
|
|
78
|
+
| Field | Used for |
|
|
79
|
+
|-------|----------|
|
|
80
|
+
| `title` | Row label |
|
|
81
|
+
| `status` | Bar style and status symbol; also used with `--status` filter |
|
|
82
|
+
| `due_date` | Right edge of the bar |
|
|
83
|
+
| `created_at` | Left edge of the bar |
|
|
84
|
+
| `milestone` | Group key when `--group-by milestone` (default) |
|
|
85
|
+
| `tags[0]` | Group key when `--group-by tag` |
|
|
86
|
+
| `type` | Group key when `--group-by type` |
|
|
87
|
+
|
|
88
|
+
## Development
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
# Install dev dependencies
|
|
92
|
+
npm install
|
|
93
|
+
|
|
94
|
+
# Build TypeScript → dist/
|
|
95
|
+
npm run build
|
|
96
|
+
|
|
97
|
+
# Load the built extension locally in pm-cli
|
|
98
|
+
pm ext install .
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Requirements
|
|
102
|
+
|
|
103
|
+
- pm-cli `>=2026.5.0`
|
|
104
|
+
- Node.js `>=18`
|
|
105
|
+
|
|
106
|
+
## License
|
|
107
|
+
|
|
108
|
+
MIT
|
|
109
|
+
|
|
110
|
+
## Release Automation
|
|
111
|
+
|
|
112
|
+
This package is release-ready for GitHub, npm, and Bun-compatible installs. CI runs type checking, build, production dependency audit, package packing, Bun install verification, and pm-changelog validation. The daily release workflow publishes only when commits exist after the latest release tag and uses pm-changelog to generate CHANGELOG.md and GitHub release notes.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiE,YAAY,EAAG,MAAM,uBAAuB,CAAC;;;;kBAsR1G,YAAY;;AAJ5B,wBAmKG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
const defineExtension = ((extension) => extension);
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Date helpers
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/** Returns the Monday of the week containing `d`. */
|
|
7
|
+
function weekStart(d) {
|
|
8
|
+
const day = d.getDay(); // 0=Sun … 6=Sat
|
|
9
|
+
const diff = day === 0 ? -6 : 1 - day; // shift to Monday
|
|
10
|
+
const mon = new Date(d);
|
|
11
|
+
mon.setHours(0, 0, 0, 0);
|
|
12
|
+
mon.setDate(d.getDate() + diff);
|
|
13
|
+
return mon;
|
|
14
|
+
}
|
|
15
|
+
/** Adds `n` weeks (7 * n days) to `d`. */
|
|
16
|
+
function addWeeks(d, n) {
|
|
17
|
+
const result = new Date(d);
|
|
18
|
+
result.setDate(result.getDate() + n * 7);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
/** Short label for the week starting on `d`: "May 11", "Jun 2", etc. */
|
|
22
|
+
function weekLabel(d) {
|
|
23
|
+
const months = [
|
|
24
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
25
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
26
|
+
];
|
|
27
|
+
const m = months[d.getMonth()];
|
|
28
|
+
const day = String(d.getDate()).padStart(2, " ");
|
|
29
|
+
return `${m} ${day}`;
|
|
30
|
+
}
|
|
31
|
+
/** Parse an ISO date string into a Date (midnight UTC treated as local). */
|
|
32
|
+
function parseDate(s) {
|
|
33
|
+
if (!s)
|
|
34
|
+
return null;
|
|
35
|
+
// Accept "YYYY-MM-DD" or full ISO
|
|
36
|
+
const d = new Date(s.length === 10 ? s + "T00:00:00" : s);
|
|
37
|
+
return isNaN(d.getTime()) ? null : d;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Given a date range [start, end] and the chart window [windowStart, windowEnd),
|
|
41
|
+
* compute the 0-based week indices that are "active" for this item.
|
|
42
|
+
* Returns { firstActive, lastActive } or null if the item is outside the window.
|
|
43
|
+
*/
|
|
44
|
+
function computeWeekRange(itemStart, itemEnd, windowStart, totalWeeks) {
|
|
45
|
+
const windowEnd = addWeeks(windowStart, totalWeeks);
|
|
46
|
+
// If both dates are absent → undated
|
|
47
|
+
if (!itemStart && !itemEnd)
|
|
48
|
+
return null;
|
|
49
|
+
// Clamp: if only one date is known, use a 1-week span
|
|
50
|
+
const effectiveStart = itemStart ?? (itemEnd ? addWeeks(itemEnd, -1) : windowStart);
|
|
51
|
+
const effectiveEnd = itemEnd ?? (itemStart ? addWeeks(itemStart, 1) : windowEnd);
|
|
52
|
+
// Check if this item overlaps the window at all
|
|
53
|
+
if (effectiveEnd <= windowStart || effectiveStart >= windowEnd) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const clampedStart = effectiveStart < windowStart ? windowStart : effectiveStart;
|
|
57
|
+
const clampedEnd = effectiveEnd > windowEnd ? windowEnd : effectiveEnd;
|
|
58
|
+
const firstActive = Math.floor((clampedStart.getTime() - windowStart.getTime()) / (7 * 24 * 60 * 60 * 1000));
|
|
59
|
+
// lastActive: the last week that has any overlap (end is exclusive, so subtract 1 ms)
|
|
60
|
+
const lastActive = Math.max(firstActive, Math.floor((clampedEnd.getTime() - windowStart.getTime() - 1) /
|
|
61
|
+
(7 * 24 * 60 * 60 * 1000)));
|
|
62
|
+
return {
|
|
63
|
+
firstActive: Math.max(0, firstActive),
|
|
64
|
+
lastActive: Math.min(totalWeeks - 1, lastActive),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Grouping
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
function getGroupKey(item, groupBy) {
|
|
71
|
+
switch (groupBy) {
|
|
72
|
+
case "milestone":
|
|
73
|
+
return item.milestone?.trim() || "(no milestone)";
|
|
74
|
+
case "tag":
|
|
75
|
+
return item.tags && item.tags.length > 0
|
|
76
|
+
? item.tags[0]
|
|
77
|
+
: "(no tag)";
|
|
78
|
+
case "type":
|
|
79
|
+
return item.type?.trim() || "(no type)";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Rendering
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
const BLOCK_ACTIVE = "██";
|
|
86
|
+
const BLOCK_PLANNED = "░░";
|
|
87
|
+
const BLOCK_UNDATED = "··";
|
|
88
|
+
const COL_SEP = " ";
|
|
89
|
+
function statusSymbol(status) {
|
|
90
|
+
switch (status) {
|
|
91
|
+
case "in_progress": return "▶";
|
|
92
|
+
case "blocked": return "!";
|
|
93
|
+
case "closed": return "✓";
|
|
94
|
+
case "canceled": return "✗";
|
|
95
|
+
default: return "○";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function renderGantt(rows, opts, windowStart) {
|
|
99
|
+
const { weeks } = opts;
|
|
100
|
+
// Build week header labels
|
|
101
|
+
const weekLabels = [];
|
|
102
|
+
for (let w = 0; w < weeks; w++) {
|
|
103
|
+
weekLabels.push(weekLabel(addWeeks(windowStart, w)));
|
|
104
|
+
}
|
|
105
|
+
// Column widths
|
|
106
|
+
const COL_GROUP = 18;
|
|
107
|
+
const COL_ITEM = 24;
|
|
108
|
+
const COL_ST = 2; // status symbol
|
|
109
|
+
const WEEK_COL = 6; // "May 11" = 6 chars
|
|
110
|
+
const totalWidth = COL_GROUP + 2 + COL_ITEM + 2 + COL_ST + 2 +
|
|
111
|
+
weeks * (WEEK_COL + COL_SEP.length);
|
|
112
|
+
const lines = [];
|
|
113
|
+
// Title line
|
|
114
|
+
const todayStr = opts.today.toISOString().slice(0, 10);
|
|
115
|
+
lines.push(`pm gantt • ${weeks} weeks from ${todayStr}`);
|
|
116
|
+
lines.push("━".repeat(Math.min(totalWidth, 90)));
|
|
117
|
+
// Header
|
|
118
|
+
const groupHeader = "GROUP".padEnd(COL_GROUP);
|
|
119
|
+
const itemHeader = "ITEM".padEnd(COL_ITEM);
|
|
120
|
+
const stHeader = " S";
|
|
121
|
+
const weekHeaderCols = weekLabels
|
|
122
|
+
.map((_, i) => `W${i + 1}`.padEnd(WEEK_COL))
|
|
123
|
+
.join(COL_SEP);
|
|
124
|
+
lines.push(`${groupHeader} ${itemHeader} ${stHeader} ${weekHeaderCols}`);
|
|
125
|
+
lines.push("─".repeat(Math.min(totalWidth, 90)));
|
|
126
|
+
// Week sub-header (actual dates)
|
|
127
|
+
const weekDateCols = weekLabels
|
|
128
|
+
.map((l) => l.padEnd(WEEK_COL))
|
|
129
|
+
.join(COL_SEP);
|
|
130
|
+
lines.push(`${"".padEnd(COL_GROUP)} ${"".padEnd(COL_ITEM)} ${"".padEnd(COL_ST)} ${weekDateCols}`);
|
|
131
|
+
lines.push("─".repeat(Math.min(totalWidth, 90)));
|
|
132
|
+
// Rows — track last group to only print group name on first row
|
|
133
|
+
let lastGroup = "";
|
|
134
|
+
for (const row of rows) {
|
|
135
|
+
const { group, item } = row;
|
|
136
|
+
// Group label: only show for first item in group
|
|
137
|
+
const groupLabel = group !== lastGroup
|
|
138
|
+
? group.slice(0, COL_GROUP).padEnd(COL_GROUP)
|
|
139
|
+
: "".padEnd(COL_GROUP);
|
|
140
|
+
lastGroup = group;
|
|
141
|
+
// Item title (truncated)
|
|
142
|
+
const itemLabel = item.title.slice(0, COL_ITEM).padEnd(COL_ITEM);
|
|
143
|
+
// Status symbol
|
|
144
|
+
const st = statusSymbol(item.status);
|
|
145
|
+
// Gantt cells
|
|
146
|
+
const cells = [];
|
|
147
|
+
if (row.startWeek === null) {
|
|
148
|
+
// Undated item
|
|
149
|
+
for (let w = 0; w < weeks; w++) {
|
|
150
|
+
cells.push(BLOCK_UNDATED.padEnd(WEEK_COL));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
for (let w = 0; w < weeks; w++) {
|
|
155
|
+
if (w >= row.startWeek && w <= (row.endWeek ?? row.startWeek)) {
|
|
156
|
+
// Active: use different block for in_progress/blocked vs open
|
|
157
|
+
const block = item.status === "in_progress" || item.status === "blocked"
|
|
158
|
+
? BLOCK_ACTIVE
|
|
159
|
+
: BLOCK_PLANNED;
|
|
160
|
+
cells.push(block.padEnd(WEEK_COL));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
cells.push(" ".padEnd(WEEK_COL)); // empty
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
lines.push(`${groupLabel} ${itemLabel} ${st} ${cells.join(COL_SEP)}`);
|
|
168
|
+
}
|
|
169
|
+
lines.push("━".repeat(Math.min(totalWidth, 90)));
|
|
170
|
+
// Legend
|
|
171
|
+
lines.push(`Legend: ${BLOCK_ACTIVE} in_progress/blocked ${BLOCK_PLANNED} open/planned ${BLOCK_UNDATED} undated ` +
|
|
172
|
+
`S: ▶in_progress !blocked ✓closed ○open`);
|
|
173
|
+
return lines.join("\n");
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// Extension entry point
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
export default defineExtension({
|
|
179
|
+
name: "pm-gantt-chart-chart",
|
|
180
|
+
version: "0.1.0",
|
|
181
|
+
activate(api) {
|
|
182
|
+
api.registerCommand({
|
|
183
|
+
name: "gantt",
|
|
184
|
+
description: "Render pm items as an ASCII Gantt chart",
|
|
185
|
+
intent: "visualize project timeline week-by-week in the terminal",
|
|
186
|
+
examples: [
|
|
187
|
+
"pm gantt",
|
|
188
|
+
"pm gantt --weeks 12",
|
|
189
|
+
"pm gantt --group-by tag",
|
|
190
|
+
"pm gantt --group-by type --weeks 6",
|
|
191
|
+
"pm gantt --status in_progress",
|
|
192
|
+
"pm gantt --status open --weeks 16",
|
|
193
|
+
],
|
|
194
|
+
flags: [
|
|
195
|
+
{
|
|
196
|
+
long: "--weeks",
|
|
197
|
+
value_name: "n",
|
|
198
|
+
description: "Number of weeks to show (default: 8)",
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
long: "--group-by",
|
|
202
|
+
value_name: "field",
|
|
203
|
+
description: "Group items by: milestone | tag | type (default: milestone)",
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
long: "--status",
|
|
207
|
+
value_name: "filter",
|
|
208
|
+
description: "Filter by status: open | in_progress | blocked | closed | canceled | draft | all (default: all)",
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
async run(ctx) {
|
|
212
|
+
// --- Parse flags ---
|
|
213
|
+
const rawWeeks = ctx.options["weeks"];
|
|
214
|
+
const weeks = rawWeeks ? Math.max(1, Math.min(52, parseInt(String(rawWeeks), 10))) : 8;
|
|
215
|
+
const rawGroupBy = ctx.options["group-by"] ?? "milestone";
|
|
216
|
+
const groupBy = ["milestone", "tag", "type"].includes(String(rawGroupBy))
|
|
217
|
+
? String(rawGroupBy)
|
|
218
|
+
: "milestone";
|
|
219
|
+
const rawStatus = ctx.options["status"] ?? "all";
|
|
220
|
+
const statusFilter = [
|
|
221
|
+
"open", "in_progress", "blocked", "closed", "canceled", "draft", "all",
|
|
222
|
+
].includes(String(rawStatus))
|
|
223
|
+
? String(rawStatus)
|
|
224
|
+
: "all";
|
|
225
|
+
// --- Fetch items ---
|
|
226
|
+
const result = spawnSync("pm", ["--path", ctx.pm_root, "list-all", "--json"], { encoding: "utf-8" });
|
|
227
|
+
if (result.error || result.status !== 0) {
|
|
228
|
+
return { error: "Failed to fetch pm items", details: result.stderr };
|
|
229
|
+
}
|
|
230
|
+
const allItems = JSON.parse(result.stdout).items ?? [];
|
|
231
|
+
if (allItems.length === 0) {
|
|
232
|
+
console.error("No pm items found. Add some items first.");
|
|
233
|
+
return { chart: null, itemCount: 0 };
|
|
234
|
+
}
|
|
235
|
+
// --- Filter by status ---
|
|
236
|
+
const items = statusFilter === "all"
|
|
237
|
+
? allItems
|
|
238
|
+
: allItems.filter((i) => i.status === statusFilter);
|
|
239
|
+
if (items.length === 0) {
|
|
240
|
+
console.error(`No items with status "${statusFilter}". Try --status all.`);
|
|
241
|
+
return { chart: null, itemCount: 0, warning: `No items with status "${statusFilter}"` };
|
|
242
|
+
}
|
|
243
|
+
// --- Build opts ---
|
|
244
|
+
const today = new Date();
|
|
245
|
+
today.setHours(0, 0, 0, 0);
|
|
246
|
+
const windowStart = weekStart(today);
|
|
247
|
+
const opts = {
|
|
248
|
+
weeks,
|
|
249
|
+
groupBy,
|
|
250
|
+
statusFilter,
|
|
251
|
+
today,
|
|
252
|
+
};
|
|
253
|
+
// --- Group items ---
|
|
254
|
+
const groupMap = new Map();
|
|
255
|
+
for (const item of items) {
|
|
256
|
+
const key = getGroupKey(item, groupBy);
|
|
257
|
+
if (!groupMap.has(key))
|
|
258
|
+
groupMap.set(key, []);
|
|
259
|
+
groupMap.get(key).push(item);
|
|
260
|
+
}
|
|
261
|
+
// Sort groups: named groups first (alphabetically), then fallback "(no *)" groups
|
|
262
|
+
const sortedGroups = [...groupMap.keys()].sort((a, b) => {
|
|
263
|
+
const aFallback = a.startsWith("(no ");
|
|
264
|
+
const bFallback = b.startsWith("(no ");
|
|
265
|
+
if (aFallback && !bFallback)
|
|
266
|
+
return 1;
|
|
267
|
+
if (!aFallback && bFallback)
|
|
268
|
+
return -1;
|
|
269
|
+
return a.localeCompare(b);
|
|
270
|
+
});
|
|
271
|
+
// --- Build rows ---
|
|
272
|
+
const rows = [];
|
|
273
|
+
for (const group of sortedGroups) {
|
|
274
|
+
const groupItems = groupMap.get(group);
|
|
275
|
+
// Sort items within group: in_progress first, then open, then blocked, then closed
|
|
276
|
+
const statusOrder = {
|
|
277
|
+
in_progress: 0,
|
|
278
|
+
open: 1,
|
|
279
|
+
blocked: 2,
|
|
280
|
+
closed: 3,
|
|
281
|
+
canceled: 4,
|
|
282
|
+
draft: 5,
|
|
283
|
+
};
|
|
284
|
+
groupItems.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);
|
|
285
|
+
for (const item of groupItems) {
|
|
286
|
+
// Compute week range from created_at → due_date
|
|
287
|
+
const itemStart = item.created_at ? parseDate(item.created_at) : null;
|
|
288
|
+
const itemEnd = item.due_date ? parseDate(item.due_date) : null;
|
|
289
|
+
const range = computeWeekRange(itemStart, itemEnd, windowStart, weeks);
|
|
290
|
+
rows.push({
|
|
291
|
+
group,
|
|
292
|
+
item,
|
|
293
|
+
startWeek: range?.firstActive ?? null,
|
|
294
|
+
endWeek: range?.lastActive ?? null,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// --- Render ---
|
|
299
|
+
const chart = renderGantt(rows, opts, windowStart);
|
|
300
|
+
// Print to stdout
|
|
301
|
+
process.stdout.write(chart + "\n");
|
|
302
|
+
return {
|
|
303
|
+
chart,
|
|
304
|
+
itemCount: items.length,
|
|
305
|
+
groupCount: sortedGroups.length,
|
|
306
|
+
weeks,
|
|
307
|
+
groupBy,
|
|
308
|
+
statusFilter,
|
|
309
|
+
};
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,eAAe,GAA+B,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,SAAS,CAAQ,CAAC;AAqC3F,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,qDAAqD;AACrD,SAAS,SAAS,CAAC,CAAO;IACxB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,gBAAgB;IACxC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,kBAAkB;IACzD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0CAA0C;AAC1C,SAAS,QAAQ,CAAC,CAAO,EAAE,CAAS;IAClC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yEAAyE;AACzE,SAAS,SAAS,CAAC,CAAO;IACxB,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;QACxC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;KACzC,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,4EAA4E;AAC5E,SAAS,SAAS,CAAC,CAAS;IAC1B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,kCAAkC;IAClC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,SAAsB,EACtB,OAAoB,EACpB,WAAiB,EACjB,UAAkB;IAElB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAEpD,qCAAqC;IACrC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAExC,sDAAsD;IACtD,MAAM,cAAc,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjF,gDAAgD;IAChD,IAAI,YAAY,IAAI,WAAW,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IACjF,MAAM,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;IAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAC7E,CAAC;IACF,sFAAsF;IACtF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,WAAW,EACX,IAAI,CAAC,KAAK,CACR,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAC5B,CACF,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,UAAU,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,SAAS,WAAW,CAAC,IAAY,EAAE,OAAgB;IACjD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC;QACpD,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,UAAU,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,OAAO,GAAG,IAAI,CAAC;AAErB,SAAS,YAAY,CAAC,MAAwB;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa,CAAC,CAAC,OAAO,GAAG,CAAC;QAC/B,KAAK,SAAS,CAAC,CAAK,OAAO,GAAG,CAAC;QAC/B,KAAK,QAAQ,CAAC,CAAM,OAAO,GAAG,CAAC;QAC/B,KAAK,UAAU,CAAC,CAAI,OAAO,GAAG,CAAC;QAC/B,OAAO,CAAC,CAAY,OAAO,GAAG,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,IAAgB,EAChB,IAAkB,EAClB,WAAiB;IAEjB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,2BAA2B;IAC3B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,gBAAgB;IAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,qBAAqB;IAEzC,MAAM,UAAU,GACd,SAAS,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC;QACzC,KAAK,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,aAAa;IACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,eAAe,QAAQ,EAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,SAAS;IACT,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC;IACtB,MAAM,cAAc,GAAG,UAAU;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC3C,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CACR,GAAG,WAAW,KAAK,UAAU,KAAK,QAAQ,KAAK,cAAc,EAAE,CAChE,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,iCAAiC;IACjC,MAAM,YAAY,GAAG,UAAU;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SAC9B,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,YAAY,EAAE,CACzF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,gEAAgE;IAChE,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QAE5B,iDAAiD;QACjD,MAAM,UAAU,GACd,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YAC7C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,SAAS,GAAG,KAAK,CAAC;QAElB,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjE,gBAAgB;QAChB,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErC,cAAc;QACd,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC3B,eAAe;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9D,8DAA8D;oBAC9D,MAAM,KAAK,GACT,IAAI,CAAC,MAAM,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;wBACxD,CAAC,CAAC,YAAY;wBACd,CAAC,CAAC,aAAa,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,KAAK,SAAS,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjD,SAAS;IACT,KAAK,CAAC,IAAI,CACR,WAAW,YAAY,yBAAyB,aAAa,kBAAkB,aAAa,YAAY;QACtG,2CAA2C,CAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,eAAe,eAAe,CAAC;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,OAAO,EAAE,OAAO;IAEhB,QAAQ,CAAC,GAAiB;QACxB,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,yCAAyC;YACtD,MAAM,EAAE,yDAAyD;YACjE,QAAQ,EAAE;gBACR,UAAU;gBACV,qBAAqB;gBACrB,yBAAyB;gBACzB,oCAAoC;gBACpC,+BAA+B;gBAC/B,mCAAmC;aACpC;YACD,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,GAAG;oBACf,WAAW,EAAE,sCAAsC;iBACpD;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,UAAU,EAAE,OAAO;oBACnB,WAAW,EACT,6DAA6D;iBAChE;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,UAAU,EAAE,QAAQ;oBACpB,WAAW,EACT,iGAAiG;iBACpG;aACF;YAED,KAAK,CAAC,GAAG,CAAC,GAA0B;gBAClC,sBAAsB;gBACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEvF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC;gBAC1D,MAAM,OAAO,GAAY,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAChF,CAAC,CAAE,MAAM,CAAC,UAAU,CAAa;oBACjC,CAAC,CAAC,WAAW,CAAC;gBAEhB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;gBACjD,MAAM,YAAY,GAAiB;oBACjC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK;iBACvE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC3B,CAAC,CAAE,MAAM,CAAC,SAAS,CAAkB;oBACrC,CAAC,CAAC,KAAK,CAAC;gBAEV,sBAAsB;gBACtB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBACrG,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxC,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvE,CAAC;gBACD,MAAM,QAAQ,GAAa,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAEjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;oBAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;gBACvC,CAAC;gBAED,2BAA2B;gBAC3B,MAAM,KAAK,GACT,YAAY,KAAK,KAAK;oBACpB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;gBAExD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,yBAAyB,YAAY,sBAAsB,CAAC,CAAC;oBAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,YAAY,GAAG,EAAE,CAAC;gBAC1F,CAAC;gBAED,qBAAqB;gBACrB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;gBACzB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;gBAErC,MAAM,IAAI,GAAiB;oBACzB,KAAK;oBACL,OAAO;oBACP,YAAY;oBACZ,KAAK;iBACN,CAAC;gBAEF,sBAAsB;gBACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;gBAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;gBAED,kFAAkF;gBAClF,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACtD,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBACvC,MAAM,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,SAAS,IAAI,CAAC,SAAS;wBAAE,OAAO,CAAC,CAAC;oBACtC,IAAI,CAAC,SAAS,IAAI,SAAS;wBAAE,OAAO,CAAC,CAAC,CAAC;oBACvC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBAEH,qBAAqB;gBACrB,MAAM,IAAI,GAAe,EAAE,CAAC;gBAE5B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;oBAExC,mFAAmF;oBACnF,MAAM,WAAW,GAAqC;wBACpD,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,CAAC;wBACV,MAAM,EAAE,CAAC;wBACT,QAAQ,EAAE,CAAC;wBACX,KAAK,EAAE,CAAC;qBACT,CAAC;oBACF,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CACxD,CAAC;oBAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;wBAC9B,gDAAgD;wBAChD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBACtE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAEhE,MAAM,KAAK,GAAG,gBAAgB,CAC5B,SAAS,EACT,OAAO,EACP,WAAW,EACX,KAAK,CACN,CAAC;wBAEF,IAAI,CAAC,IAAI,CAAC;4BACR,KAAK;4BACL,IAAI;4BACJ,SAAS,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;4BACrC,OAAO,EAAE,KAAK,EAAE,UAAU,IAAI,IAAI;yBACnC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,iBAAiB;gBACjB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;gBAEnD,kBAAkB;gBAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;gBAEnC,OAAO;oBACL,KAAK;oBACL,SAAS,EAAE,KAAK,CAAC,MAAM;oBACvB,UAAU,EAAE,YAAY,CAAC,MAAM;oBAC/B,KAAK;oBACL,OAAO;oBACP,YAAY;iBACb,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
package/manifest.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pm-gantt-chart",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "ASCII Gantt chart renderer for pm-cli",
|
|
5
|
+
"author": "@unbraind",
|
|
6
|
+
"entry": "./dist/index.js",
|
|
7
|
+
"priority": 50,
|
|
8
|
+
"capabilities": [
|
|
9
|
+
"commands",
|
|
10
|
+
"schema",
|
|
11
|
+
"renderers"
|
|
12
|
+
],
|
|
13
|
+
"pm": {
|
|
14
|
+
"compatibility": "v2"
|
|
15
|
+
}
|
|
16
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pm-gantt-chart",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "ASCII Gantt chart renderer for pm-cli",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/unbraind/pm-gantt-chart.git"
|
|
8
|
+
},
|
|
9
|
+
"bugs": {
|
|
10
|
+
"url": "https://github.com/unbraind/pm-gantt-chart/issues"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/unbraind/pm-gantt-chart#readme",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"types": "dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/",
|
|
18
|
+
"manifest.json",
|
|
19
|
+
"README.md",
|
|
20
|
+
"CHANGELOG.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"prepublishOnly": "npm run build",
|
|
25
|
+
"prepack": "npm run build",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"check": "npm run typecheck",
|
|
28
|
+
"audit:prod": "npm audit --omit=dev",
|
|
29
|
+
"pack:dry-run": "npm pack --dry-run",
|
|
30
|
+
"changelog": "pm-changelog --pm-root .agents/pm --mode prepend --output CHANGELOG.md --release-version-from-package --since-previous-tag --until-release-tag --item-url-base https://github.com/unbraind/pm-gantt-chart/blob/main/.agents/pm",
|
|
31
|
+
"changelog:full": "pm-changelog --pm-root .agents/pm --mode replace --output CHANGELOG.md --all-release-tags --release-version-from-package --item-url-base https://github.com/unbraind/pm-gantt-chart/blob/main/.agents/pm",
|
|
32
|
+
"changelog:check": "pm-changelog --pm-root .agents/pm --mode replace --output CHANGELOG.md --all-release-tags --release-version-from-package --item-url-base https://github.com/unbraind/pm-gantt-chart/blob/main/.agents/pm --check",
|
|
33
|
+
"release:check": "npm run typecheck && npm run build && npm run audit:prod && npm run pack:dry-run && npm run changelog:check"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"@unbrained/pm-cli": ">=2026.5.24"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@unbrained/pm-cli": "^2026.5.24",
|
|
40
|
+
"typescript": "^6.0.3",
|
|
41
|
+
"pm-changelog": "^2026.5.25",
|
|
42
|
+
"@types/node": "^25.9.1"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"ascii",
|
|
46
|
+
"gantt",
|
|
47
|
+
"pm-cli",
|
|
48
|
+
"pm-cli-extension",
|
|
49
|
+
"pm-extension",
|
|
50
|
+
"pm-package",
|
|
51
|
+
"project-management",
|
|
52
|
+
"timeline"
|
|
53
|
+
],
|
|
54
|
+
"author": "@unbraind",
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=20.0.0"
|
|
58
|
+
},
|
|
59
|
+
"pm": {
|
|
60
|
+
"aliases": [
|
|
61
|
+
"gantt"
|
|
62
|
+
],
|
|
63
|
+
"extensions": [
|
|
64
|
+
"."
|
|
65
|
+
],
|
|
66
|
+
"catalog": {
|
|
67
|
+
"display_name": "Gantt Chart",
|
|
68
|
+
"category": "visualization",
|
|
69
|
+
"summary": "ASCII Gantt chart renderer for pm-cli",
|
|
70
|
+
"tags": [
|
|
71
|
+
"gantt",
|
|
72
|
+
"timeline",
|
|
73
|
+
"planning"
|
|
74
|
+
],
|
|
75
|
+
"links": {
|
|
76
|
+
"docs": "https://github.com/unbraind/pm-gantt-chart#readme",
|
|
77
|
+
"npm": "https://www.npmjs.com/package/pm-gantt-chart",
|
|
78
|
+
"repository": "https://github.com/unbraind/pm-gantt-chart",
|
|
79
|
+
"report": "https://github.com/unbraind/pm-gantt-chart/issues"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"docs": [
|
|
83
|
+
"README.md",
|
|
84
|
+
"CHANGELOG.md"
|
|
85
|
+
],
|
|
86
|
+
"examples": [
|
|
87
|
+
"README.md"
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
}
|