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