@jbctechsolutions/mcp-office365 2.5.1

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.
Files changed (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +667 -0
  3. package/dist/applescript/account-repository.d.ts +30 -0
  4. package/dist/applescript/account-repository.d.ts.map +1 -0
  5. package/dist/applescript/account-repository.js +38 -0
  6. package/dist/applescript/account-repository.js.map +1 -0
  7. package/dist/applescript/account-scripts.d.ts +21 -0
  8. package/dist/applescript/account-scripts.d.ts.map +1 -0
  9. package/dist/applescript/account-scripts.js +180 -0
  10. package/dist/applescript/account-scripts.js.map +1 -0
  11. package/dist/applescript/calendar-manager.d.ts +44 -0
  12. package/dist/applescript/calendar-manager.d.ts.map +1 -0
  13. package/dist/applescript/calendar-manager.js +92 -0
  14. package/dist/applescript/calendar-manager.js.map +1 -0
  15. package/dist/applescript/calendar-writer.d.ts +36 -0
  16. package/dist/applescript/calendar-writer.d.ts.map +1 -0
  17. package/dist/applescript/calendar-writer.js +94 -0
  18. package/dist/applescript/calendar-writer.js.map +1 -0
  19. package/dist/applescript/content-readers.d.ts +114 -0
  20. package/dist/applescript/content-readers.d.ts.map +1 -0
  21. package/dist/applescript/content-readers.js +328 -0
  22. package/dist/applescript/content-readers.js.map +1 -0
  23. package/dist/applescript/executor.d.ts +60 -0
  24. package/dist/applescript/executor.d.ts.map +1 -0
  25. package/dist/applescript/executor.js +173 -0
  26. package/dist/applescript/executor.js.map +1 -0
  27. package/dist/applescript/index.d.ts +20 -0
  28. package/dist/applescript/index.d.ts.map +1 -0
  29. package/dist/applescript/index.js +29 -0
  30. package/dist/applescript/index.js.map +1 -0
  31. package/dist/applescript/mail-sender.d.ts +38 -0
  32. package/dist/applescript/mail-sender.d.ts.map +1 -0
  33. package/dist/applescript/mail-sender.js +67 -0
  34. package/dist/applescript/mail-sender.js.map +1 -0
  35. package/dist/applescript/parser.d.ts +235 -0
  36. package/dist/applescript/parser.d.ts.map +1 -0
  37. package/dist/applescript/parser.js +496 -0
  38. package/dist/applescript/parser.js.map +1 -0
  39. package/dist/applescript/repository.d.ts +64 -0
  40. package/dist/applescript/repository.d.ts.map +1 -0
  41. package/dist/applescript/repository.js +444 -0
  42. package/dist/applescript/repository.js.map +1 -0
  43. package/dist/applescript/scripts.d.ts +265 -0
  44. package/dist/applescript/scripts.d.ts.map +1 -0
  45. package/dist/applescript/scripts.js +1483 -0
  46. package/dist/applescript/scripts.js.map +1 -0
  47. package/dist/approval/hash.d.ts +87 -0
  48. package/dist/approval/hash.d.ts.map +1 -0
  49. package/dist/approval/hash.js +102 -0
  50. package/dist/approval/hash.js.map +1 -0
  51. package/dist/approval/index.d.ts +13 -0
  52. package/dist/approval/index.d.ts.map +1 -0
  53. package/dist/approval/index.js +7 -0
  54. package/dist/approval/index.js.map +1 -0
  55. package/dist/approval/token-manager.d.ts +51 -0
  56. package/dist/approval/token-manager.d.ts.map +1 -0
  57. package/dist/approval/token-manager.js +111 -0
  58. package/dist/approval/token-manager.js.map +1 -0
  59. package/dist/approval/types.d.ts +44 -0
  60. package/dist/approval/types.d.ts.map +1 -0
  61. package/dist/approval/types.js +6 -0
  62. package/dist/approval/types.js.map +1 -0
  63. package/dist/cli.d.ts +30 -0
  64. package/dist/cli.d.ts.map +1 -0
  65. package/dist/cli.js +143 -0
  66. package/dist/cli.js.map +1 -0
  67. package/dist/config.d.ts +27 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +42 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/database/connection.d.ts +77 -0
  72. package/dist/database/connection.d.ts.map +1 -0
  73. package/dist/database/connection.js +130 -0
  74. package/dist/database/connection.js.map +1 -0
  75. package/dist/database/index.d.ts +11 -0
  76. package/dist/database/index.d.ts.map +1 -0
  77. package/dist/database/index.js +11 -0
  78. package/dist/database/index.js.map +1 -0
  79. package/dist/database/queries.d.ts +93 -0
  80. package/dist/database/queries.d.ts.map +1 -0
  81. package/dist/database/queries.js +430 -0
  82. package/dist/database/queries.js.map +1 -0
  83. package/dist/database/repository.d.ts +198 -0
  84. package/dist/database/repository.d.ts.map +1 -0
  85. package/dist/database/repository.js +199 -0
  86. package/dist/database/repository.js.map +1 -0
  87. package/dist/graph/attachments.d.ts +72 -0
  88. package/dist/graph/attachments.d.ts.map +1 -0
  89. package/dist/graph/attachments.js +207 -0
  90. package/dist/graph/attachments.js.map +1 -0
  91. package/dist/graph/auth/config.d.ts +34 -0
  92. package/dist/graph/auth/config.d.ts.map +1 -0
  93. package/dist/graph/auth/config.js +78 -0
  94. package/dist/graph/auth/config.js.map +1 -0
  95. package/dist/graph/auth/device-code-flow.d.ts +55 -0
  96. package/dist/graph/auth/device-code-flow.d.ts.map +1 -0
  97. package/dist/graph/auth/device-code-flow.js +180 -0
  98. package/dist/graph/auth/device-code-flow.js.map +1 -0
  99. package/dist/graph/auth/index.d.ts +13 -0
  100. package/dist/graph/auth/index.d.ts.map +1 -0
  101. package/dist/graph/auth/index.js +13 -0
  102. package/dist/graph/auth/index.js.map +1 -0
  103. package/dist/graph/auth/token-cache.d.ts +41 -0
  104. package/dist/graph/auth/token-cache.d.ts.map +1 -0
  105. package/dist/graph/auth/token-cache.js +105 -0
  106. package/dist/graph/auth/token-cache.js.map +1 -0
  107. package/dist/graph/client/batch.d.ts +38 -0
  108. package/dist/graph/client/batch.d.ts.map +1 -0
  109. package/dist/graph/client/batch.js +33 -0
  110. package/dist/graph/client/batch.js.map +1 -0
  111. package/dist/graph/client/cache.d.ts +64 -0
  112. package/dist/graph/client/cache.d.ts.map +1 -0
  113. package/dist/graph/client/cache.js +108 -0
  114. package/dist/graph/client/cache.js.map +1 -0
  115. package/dist/graph/client/graph-client.d.ts +630 -0
  116. package/dist/graph/client/graph-client.d.ts.map +1 -0
  117. package/dist/graph/client/graph-client.js +1771 -0
  118. package/dist/graph/client/graph-client.js.map +1 -0
  119. package/dist/graph/client/index.d.ts +12 -0
  120. package/dist/graph/client/index.d.ts.map +1 -0
  121. package/dist/graph/client/index.js +12 -0
  122. package/dist/graph/client/index.js.map +1 -0
  123. package/dist/graph/content-readers.d.ts +106 -0
  124. package/dist/graph/content-readers.d.ts.map +1 -0
  125. package/dist/graph/content-readers.js +321 -0
  126. package/dist/graph/content-readers.js.map +1 -0
  127. package/dist/graph/index.d.ts +18 -0
  128. package/dist/graph/index.d.ts.map +1 -0
  129. package/dist/graph/index.js +23 -0
  130. package/dist/graph/index.js.map +1 -0
  131. package/dist/graph/mailbox-adapter.d.ts +30 -0
  132. package/dist/graph/mailbox-adapter.d.ts.map +1 -0
  133. package/dist/graph/mailbox-adapter.js +59 -0
  134. package/dist/graph/mailbox-adapter.js.map +1 -0
  135. package/dist/graph/mappers/contact-mapper.d.ts +14 -0
  136. package/dist/graph/mappers/contact-mapper.d.ts.map +1 -0
  137. package/dist/graph/mappers/contact-mapper.js +20 -0
  138. package/dist/graph/mappers/contact-mapper.js.map +1 -0
  139. package/dist/graph/mappers/email-mapper.d.ts +14 -0
  140. package/dist/graph/mappers/email-mapper.d.ts.map +1 -0
  141. package/dist/graph/mappers/email-mapper.js +44 -0
  142. package/dist/graph/mappers/email-mapper.js.map +1 -0
  143. package/dist/graph/mappers/event-mapper.d.ts +14 -0
  144. package/dist/graph/mappers/event-mapper.d.ts.map +1 -0
  145. package/dist/graph/mappers/event-mapper.js +31 -0
  146. package/dist/graph/mappers/event-mapper.js.map +1 -0
  147. package/dist/graph/mappers/folder-mapper.d.ts +22 -0
  148. package/dist/graph/mappers/folder-mapper.d.ts.map +1 -0
  149. package/dist/graph/mappers/folder-mapper.js +51 -0
  150. package/dist/graph/mappers/folder-mapper.js.map +1 -0
  151. package/dist/graph/mappers/index.d.ts +16 -0
  152. package/dist/graph/mappers/index.d.ts.map +1 -0
  153. package/dist/graph/mappers/index.js +16 -0
  154. package/dist/graph/mappers/index.js.map +1 -0
  155. package/dist/graph/mappers/task-mapper.d.ts +20 -0
  156. package/dist/graph/mappers/task-mapper.d.ts.map +1 -0
  157. package/dist/graph/mappers/task-mapper.js +27 -0
  158. package/dist/graph/mappers/task-mapper.js.map +1 -0
  159. package/dist/graph/mappers/utils.d.ts +97 -0
  160. package/dist/graph/mappers/utils.d.ts.map +1 -0
  161. package/dist/graph/mappers/utils.js +186 -0
  162. package/dist/graph/mappers/utils.js.map +1 -0
  163. package/dist/graph/repository.d.ts +1104 -0
  164. package/dist/graph/repository.d.ts.map +1 -0
  165. package/dist/graph/repository.js +2999 -0
  166. package/dist/graph/repository.js.map +1 -0
  167. package/dist/index.d.ts +21 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +6052 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/parsers/html-stripper.d.ts +41 -0
  172. package/dist/parsers/html-stripper.d.ts.map +1 -0
  173. package/dist/parsers/html-stripper.js +179 -0
  174. package/dist/parsers/html-stripper.js.map +1 -0
  175. package/dist/parsers/index.d.ts +12 -0
  176. package/dist/parsers/index.d.ts.map +1 -0
  177. package/dist/parsers/index.js +12 -0
  178. package/dist/parsers/index.js.map +1 -0
  179. package/dist/parsers/olk15.d.ts +87 -0
  180. package/dist/parsers/olk15.d.ts.map +1 -0
  181. package/dist/parsers/olk15.js +368 -0
  182. package/dist/parsers/olk15.js.map +1 -0
  183. package/dist/signature.d.ts +22 -0
  184. package/dist/signature.d.ts.map +1 -0
  185. package/dist/signature.js +89 -0
  186. package/dist/signature.js.map +1 -0
  187. package/dist/tools/calendar-permissions.d.ts +79 -0
  188. package/dist/tools/calendar-permissions.d.ts.map +1 -0
  189. package/dist/tools/calendar-permissions.js +121 -0
  190. package/dist/tools/calendar-permissions.js.map +1 -0
  191. package/dist/tools/calendar.d.ts +208 -0
  192. package/dist/tools/calendar.d.ts.map +1 -0
  193. package/dist/tools/calendar.js +247 -0
  194. package/dist/tools/calendar.js.map +1 -0
  195. package/dist/tools/categories.d.ts +94 -0
  196. package/dist/tools/categories.d.ts.map +1 -0
  197. package/dist/tools/categories.js +117 -0
  198. package/dist/tools/categories.js.map +1 -0
  199. package/dist/tools/checklist-items.d.ts +89 -0
  200. package/dist/tools/checklist-items.d.ts.map +1 -0
  201. package/dist/tools/checklist-items.js +140 -0
  202. package/dist/tools/checklist-items.js.map +1 -0
  203. package/dist/tools/contacts.d.ts +94 -0
  204. package/dist/tools/contacts.d.ts.map +1 -0
  205. package/dist/tools/contacts.js +134 -0
  206. package/dist/tools/contacts.js.map +1 -0
  207. package/dist/tools/excel.d.ts +96 -0
  208. package/dist/tools/excel.d.ts.map +1 -0
  209. package/dist/tools/excel.js +165 -0
  210. package/dist/tools/excel.js.map +1 -0
  211. package/dist/tools/focused-overrides.d.ts +70 -0
  212. package/dist/tools/focused-overrides.d.ts.map +1 -0
  213. package/dist/tools/focused-overrides.js +117 -0
  214. package/dist/tools/focused-overrides.js.map +1 -0
  215. package/dist/tools/index.d.ts +22 -0
  216. package/dist/tools/index.d.ts.map +1 -0
  217. package/dist/tools/index.js +34 -0
  218. package/dist/tools/index.js.map +1 -0
  219. package/dist/tools/linked-resources.d.ts +74 -0
  220. package/dist/tools/linked-resources.d.ts.map +1 -0
  221. package/dist/tools/linked-resources.js +122 -0
  222. package/dist/tools/linked-resources.js.map +1 -0
  223. package/dist/tools/mail-rules.d.ts +98 -0
  224. package/dist/tools/mail-rules.d.ts.map +1 -0
  225. package/dist/tools/mail-rules.js +169 -0
  226. package/dist/tools/mail-rules.js.map +1 -0
  227. package/dist/tools/mail-send.d.ts +314 -0
  228. package/dist/tools/mail-send.d.ts.map +1 -0
  229. package/dist/tools/mail-send.js +555 -0
  230. package/dist/tools/mail-send.js.map +1 -0
  231. package/dist/tools/mail.d.ts +127 -0
  232. package/dist/tools/mail.d.ts.map +1 -0
  233. package/dist/tools/mail.js +311 -0
  234. package/dist/tools/mail.js.map +1 -0
  235. package/dist/tools/mailbox-organization.d.ts +301 -0
  236. package/dist/tools/mailbox-organization.d.ts.map +1 -0
  237. package/dist/tools/mailbox-organization.js +541 -0
  238. package/dist/tools/mailbox-organization.js.map +1 -0
  239. package/dist/tools/meetings.d.ts +114 -0
  240. package/dist/tools/meetings.d.ts.map +1 -0
  241. package/dist/tools/meetings.js +110 -0
  242. package/dist/tools/meetings.js.map +1 -0
  243. package/dist/tools/notes.d.ts +74 -0
  244. package/dist/tools/notes.d.ts.map +1 -0
  245. package/dist/tools/notes.js +136 -0
  246. package/dist/tools/notes.js.map +1 -0
  247. package/dist/tools/onedrive.d.ts +194 -0
  248. package/dist/tools/onedrive.d.ts.map +1 -0
  249. package/dist/tools/onedrive.js +257 -0
  250. package/dist/tools/onedrive.js.map +1 -0
  251. package/dist/tools/people.d.ts +129 -0
  252. package/dist/tools/people.d.ts.map +1 -0
  253. package/dist/tools/people.js +195 -0
  254. package/dist/tools/people.js.map +1 -0
  255. package/dist/tools/planner-visualization.d.ts +91 -0
  256. package/dist/tools/planner-visualization.d.ts.map +1 -0
  257. package/dist/tools/planner-visualization.js +192 -0
  258. package/dist/tools/planner-visualization.js.map +1 -0
  259. package/dist/tools/planner.d.ts +288 -0
  260. package/dist/tools/planner.d.ts.map +1 -0
  261. package/dist/tools/planner.js +368 -0
  262. package/dist/tools/planner.js.map +1 -0
  263. package/dist/tools/scheduling.d.ts +49 -0
  264. package/dist/tools/scheduling.d.ts.map +1 -0
  265. package/dist/tools/scheduling.js +115 -0
  266. package/dist/tools/scheduling.js.map +1 -0
  267. package/dist/tools/sharepoint.d.ts +115 -0
  268. package/dist/tools/sharepoint.d.ts.map +1 -0
  269. package/dist/tools/sharepoint.js +99 -0
  270. package/dist/tools/sharepoint.js.map +1 -0
  271. package/dist/tools/task-attachments.d.ts +74 -0
  272. package/dist/tools/task-attachments.d.ts.map +1 -0
  273. package/dist/tools/task-attachments.js +122 -0
  274. package/dist/tools/task-attachments.js.map +1 -0
  275. package/dist/tools/tasks.d.ts +74 -0
  276. package/dist/tools/tasks.d.ts.map +1 -0
  277. package/dist/tools/tasks.js +126 -0
  278. package/dist/tools/tasks.js.map +1 -0
  279. package/dist/tools/teams.d.ts +389 -0
  280. package/dist/tools/teams.d.ts.map +1 -0
  281. package/dist/tools/teams.js +546 -0
  282. package/dist/tools/teams.js.map +1 -0
  283. package/dist/types/calendar.d.ts +60 -0
  284. package/dist/types/calendar.d.ts.map +1 -0
  285. package/dist/types/calendar.js +15 -0
  286. package/dist/types/calendar.js.map +1 -0
  287. package/dist/types/contacts.d.ts +96 -0
  288. package/dist/types/contacts.d.ts.map +1 -0
  289. package/dist/types/contacts.js +41 -0
  290. package/dist/types/contacts.js.map +1 -0
  291. package/dist/types/index.d.ts +15 -0
  292. package/dist/types/index.d.ts.map +1 -0
  293. package/dist/types/index.js +16 -0
  294. package/dist/types/index.js.map +1 -0
  295. package/dist/types/mail.d.ts +108 -0
  296. package/dist/types/mail.d.ts.map +1 -0
  297. package/dist/types/mail.js +40 -0
  298. package/dist/types/mail.js.map +1 -0
  299. package/dist/types/notes.d.ts +26 -0
  300. package/dist/types/notes.d.ts.map +1 -0
  301. package/dist/types/notes.js +6 -0
  302. package/dist/types/notes.js.map +1 -0
  303. package/dist/types/tasks.d.ts +31 -0
  304. package/dist/types/tasks.d.ts.map +1 -0
  305. package/dist/types/tasks.js +6 -0
  306. package/dist/types/tasks.js.map +1 -0
  307. package/dist/utils/dates.d.ts +66 -0
  308. package/dist/utils/dates.d.ts.map +1 -0
  309. package/dist/utils/dates.js +94 -0
  310. package/dist/utils/dates.js.map +1 -0
  311. package/dist/utils/errors.d.ts +218 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +306 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/index.d.ts +10 -0
  316. package/dist/utils/index.d.ts.map +1 -0
  317. package/dist/utils/index.js +10 -0
  318. package/dist/utils/index.js.map +1 -0
  319. package/dist/visualization/html.d.ts +26 -0
  320. package/dist/visualization/html.d.ts.map +1 -0
  321. package/dist/visualization/html.js +306 -0
  322. package/dist/visualization/html.js.map +1 -0
  323. package/dist/visualization/markdown.d.ts +25 -0
  324. package/dist/visualization/markdown.d.ts.map +1 -0
  325. package/dist/visualization/markdown.js +186 -0
  326. package/dist/visualization/markdown.js.map +1 -0
  327. package/dist/visualization/mermaid.d.ts +25 -0
  328. package/dist/visualization/mermaid.d.ts.map +1 -0
  329. package/dist/visualization/mermaid.js +158 -0
  330. package/dist/visualization/mermaid.js.map +1 -0
  331. package/dist/visualization/svg.d.ts +25 -0
  332. package/dist/visualization/svg.d.ts.map +1 -0
  333. package/dist/visualization/svg.js +282 -0
  334. package/dist/visualization/svg.js.map +1 -0
  335. package/dist/visualization/types.d.ts +43 -0
  336. package/dist/visualization/types.d.ts.map +1 -0
  337. package/dist/visualization/types.js +34 -0
  338. package/dist/visualization/types.js.map +1 -0
  339. package/package.json +88 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ /**
6
+ * Self-contained HTML visualization renderer for Planner data.
7
+ * All styles are inline -- no external dependencies.
8
+ */
9
+ import { PRIORITY_LABELS, PRIORITY_COLORS, getTaskStatus, } from './types.js';
10
+ function escapeHtml(text) {
11
+ return text
12
+ .replace(/&/g, '&')
13
+ .replace(/</g, '&lt;')
14
+ .replace(/>/g, '&gt;')
15
+ .replace(/"/g, '&quot;');
16
+ }
17
+ function priorityColor(priority) {
18
+ return PRIORITY_COLORS[priority] ?? '#95a5a6';
19
+ }
20
+ /**
21
+ * Render a Kanban board as self-contained HTML with CSS Grid.
22
+ */
23
+ export function renderKanbanHtml(data) {
24
+ const colCount = Math.max(data.buckets.length, 1);
25
+ let cardsHtml = '';
26
+ for (const bucket of data.buckets) {
27
+ const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
28
+ let tasksHtml = '';
29
+ for (const task of bucketTasks) {
30
+ const pColor = priorityColor(task.priority);
31
+ const pLabel = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
32
+ const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : 'Unassigned';
33
+ const due = task.dueDateTime != null
34
+ ? (new Date(task.dueDateTime).toISOString().split('T')[0] ?? '')
35
+ : 'No due date';
36
+ tasksHtml += `
37
+ <div class="kanban-card" style="border-left:4px solid ${pColor};background:#fff;border-radius:6px;padding:10px;margin-bottom:8px;box-shadow:0 1px 3px rgba(0,0,0,0.12);cursor:default;" title="Assignees: ${escapeHtml(assignees)}&#10;Due: ${escapeHtml(due)}&#10;Priority: ${escapeHtml(pLabel)}">
38
+ <div style="font-weight:600;margin-bottom:4px;">${escapeHtml(task.title)}</div>
39
+ <div style="font-size:12px;color:#666;">
40
+ <span style="display:inline-block;background:${pColor};color:#fff;padding:1px 6px;border-radius:3px;font-size:11px;">${escapeHtml(pLabel)}</span>
41
+ <span style="margin-left:6px;">${task.percentComplete}%</span>
42
+ </div>
43
+ </div>`;
44
+ }
45
+ if (bucketTasks.length === 0) {
46
+ tasksHtml = '<div style="color:#999;font-style:italic;padding:10px;">No tasks</div>';
47
+ }
48
+ cardsHtml += `
49
+ <div class="kanban-column" style="background:#f4f5f7;border-radius:8px;padding:12px;min-width:220px;">
50
+ <div style="font-weight:700;font-size:14px;margin-bottom:10px;padding-bottom:8px;border-bottom:2px solid #ddd;">${escapeHtml(bucket.name)} <span style="color:#999;font-weight:400;">(${bucketTasks.length})</span></div>
51
+ ${tasksHtml}
52
+ </div>`;
53
+ }
54
+ return `<!DOCTYPE html>
55
+ <html lang="en">
56
+ <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Kanban</title></head>
57
+ <body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#e8eaed;">
58
+ <h1 style="margin:0 0 16px 0;font-size:22px;">${escapeHtml(data.plan.title)} - Kanban Board</h1>
59
+ <div style="display:grid;grid-template-columns:repeat(${colCount},minmax(240px,1fr));gap:16px;overflow-x:auto;">
60
+ ${cardsHtml}
61
+ </div>
62
+ </body>
63
+ </html>`;
64
+ }
65
+ /**
66
+ * Render a Gantt chart as self-contained HTML with CSS positioning.
67
+ */
68
+ export function renderGanttHtml(data) {
69
+ // Collect all tasks that have at least one date
70
+ const tasksWithDates = data.tasks.filter((t) => t.startDateTime != null || t.dueDateTime != null);
71
+ const allTasks = tasksWithDates.length > 0 ? tasksWithDates : data.tasks;
72
+ // Determine date range
73
+ const dates = [];
74
+ for (const task of allTasks) {
75
+ if (task.startDateTime != null)
76
+ dates.push(new Date(task.startDateTime));
77
+ if (task.dueDateTime != null)
78
+ dates.push(new Date(task.dueDateTime));
79
+ }
80
+ if (dates.length === 0) {
81
+ return `<!DOCTYPE html>
82
+ <html lang="en">
83
+ <head><meta charset="UTF-8"><title>${escapeHtml(data.plan.title)} - Gantt</title></head>
84
+ <body style="margin:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
85
+ <h1>${escapeHtml(data.plan.title)} - Gantt Chart</h1>
86
+ <p>No tasks with dates to display.</p>
87
+ </body>
88
+ </html>`;
89
+ }
90
+ const minDate = new Date(Math.min(...dates.map((d) => d.getTime())));
91
+ const maxDate = new Date(Math.max(...dates.map((d) => d.getTime())));
92
+ // Add some padding
93
+ minDate.setDate(minDate.getDate() - 1);
94
+ maxDate.setDate(maxDate.getDate() + 1);
95
+ const totalDays = Math.max(Math.ceil((maxDate.getTime() - minDate.getTime()) / 86400000), 1);
96
+ const rowHeight = 36;
97
+ const labelWidth = 200;
98
+ const chartWidth = 800;
99
+ const headerHeight = 40;
100
+ // Date axis labels (show ~8 evenly spaced dates)
101
+ const dateAxisCount = Math.min(totalDays, 8);
102
+ let dateAxisHtml = '';
103
+ for (let i = 0; i <= dateAxisCount; i++) {
104
+ const d = new Date(minDate.getTime() + (i / dateAxisCount) * (maxDate.getTime() - minDate.getTime()));
105
+ const x = (i / dateAxisCount) * chartWidth;
106
+ dateAxisHtml += `<div style="position:absolute;left:${labelWidth + x}px;top:10px;font-size:11px;color:#666;transform:translateX(-50%);">${d.toISOString().split('T')[0]}</div>`;
107
+ }
108
+ let barsHtml = '';
109
+ let rowIndex = 0;
110
+ for (const task of allTasks) {
111
+ const start = task.startDateTime != null ? new Date(task.startDateTime) : task.dueDateTime != null ? new Date(new Date(task.dueDateTime).getTime() - 7 * 86400000) : minDate;
112
+ const end = task.dueDateTime != null ? new Date(task.dueDateTime) : new Date(start.getTime() + 7 * 86400000);
113
+ const startOffset = Math.max(0, (start.getTime() - minDate.getTime()) / (maxDate.getTime() - minDate.getTime())) * chartWidth;
114
+ const barWidth = Math.max(10, ((end.getTime() - start.getTime()) / (maxDate.getTime() - minDate.getTime())) * chartWidth);
115
+ const y = headerHeight + rowIndex * rowHeight;
116
+ const pColor = priorityColor(task.priority);
117
+ const progressWidth = (task.percentComplete / 100) * barWidth;
118
+ barsHtml += `
119
+ <div style="position:absolute;left:0;top:${y}px;width:${labelWidth - 10}px;height:${rowHeight}px;display:flex;align-items:center;padding-left:8px;font-size:13px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;">${escapeHtml(task.title)}</div>
120
+ <div style="position:absolute;left:${labelWidth + startOffset}px;top:${y + 6}px;width:${barWidth}px;height:${rowHeight - 14}px;background:#ddd;border-radius:4px;overflow:hidden;">
121
+ <div style="width:${progressWidth}px;height:100%;background:${pColor};border-radius:4px 0 0 4px;"></div>
122
+ </div>`;
123
+ rowIndex++;
124
+ }
125
+ const totalHeight = headerHeight + rowIndex * rowHeight + 20;
126
+ return `<!DOCTYPE html>
127
+ <html lang="en">
128
+ <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Gantt</title></head>
129
+ <body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#fafafa;">
130
+ <h1 style="font-size:22px;margin:0 0 16px 0;">${escapeHtml(data.plan.title)} - Gantt Chart</h1>
131
+ <div style="position:relative;width:${labelWidth + chartWidth}px;height:${totalHeight}px;background:#fff;border:1px solid #e0e0e0;border-radius:8px;overflow:hidden;padding:0;">
132
+ ${dateAxisHtml}
133
+ ${barsHtml}
134
+ </div>
135
+ </body>
136
+ </html>`;
137
+ }
138
+ /**
139
+ * Render a summary dashboard as self-contained HTML.
140
+ */
141
+ export function renderSummaryHtml(data) {
142
+ let notStarted = 0;
143
+ let inProgress = 0;
144
+ let completed = 0;
145
+ let overdue = 0;
146
+ for (const task of data.tasks) {
147
+ const status = getTaskStatus(task);
148
+ if (status === 'completed')
149
+ completed++;
150
+ else if (status === 'overdue')
151
+ overdue++;
152
+ else if (status === 'in-progress')
153
+ inProgress++;
154
+ else
155
+ notStarted++;
156
+ }
157
+ const total = data.tasks.length;
158
+ // Assignee workload
159
+ const assigneeMap = new Map();
160
+ for (const task of data.tasks) {
161
+ for (const assignee of task.assignments) {
162
+ assigneeMap.set(assignee, (assigneeMap.get(assignee) ?? 0) + 1);
163
+ }
164
+ }
165
+ let assigneeRows = '';
166
+ for (const [assignee, count] of [...assigneeMap.entries()].sort((a, b) => b[1] - a[1])) {
167
+ assigneeRows += `<tr><td style="padding:6px 12px;border-bottom:1px solid #eee;">${escapeHtml(assignee)}</td><td style="padding:6px 12px;border-bottom:1px solid #eee;text-align:center;">${count}</td></tr>`;
168
+ }
169
+ const statCard = (label, value, color) => `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);text-align:center;min-width:120px;">
170
+ <div style="font-size:28px;font-weight:700;color:${color};">${value}</div>
171
+ <div style="font-size:13px;color:#666;margin-top:4px;">${label}</div>
172
+ </div>`;
173
+ // Priority distribution
174
+ const priorityCounts = {};
175
+ for (const task of data.tasks) {
176
+ priorityCounts[task.priority] = (priorityCounts[task.priority] ?? 0) + 1;
177
+ }
178
+ let priorityBars = '';
179
+ for (const [p, count] of Object.entries(priorityCounts).sort(([a], [b]) => Number(a) - Number(b))) {
180
+ const pNum = Number(p);
181
+ const pct = total > 0 ? (count / total) * 100 : 0;
182
+ const color = priorityColor(pNum);
183
+ const label = PRIORITY_LABELS[pNum] ?? `P${p}`;
184
+ priorityBars += `
185
+ <div style="display:flex;align-items:center;margin-bottom:6px;">
186
+ <div style="width:80px;font-size:13px;">${escapeHtml(label)}</div>
187
+ <div style="flex:1;background:#eee;border-radius:4px;height:20px;overflow:hidden;">
188
+ <div style="width:${pct}%;height:100%;background:${color};border-radius:4px;"></div>
189
+ </div>
190
+ <div style="width:40px;text-align:right;font-size:13px;margin-left:8px;">${count}</div>
191
+ </div>`;
192
+ }
193
+ return `<!DOCTYPE html>
194
+ <html lang="en">
195
+ <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Summary</title></head>
196
+ <body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#f0f2f5;">
197
+ <h1 style="font-size:22px;margin:0 0 20px 0;">${escapeHtml(data.plan.title)} - Summary Dashboard</h1>
198
+ <div style="display:flex;gap:16px;flex-wrap:wrap;margin-bottom:24px;">
199
+ ${statCard('Total Tasks', total, '#2c3e50')}
200
+ ${statCard('Not Started', notStarted, '#95a5a6')}
201
+ ${statCard('In Progress', inProgress, '#3498db')}
202
+ ${statCard('Completed', completed, '#2ecc71')}
203
+ ${statCard('Overdue', overdue, '#e74c3c')}
204
+ </div>
205
+ ${priorityBars ? `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);margin-bottom:24px;max-width:500px;">
206
+ <h2 style="font-size:16px;margin:0 0 12px 0;">Priority Distribution</h2>
207
+ ${priorityBars}
208
+ </div>` : ''}
209
+ ${assigneeRows ? `<div style="background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,0.1);max-width:400px;">
210
+ <h2 style="font-size:16px;margin:0 0 12px 0;">Assignee Workload</h2>
211
+ <table style="width:100%;border-collapse:collapse;">
212
+ <thead><tr><th style="text-align:left;padding:6px 12px;border-bottom:2px solid #ddd;">Assignee</th><th style="text-align:center;padding:6px 12px;border-bottom:2px solid #ddd;">Tasks</th></tr></thead>
213
+ <tbody>${assigneeRows}</tbody>
214
+ </table>
215
+ </div>` : ''}
216
+ </body>
217
+ </html>`;
218
+ }
219
+ /**
220
+ * Render a burndown chart as self-contained HTML with an inline SVG line chart.
221
+ */
222
+ export function renderBurndownHtml(data) {
223
+ const allDates = new Set();
224
+ for (const task of data.tasks) {
225
+ if (task.startDateTime != null)
226
+ allDates.add(new Date(task.startDateTime).toISOString().split('T')[0]);
227
+ if (task.dueDateTime != null)
228
+ allDates.add(new Date(task.dueDateTime).toISOString().split('T')[0]);
229
+ if (task.completedDateTime != null)
230
+ allDates.add(new Date(task.completedDateTime).toISOString().split('T')[0]);
231
+ }
232
+ const sortedDates = [...allDates].sort();
233
+ if (sortedDates.length === 0) {
234
+ return `<!DOCTYPE html>
235
+ <html lang="en"><head><meta charset="UTF-8"><title>${escapeHtml(data.plan.title)} - Burndown</title></head>
236
+ <body style="margin:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
237
+ <h1>${escapeHtml(data.plan.title)} - Burndown Chart</h1>
238
+ <p>No date data available for burndown chart.</p>
239
+ </body></html>`;
240
+ }
241
+ const total = data.tasks.length;
242
+ const remaining = [];
243
+ for (const date of sortedDates) {
244
+ const completedByDate = data.tasks.filter((t) => t.completedDateTime != null && new Date(t.completedDateTime).toISOString().split('T')[0] <= date).length;
245
+ remaining.push(total - completedByDate);
246
+ }
247
+ // SVG chart dimensions
248
+ const svgW = 700;
249
+ const svgH = 350;
250
+ const pad = { top: 30, right: 30, bottom: 60, left: 50 };
251
+ const chartW = svgW - pad.left - pad.right;
252
+ const chartH = svgH - pad.top - pad.bottom;
253
+ const n = sortedDates.length;
254
+ const yMax = Math.max(total, 1);
255
+ // Actual line points
256
+ const points = remaining.map((r, i) => {
257
+ const x = pad.left + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
258
+ const y = pad.top + chartH - (r / yMax) * chartH;
259
+ return `${x},${y}`;
260
+ });
261
+ // Ideal burndown line (straight from total to 0)
262
+ const idealStart = `${pad.left},${pad.top}`;
263
+ const idealEnd = `${pad.left + chartW},${pad.top + chartH}`;
264
+ // X-axis labels
265
+ let xLabels = '';
266
+ const labelCount = Math.min(n, 8);
267
+ for (let i = 0; i < labelCount; i++) {
268
+ const idx = Math.floor(i * (n - 1) / Math.max(labelCount - 1, 1));
269
+ const x = pad.left + (n > 1 ? (idx / (n - 1)) * chartW : chartW / 2);
270
+ xLabels += `<text x="${x}" y="${svgH - 15}" text-anchor="middle" font-size="11" fill="#666" transform="rotate(-30,${x},${svgH - 15})">${sortedDates[idx]}</text>`;
271
+ }
272
+ // Y-axis labels
273
+ let yLabels = '';
274
+ const yTicks = 5;
275
+ for (let i = 0; i <= yTicks; i++) {
276
+ const val = Math.round((i / yTicks) * yMax);
277
+ const y = pad.top + chartH - (i / yTicks) * chartH;
278
+ yLabels += `<text x="${pad.left - 8}" y="${y + 4}" text-anchor="end" font-size="11" fill="#666">${val}</text>`;
279
+ yLabels += `<line x1="${pad.left}" y1="${y}" x2="${pad.left + chartW}" y2="${y}" stroke="#eee" stroke-width="1"/>`;
280
+ }
281
+ // Data point circles
282
+ const circles = remaining.map((r, i) => {
283
+ const x = pad.left + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
284
+ const y = pad.top + chartH - (r / yMax) * chartH;
285
+ return `<circle cx="${x}" cy="${y}" r="4" fill="#3498db" stroke="#fff" stroke-width="2"/>`;
286
+ }).join('');
287
+ return `<!DOCTYPE html>
288
+ <html lang="en">
289
+ <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(data.plan.title)} - Burndown</title></head>
290
+ <body style="margin:0;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#fafafa;">
291
+ <h1 style="font-size:22px;margin:0 0 16px 0;">${escapeHtml(data.plan.title)} - Burndown Chart</h1>
292
+ <svg width="${svgW}" height="${svgH}" style="background:#fff;border:1px solid #e0e0e0;border-radius:8px;">
293
+ ${yLabels}
294
+ <line x1="${pad.left}" y1="${pad.top}" x2="${pad.left}" y2="${pad.top + chartH}" stroke="#ccc" stroke-width="1"/>
295
+ <line x1="${pad.left}" y1="${pad.top + chartH}" x2="${pad.left + chartW}" y2="${pad.top + chartH}" stroke="#ccc" stroke-width="1"/>
296
+ <line x1="${idealStart.split(',')[0]}" y1="${idealStart.split(',')[1]}" x2="${idealEnd.split(',')[0]}" y2="${idealEnd.split(',')[1]}" stroke="#e74c3c" stroke-width="2" stroke-dasharray="6,4" opacity="0.5"/>
297
+ <polyline points="${points.join(' ')}" fill="none" stroke="#3498db" stroke-width="2.5"/>
298
+ ${circles}
299
+ ${xLabels}
300
+ <text x="${svgW / 2}" y="${svgH - 2}" text-anchor="middle" font-size="12" fill="#333">Date</text>
301
+ <text x="14" y="${svgH / 2}" text-anchor="middle" font-size="12" fill="#333" transform="rotate(-90,14,${svgH / 2})">Remaining</text>
302
+ </svg>
303
+ </body>
304
+ </html>`;
305
+ }
306
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/visualization/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ /**
6
+ * Markdown visualization renderer for Planner data.
7
+ */
8
+ import { type PlanVisualizationData } from './types.js';
9
+ /**
10
+ * Render a Kanban board as markdown tables grouped by bucket.
11
+ */
12
+ export declare function renderKanbanMarkdown(data: PlanVisualizationData): string;
13
+ /**
14
+ * Render a Gantt chart as a Mermaid code block inside markdown.
15
+ */
16
+ export declare function renderGanttMarkdown(data: PlanVisualizationData): string;
17
+ /**
18
+ * Render a summary dashboard as markdown with stats and assignee workload tables.
19
+ */
20
+ export declare function renderSummaryMarkdown(data: PlanVisualizationData): string;
21
+ /**
22
+ * Render a burndown chart as a date-indexed markdown table.
23
+ */
24
+ export declare function renderBurndownMarkdown(data: PlanVisualizationData): string;
25
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/visualization/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA+CxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAwCvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAiDzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAoC1E"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ /**
6
+ * Markdown visualization renderer for Planner data.
7
+ */
8
+ import { PRIORITY_LABELS, getTaskStatus, } from './types.js';
9
+ /**
10
+ * Render a Kanban board as markdown tables grouped by bucket.
11
+ */
12
+ export function renderKanbanMarkdown(data) {
13
+ const lines = [`# ${data.plan.title} - Kanban Board`, ''];
14
+ for (const bucket of data.buckets) {
15
+ const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
16
+ lines.push(`## ${bucket.name}`, '');
17
+ lines.push('| Title | Priority | Assignees | % Complete | Due Date |');
18
+ lines.push('|-------|----------|-----------|------------|----------|');
19
+ if (bucketTasks.length === 0) {
20
+ lines.push('| _No tasks_ | | | | |');
21
+ }
22
+ else {
23
+ for (const task of bucketTasks) {
24
+ const priority = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
25
+ const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : '-';
26
+ const due = task.dueDateTime != null
27
+ ? new Date(task.dueDateTime).toISOString().split('T')[0]
28
+ : '-';
29
+ lines.push(`| ${task.title} | ${priority} | ${assignees} | ${task.percentComplete}% | ${due} |`);
30
+ }
31
+ }
32
+ lines.push('');
33
+ }
34
+ // Handle tasks not assigned to any known bucket
35
+ const knownBucketIds = new Set(data.buckets.map((b) => b.id));
36
+ const orphanTasks = data.tasks.filter((t) => !knownBucketIds.has(t.bucketId));
37
+ if (orphanTasks.length > 0) {
38
+ lines.push('## Unassigned Bucket', '');
39
+ lines.push('| Title | Priority | Assignees | % Complete | Due Date |');
40
+ lines.push('|-------|----------|-----------|------------|----------|');
41
+ for (const task of orphanTasks) {
42
+ const priority = PRIORITY_LABELS[task.priority] ?? `P${task.priority}`;
43
+ const assignees = task.assignments.length > 0 ? task.assignments.join(', ') : '-';
44
+ const due = task.dueDateTime != null
45
+ ? new Date(task.dueDateTime).toISOString().split('T')[0]
46
+ : '-';
47
+ lines.push(`| ${task.title} | ${priority} | ${assignees} | ${task.percentComplete}% | ${due} |`);
48
+ }
49
+ lines.push('');
50
+ }
51
+ return lines.join('\n');
52
+ }
53
+ /**
54
+ * Render a Gantt chart as a Mermaid code block inside markdown.
55
+ */
56
+ export function renderGanttMarkdown(data) {
57
+ const lines = [
58
+ `# ${data.plan.title} - Gantt Chart`,
59
+ '',
60
+ '```mermaid',
61
+ 'gantt',
62
+ ' dateFormat YYYY-MM-DD',
63
+ ` title ${data.plan.title}`,
64
+ ];
65
+ for (const bucket of data.buckets) {
66
+ const bucketTasks = data.tasks.filter((t) => t.bucketId === bucket.id);
67
+ if (bucketTasks.length === 0)
68
+ continue;
69
+ lines.push(` section ${bucket.name}`);
70
+ for (const task of bucketTasks) {
71
+ const start = task.startDateTime != null
72
+ ? new Date(task.startDateTime).toISOString().split('T')[0]
73
+ : null;
74
+ const end = task.dueDateTime != null
75
+ ? new Date(task.dueDateTime).toISOString().split('T')[0]
76
+ : null;
77
+ const status = task.percentComplete === 100 ? 'done, ' : task.percentComplete > 0 ? 'active, ' : '';
78
+ if (start != null && end != null) {
79
+ lines.push(` ${task.title} :${status}${start}, ${end}`);
80
+ }
81
+ else if (start != null) {
82
+ lines.push(` ${task.title} :${status}${start}, 7d`);
83
+ }
84
+ else if (end != null) {
85
+ // Estimate start as 7 days before due
86
+ const estimatedStart = new Date(end);
87
+ estimatedStart.setDate(estimatedStart.getDate() - 7);
88
+ const startStr = estimatedStart.toISOString().split('T')[0];
89
+ lines.push(` ${task.title} :${status}${startStr}, ${end}`);
90
+ }
91
+ else {
92
+ lines.push(` ${task.title} :${status}2026-01-01, 7d`);
93
+ }
94
+ }
95
+ }
96
+ lines.push('```', '');
97
+ return lines.join('\n');
98
+ }
99
+ /**
100
+ * Render a summary dashboard as markdown with stats and assignee workload tables.
101
+ */
102
+ export function renderSummaryMarkdown(data) {
103
+ const total = data.tasks.length;
104
+ let notStarted = 0;
105
+ let inProgress = 0;
106
+ let completed = 0;
107
+ let overdue = 0;
108
+ for (const task of data.tasks) {
109
+ const status = getTaskStatus(task);
110
+ if (status === 'completed')
111
+ completed++;
112
+ else if (status === 'overdue')
113
+ overdue++;
114
+ else if (status === 'in-progress')
115
+ inProgress++;
116
+ else
117
+ notStarted++;
118
+ }
119
+ const lines = [
120
+ `# ${data.plan.title} - Summary`,
121
+ '',
122
+ '## Task Statistics',
123
+ '',
124
+ '| Metric | Count |',
125
+ '|--------|-------|',
126
+ `| Total Tasks | ${total} |`,
127
+ `| Not Started | ${notStarted} |`,
128
+ `| In Progress | ${inProgress} |`,
129
+ `| Completed | ${completed} |`,
130
+ `| Overdue | ${overdue} |`,
131
+ '',
132
+ ];
133
+ // Assignee workload
134
+ const assigneeMap = new Map();
135
+ for (const task of data.tasks) {
136
+ for (const assignee of task.assignments) {
137
+ assigneeMap.set(assignee, (assigneeMap.get(assignee) ?? 0) + 1);
138
+ }
139
+ }
140
+ if (assigneeMap.size > 0) {
141
+ lines.push('## Assignee Workload', '');
142
+ lines.push('| Assignee | Task Count |');
143
+ lines.push('|----------|------------|');
144
+ for (const [assignee, count] of [...assigneeMap.entries()].sort((a, b) => b[1] - a[1])) {
145
+ lines.push(`| ${assignee} | ${count} |`);
146
+ }
147
+ lines.push('');
148
+ }
149
+ return lines.join('\n');
150
+ }
151
+ /**
152
+ * Render a burndown chart as a date-indexed markdown table.
153
+ */
154
+ export function renderBurndownMarkdown(data) {
155
+ const lines = [`# ${data.plan.title} - Burndown`, ''];
156
+ // Collect relevant dates
157
+ const tasksWithDue = data.tasks.filter((t) => t.dueDateTime);
158
+ if (tasksWithDue.length === 0) {
159
+ lines.push('_No tasks with due dates to generate burndown chart._', '');
160
+ return lines.join('\n');
161
+ }
162
+ const allDates = new Set();
163
+ for (const task of data.tasks) {
164
+ if (task.startDateTime != null)
165
+ allDates.add(new Date(task.startDateTime).toISOString().split('T')[0]);
166
+ if (task.dueDateTime != null)
167
+ allDates.add(new Date(task.dueDateTime).toISOString().split('T')[0]);
168
+ if (task.completedDateTime != null)
169
+ allDates.add(new Date(task.completedDateTime).toISOString().split('T')[0]);
170
+ }
171
+ const sortedDates = [...allDates].sort();
172
+ if (sortedDates.length === 0) {
173
+ lines.push('_No date data available._', '');
174
+ return lines.join('\n');
175
+ }
176
+ lines.push('| Date | Remaining Tasks | Completed |');
177
+ lines.push('|------|-----------------|-----------|');
178
+ const total = data.tasks.length;
179
+ for (const date of sortedDates) {
180
+ const completedByDate = data.tasks.filter((t) => t.completedDateTime != null && new Date(t.completedDateTime).toISOString().split('T')[0] <= date).length;
181
+ lines.push(`| ${date} | ${total - completedByDate} | ${completedByDate} |`);
182
+ }
183
+ lines.push('');
184
+ return lines.join('\n');
185
+ }
186
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/visualization/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) 2026 JBC Tech Solutions, LLC
3
+ * Licensed under the MIT License. See LICENSE file in the project root.
4
+ */
5
+ /**
6
+ * Mermaid diagram renderer for Planner data.
7
+ */
8
+ import { type PlanVisualizationData } from './types.js';
9
+ /**
10
+ * Render a Gantt chart in pure Mermaid gantt syntax.
11
+ */
12
+ export declare function renderGanttMermaid(data: PlanVisualizationData): string;
13
+ /**
14
+ * Render a Kanban board using Mermaid block-beta diagram.
15
+ */
16
+ export declare function renderKanbanMermaid(data: PlanVisualizationData): string;
17
+ /**
18
+ * Render a summary pie chart in Mermaid syntax.
19
+ */
20
+ export declare function renderSummaryMermaid(data: PlanVisualizationData): string;
21
+ /**
22
+ * Render a burndown chart using Mermaid xychart-beta.
23
+ */
24
+ export declare function renderBurndownMermaid(data: PlanVisualizationData): string;
25
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/visualization/mermaid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,KAAK,qBAAqB,EAAiB,MAAM,YAAY,CAAC;AAEvE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAwCtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAgCvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA8BxE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAyCzE"}