github-weekly-reporter 0.1.0 → 0.2.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 (176) hide show
  1. package/README.md +86 -115
  2. package/dist/cli/commands/deploy.d.ts.map +1 -1
  3. package/dist/cli/commands/deploy.js +9 -3
  4. package/dist/cli/commands/deploy.js.map +1 -1
  5. package/dist/cli/commands/fetch.d.ts +3 -0
  6. package/dist/cli/commands/fetch.d.ts.map +1 -0
  7. package/dist/cli/commands/fetch.js +148 -0
  8. package/dist/cli/commands/fetch.js.map +1 -0
  9. package/dist/cli/commands/generate.d.ts.map +1 -1
  10. package/dist/cli/commands/generate.js +59 -80
  11. package/dist/cli/commands/generate.js.map +1 -1
  12. package/dist/cli/commands/render.d.ts +3 -0
  13. package/dist/cli/commands/render.d.ts.map +1 -0
  14. package/dist/cli/commands/render.js +172 -0
  15. package/dist/cli/commands/render.js.map +1 -0
  16. package/dist/cli/commands/setup.d.ts +3 -0
  17. package/dist/cli/commands/setup.d.ts.map +1 -0
  18. package/dist/cli/commands/setup.js +709 -0
  19. package/dist/cli/commands/setup.js.map +1 -0
  20. package/dist/cli/index.js +6 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/collector/clean-body.d.ts +2 -0
  23. package/dist/collector/clean-body.d.ts.map +1 -0
  24. package/dist/collector/clean-body.js +27 -0
  25. package/dist/collector/clean-body.js.map +1 -0
  26. package/dist/collector/date-range.d.ts +3 -2
  27. package/dist/collector/date-range.d.ts.map +1 -1
  28. package/dist/collector/date-range.js +125 -5
  29. package/dist/collector/date-range.js.map +1 -1
  30. package/dist/collector/fetch-contributions.d.ts +11 -1
  31. package/dist/collector/fetch-contributions.d.ts.map +1 -1
  32. package/dist/collector/fetch-contributions.js +15 -3
  33. package/dist/collector/fetch-contributions.js.map +1 -1
  34. package/dist/collector/fetch-events.d.ts +6 -0
  35. package/dist/collector/fetch-events.d.ts.map +1 -0
  36. package/dist/collector/fetch-events.js +106 -0
  37. package/dist/collector/fetch-events.js.map +1 -0
  38. package/dist/collector/fetch-repo-prs.d.ts +7 -0
  39. package/dist/collector/fetch-repo-prs.d.ts.map +1 -0
  40. package/dist/collector/fetch-repo-prs.js +62 -0
  41. package/dist/collector/fetch-repo-prs.js.map +1 -0
  42. package/dist/collector/queries.d.ts +1 -4
  43. package/dist/collector/queries.d.ts.map +1 -1
  44. package/dist/collector/queries.js +7 -59
  45. package/dist/collector/queries.js.map +1 -1
  46. package/dist/deployer/index-page.d.ts +22 -2
  47. package/dist/deployer/index-page.d.ts.map +1 -1
  48. package/dist/deployer/index-page.js +424 -33
  49. package/dist/deployer/index-page.js.map +1 -1
  50. package/dist/deployer/week.d.ts +1 -1
  51. package/dist/deployer/week.d.ts.map +1 -1
  52. package/dist/deployer/week.js +17 -6
  53. package/dist/deployer/week.js.map +1 -1
  54. package/dist/i18n/fonts.d.ts +8 -0
  55. package/dist/i18n/fonts.d.ts.map +1 -0
  56. package/dist/i18n/fonts.js +44 -0
  57. package/dist/i18n/fonts.js.map +1 -0
  58. package/dist/i18n/index.d.ts +28 -0
  59. package/dist/i18n/index.d.ts.map +1 -0
  60. package/dist/i18n/index.js +259 -0
  61. package/dist/i18n/index.js.map +1 -0
  62. package/dist/index.d.ts +2 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +1 -2
  65. package/dist/index.js.map +1 -1
  66. package/dist/llm/index.d.ts +2 -1
  67. package/dist/llm/index.d.ts.map +1 -1
  68. package/dist/llm/index.js +77 -5
  69. package/dist/llm/index.js.map +1 -1
  70. package/dist/llm/preprocess.d.ts +3 -0
  71. package/dist/llm/preprocess.d.ts.map +1 -0
  72. package/dist/llm/preprocess.js +92 -0
  73. package/dist/llm/preprocess.js.map +1 -0
  74. package/dist/llm/prompt.d.ts.map +1 -1
  75. package/dist/llm/prompt.js +109 -29
  76. package/dist/llm/prompt.js.map +1 -1
  77. package/dist/llm/providers/anthropic.js +1 -1
  78. package/dist/llm/providers/anthropic.js.map +1 -1
  79. package/dist/llm/providers/grok.d.ts +3 -0
  80. package/dist/llm/providers/grok.d.ts.map +1 -0
  81. package/dist/llm/providers/grok.js +18 -0
  82. package/dist/llm/providers/grok.js.map +1 -0
  83. package/dist/llm/providers/groq.d.ts +3 -0
  84. package/dist/llm/providers/groq.d.ts.map +1 -0
  85. package/dist/llm/providers/groq.js +18 -0
  86. package/dist/llm/providers/groq.js.map +1 -0
  87. package/dist/llm/providers/openai.js +1 -1
  88. package/dist/llm/providers/openai.js.map +1 -1
  89. package/dist/llm/providers/openrouter.d.ts +3 -0
  90. package/dist/llm/providers/openrouter.d.ts.map +1 -0
  91. package/dist/llm/providers/openrouter.js +18 -0
  92. package/dist/llm/providers/openrouter.js.map +1 -0
  93. package/dist/llm/types.d.ts +5 -2
  94. package/dist/llm/types.d.ts.map +1 -1
  95. package/dist/renderer/helpers.d.ts +6 -1
  96. package/dist/renderer/helpers.d.ts.map +1 -1
  97. package/dist/renderer/helpers.js +54 -17
  98. package/dist/renderer/helpers.js.map +1 -1
  99. package/dist/renderer/index.d.ts +11 -2
  100. package/dist/renderer/index.d.ts.map +1 -1
  101. package/dist/renderer/index.js +41 -19
  102. package/dist/renderer/index.js.map +1 -1
  103. package/dist/renderer/og-image.d.ts +15 -0
  104. package/dist/renderer/og-image.d.ts.map +1 -0
  105. package/dist/renderer/og-image.js +152 -0
  106. package/dist/renderer/og-image.js.map +1 -0
  107. package/dist/renderer/themes.d.ts +2 -17
  108. package/dist/renderer/themes.d.ts.map +1 -1
  109. package/dist/renderer/themes.js +371 -147
  110. package/dist/renderer/themes.js.map +1 -1
  111. package/dist/types.d.ts +103 -11
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +10 -4
  114. package/src/renderer/templates/partials/footer.hbs +3 -1
  115. package/src/renderer/templates/partials/header.hbs +10 -7
  116. package/src/renderer/templates/partials/highlights.hbs +24 -0
  117. package/src/renderer/templates/partials/overview.hbs +3 -0
  118. package/src/renderer/templates/partials/summaries.hbs +73 -0
  119. package/src/renderer/templates/report.hbs +100 -15
  120. package/dist/cli/config.d.ts +0 -11
  121. package/dist/cli/config.d.ts.map +0 -1
  122. package/dist/cli/config.js +0 -16
  123. package/dist/cli/config.js.map +0 -1
  124. package/dist/cli/config.test.d.ts +0 -2
  125. package/dist/cli/config.test.d.ts.map +0 -1
  126. package/dist/cli/config.test.js +0 -32
  127. package/dist/cli/config.test.js.map +0 -1
  128. package/dist/collector/aggregate.test.d.ts +0 -2
  129. package/dist/collector/aggregate.test.d.ts.map +0 -1
  130. package/dist/collector/aggregate.test.js +0 -88
  131. package/dist/collector/aggregate.test.js.map +0 -1
  132. package/dist/collector/date-range.test.d.ts +0 -2
  133. package/dist/collector/date-range.test.d.ts.map +0 -1
  134. package/dist/collector/date-range.test.js +0 -25
  135. package/dist/collector/date-range.test.js.map +0 -1
  136. package/dist/collector/fetch-issues.d.ts +0 -5
  137. package/dist/collector/fetch-issues.d.ts.map +0 -1
  138. package/dist/collector/fetch-issues.js +0 -31
  139. package/dist/collector/fetch-issues.js.map +0 -1
  140. package/dist/collector/fetch-languages.d.ts +0 -4
  141. package/dist/collector/fetch-languages.d.ts.map +0 -1
  142. package/dist/collector/fetch-languages.js +0 -42
  143. package/dist/collector/fetch-languages.js.map +0 -1
  144. package/dist/collector/fetch-pull-requests.d.ts +0 -5
  145. package/dist/collector/fetch-pull-requests.d.ts.map +0 -1
  146. package/dist/collector/fetch-pull-requests.js +0 -31
  147. package/dist/collector/fetch-pull-requests.js.map +0 -1
  148. package/dist/collector/index.d.ts +0 -3
  149. package/dist/collector/index.d.ts.map +0 -1
  150. package/dist/collector/index.js +0 -50
  151. package/dist/collector/index.js.map +0 -1
  152. package/dist/deployer/index-page.test.d.ts +0 -2
  153. package/dist/deployer/index-page.test.d.ts.map +0 -1
  154. package/dist/deployer/index-page.test.js +0 -29
  155. package/dist/deployer/index-page.test.js.map +0 -1
  156. package/dist/deployer/week.test.d.ts +0 -2
  157. package/dist/deployer/week.test.d.ts.map +0 -1
  158. package/dist/deployer/week.test.js +0 -21
  159. package/dist/deployer/week.test.js.map +0 -1
  160. package/dist/llm/llm.test.d.ts +0 -2
  161. package/dist/llm/llm.test.d.ts.map +0 -1
  162. package/dist/llm/llm.test.js +0 -24
  163. package/dist/llm/llm.test.js.map +0 -1
  164. package/dist/llm/prompt.test.d.ts +0 -2
  165. package/dist/llm/prompt.test.d.ts.map +0 -1
  166. package/dist/llm/prompt.test.js +0 -48
  167. package/dist/llm/prompt.test.js.map +0 -1
  168. package/dist/renderer/renderer.test.d.ts +0 -2
  169. package/dist/renderer/renderer.test.d.ts.map +0 -1
  170. package/dist/renderer/renderer.test.js +0 -111
  171. package/dist/renderer/renderer.test.js.map +0 -1
  172. package/src/renderer/templates/partials/heatmap.hbs +0 -11
  173. package/src/renderer/templates/partials/languages.hbs +0 -19
  174. package/src/renderer/templates/partials/narrative.hbs +0 -10
  175. package/src/renderer/templates/partials/repositories.hbs +0 -25
  176. package/src/renderer/templates/partials/stats.hbs +0 -8
@@ -1,88 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { aggregateRepositories } from "./aggregate.js";
3
- describe("aggregateRepositories", () => {
4
- it("aggregates PRs and issues by repository", () => {
5
- const prs = [
6
- {
7
- title: "Fix bug",
8
- url: "https://github.com/org/repo-a/pull/1",
9
- repository: "org/repo-a",
10
- state: "merged",
11
- createdAt: "2026-04-01T00:00:00Z",
12
- mergedAt: "2026-04-02T00:00:00Z",
13
- },
14
- {
15
- title: "Add feature",
16
- url: "https://github.com/org/repo-a/pull/2",
17
- repository: "org/repo-a",
18
- state: "open",
19
- createdAt: "2026-04-02T00:00:00Z",
20
- mergedAt: null,
21
- },
22
- {
23
- title: "Update docs",
24
- url: "https://github.com/org/repo-b/pull/1",
25
- repository: "org/repo-b",
26
- state: "merged",
27
- createdAt: "2026-04-01T00:00:00Z",
28
- mergedAt: "2026-04-01T00:00:00Z",
29
- },
30
- ];
31
- const issues = [
32
- {
33
- title: "Bug report",
34
- url: "https://github.com/org/repo-a/issues/1",
35
- repository: "org/repo-a",
36
- state: "closed",
37
- createdAt: "2026-04-01T00:00:00Z",
38
- closedAt: "2026-04-02T00:00:00Z",
39
- },
40
- ];
41
- const result = aggregateRepositories(prs, issues);
42
- expect(result).toHaveLength(2);
43
- const repoA = result.find((r) => r.name === "org/repo-a");
44
- expect(repoA).toBeDefined();
45
- expect(repoA.prsOpened).toBe(2);
46
- expect(repoA.prsMerged).toBe(1);
47
- expect(repoA.issuesOpened).toBe(1);
48
- expect(repoA.issuesClosed).toBe(1);
49
- const repoB = result.find((r) => r.name === "org/repo-b");
50
- expect(repoB).toBeDefined();
51
- expect(repoB.prsOpened).toBe(1);
52
- expect(repoB.prsMerged).toBe(1);
53
- });
54
- it("sorts by total activity (PRs + issues) descending", () => {
55
- const prs = [
56
- {
57
- title: "PR1",
58
- url: "",
59
- repository: "org/less-active",
60
- state: "open",
61
- createdAt: "",
62
- mergedAt: null,
63
- },
64
- {
65
- title: "PR2",
66
- url: "",
67
- repository: "org/more-active",
68
- state: "open",
69
- createdAt: "",
70
- mergedAt: null,
71
- },
72
- {
73
- title: "PR3",
74
- url: "",
75
- repository: "org/more-active",
76
- state: "merged",
77
- createdAt: "",
78
- mergedAt: "",
79
- },
80
- ];
81
- const result = aggregateRepositories(prs, []);
82
- expect(result[0].name).toBe("org/more-active");
83
- });
84
- it("returns empty array when no activity", () => {
85
- expect(aggregateRepositories([], [])).toEqual([]);
86
- });
87
- });
88
- //# sourceMappingURL=aggregate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggregate.test.js","sourceRoot":"","sources":["../../src/collector/aggregate.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=date-range.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-range.test.d.ts","sourceRoot":"","sources":["../../src/collector/date-range.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { buildWeeklyRange, toISODate } from "./date-range.js";
3
- describe("buildWeeklyRange", () => {
4
- it("returns a 7-day range ending on the given date", () => {
5
- const now = new Date("2026-04-03T12:00:00Z");
6
- const range = buildWeeklyRange(now);
7
- expect(toISODate(range.from)).toBe("2026-03-28");
8
- expect(toISODate(range.to)).toBe("2026-04-03");
9
- });
10
- it("sets from to midnight UTC and to to end of day UTC", () => {
11
- const now = new Date("2026-04-03T15:30:00Z");
12
- const range = buildWeeklyRange(now);
13
- expect(range.from.getUTCHours()).toBe(0);
14
- expect(range.from.getUTCMinutes()).toBe(0);
15
- expect(range.to.getUTCHours()).toBe(23);
16
- expect(range.to.getUTCMinutes()).toBe(59);
17
- });
18
- });
19
- describe("toISODate", () => {
20
- it("formats a date as YYYY-MM-DD", () => {
21
- const date = new Date("2026-04-03T12:00:00Z");
22
- expect(toISODate(date)).toBe("2026-04-03");
23
- });
24
- });
25
- //# sourceMappingURL=date-range.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-range.test.js","sourceRoot":"","sources":["../../src/collector/date-range.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEpC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { graphql } from "@octokit/graphql";
2
- import type { DateRange } from "./date-range.js";
3
- import type { Issue } from "../types.js";
4
- export declare const fetchIssues: (gql: typeof graphql, username: string, range: DateRange) => Promise<Issue[]>;
5
- //# sourceMappingURL=fetch-issues.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-issues.d.ts","sourceRoot":"","sources":["../../src/collector/fetch-issues.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA0CzC,eAAO,MAAM,WAAW,GACtB,KAAK,OAAO,OAAO,EACnB,UAAU,MAAM,EAChB,OAAO,SAAS,KACf,OAAO,CAAC,KAAK,EAAE,CAejB,CAAC"}
@@ -1,31 +0,0 @@
1
- // Fetch issues authored by the user in the date range
2
- import { SEARCH_ISSUES_QUERY } from "./queries.js";
3
- import { toISODate } from "./date-range.js";
4
- const mapState = (state) => state.toLowerCase();
5
- const searchAllPages = async (gql, query) => {
6
- const nodes = [];
7
- let cursor;
8
- let hasNextPage = true;
9
- while (hasNextPage) {
10
- const response = await gql(SEARCH_ISSUES_QUERY, { query, cursor });
11
- nodes.push(...response.search.nodes);
12
- hasNextPage = response.search.pageInfo.hasNextPage;
13
- cursor = response.search.pageInfo.endCursor ?? undefined;
14
- }
15
- return nodes;
16
- };
17
- export const fetchIssues = async (gql, username, range) => {
18
- const from = toISODate(range.from);
19
- const to = toISODate(range.to);
20
- const query = `author:${username} is:issue created:${from}..${to}`;
21
- const nodes = await searchAllPages(gql, query);
22
- return nodes.map((issue) => ({
23
- title: issue.title,
24
- url: issue.url,
25
- repository: issue.repository.nameWithOwner,
26
- state: mapState(issue.state),
27
- createdAt: issue.createdAt,
28
- closedAt: issue.closedAt,
29
- }));
30
- };
31
- //# sourceMappingURL=fetch-issues.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-issues.js","sourceRoot":"","sources":["../../src/collector/fetch-issues.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAGtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAmB5C,MAAM,QAAQ,GAAG,CAAC,KAAyB,EAAkB,EAAE,CAC7D,KAAK,CAAC,WAAW,EAAoB,CAAC;AAExC,MAAM,cAAc,GAAG,KAAK,EAC1B,GAAmB,EACnB,KAAa,EACS,EAAE;IACxB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,MAA0B,CAAC;IAC/B,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,OAAO,WAAW,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAmB,MAAM,GAAG,CACxC,mBAAmB,EACnB,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAmB,EACnB,QAAgB,EAChB,KAAgB,EACE,EAAE;IACpB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,UAAU,QAAQ,qBAAqB,IAAI,KAAK,EAAE,EAAE,CAAC;IAEnE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,aAAa;QAC1C,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { graphql } from "@octokit/graphql";
2
- import type { LanguageBreakdown } from "../types.js";
3
- export declare const fetchLanguages: (gql: typeof graphql, repoNames: string[]) => Promise<LanguageBreakdown[]>;
4
- //# sourceMappingURL=fetch-languages.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-languages.d.ts","sourceRoot":"","sources":["../../src/collector/fetch-languages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAoCrD,eAAO,MAAM,cAAc,GACzB,KAAK,OAAO,OAAO,EACnB,WAAW,MAAM,EAAE,KAClB,OAAO,CAAC,iBAAiB,EAAE,CA+B7B,CAAC"}
@@ -1,42 +0,0 @@
1
- // Fetch language breakdown for active repositories
2
- import { REPO_LANGUAGES_QUERY } from "./queries.js";
3
- const fetchRepoLanguages = async (gql, repoFullName) => {
4
- const [owner, name] = repoFullName.split("/");
5
- try {
6
- const { repository } = await gql(REPO_LANGUAGES_QUERY, {
7
- owner,
8
- name,
9
- });
10
- return repository.languages.edges.map((e) => ({
11
- name: e.node.name,
12
- bytes: e.size,
13
- color: e.node.color ?? "#8b8b8b",
14
- }));
15
- }
16
- catch {
17
- // Repository may be inaccessible with the given token
18
- return [];
19
- }
20
- };
21
- export const fetchLanguages = async (gql, repoNames) => {
22
- const uniqueRepos = [...new Set(repoNames)];
23
- const allLanguages = await Promise.all(uniqueRepos.map((repo) => fetchRepoLanguages(gql, repo)));
24
- const accumulated = allLanguages.flat().reduce((acc, lang) => {
25
- const existing = acc.get(lang.name);
26
- acc.set(lang.name, {
27
- bytes: (existing?.bytes ?? 0) + lang.bytes,
28
- color: existing?.color ?? lang.color,
29
- });
30
- return acc;
31
- }, new Map());
32
- const totalBytes = [...accumulated.values()].reduce((sum, l) => sum + l.bytes, 0);
33
- return [...accumulated.entries()]
34
- .map(([language, { bytes, color }]) => ({
35
- language,
36
- bytes,
37
- percentage: totalBytes > 0 ? (bytes / totalBytes) * 100 : 0,
38
- color,
39
- }))
40
- .sort((a, b) => b.bytes - a.bytes);
41
- };
42
- //# sourceMappingURL=fetch-languages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-languages.js","sourceRoot":"","sources":["../../src/collector/fetch-languages.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAGnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAgBpD,MAAM,kBAAkB,GAAG,KAAK,EAC9B,GAAmB,EACnB,YAAoB,EACuC,EAAE;IAC7D,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,CAAoB,oBAAoB,EAAE;YACxE,KAAK;YACL,IAAI;SACL,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACjB,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;SACjC,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAmB,EACnB,SAAmB,EACW,EAAE;IAChC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,CAC5C,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;YAC1C,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;SACrC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC,EACD,IAAI,GAAG,EAAE,CACV,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CACjD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EACzB,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,QAAQ;QACR,KAAK;QACL,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK;KACN,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { graphql } from "@octokit/graphql";
2
- import type { DateRange } from "./date-range.js";
3
- import type { PullRequest } from "../types.js";
4
- export declare const fetchPullRequests: (gql: typeof graphql, username: string, range: DateRange) => Promise<PullRequest[]>;
5
- //# sourceMappingURL=fetch-pull-requests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-pull-requests.d.ts","sourceRoot":"","sources":["../../src/collector/fetch-pull-requests.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA0C/C,eAAO,MAAM,iBAAiB,GAC5B,KAAK,OAAO,OAAO,EACnB,UAAU,MAAM,EAChB,OAAO,SAAS,KACf,OAAO,CAAC,WAAW,EAAE,CAevB,CAAC"}
@@ -1,31 +0,0 @@
1
- // Fetch pull requests authored by the user in the date range
2
- import { SEARCH_PRS_QUERY } from "./queries.js";
3
- import { toISODate } from "./date-range.js";
4
- const mapState = (state) => state.toLowerCase();
5
- const searchAllPages = async (gql, query) => {
6
- const nodes = [];
7
- let cursor;
8
- let hasNextPage = true;
9
- while (hasNextPage) {
10
- const response = await gql(SEARCH_PRS_QUERY, { query, cursor });
11
- nodes.push(...response.search.nodes);
12
- hasNextPage = response.search.pageInfo.hasNextPage;
13
- cursor = response.search.pageInfo.endCursor ?? undefined;
14
- }
15
- return nodes;
16
- };
17
- export const fetchPullRequests = async (gql, username, range) => {
18
- const from = toISODate(range.from);
19
- const to = toISODate(range.to);
20
- const query = `author:${username} is:pr created:${from}..${to}`;
21
- const nodes = await searchAllPages(gql, query);
22
- return nodes.map((pr) => ({
23
- title: pr.title,
24
- url: pr.url,
25
- repository: pr.repository.nameWithOwner,
26
- state: mapState(pr.state),
27
- createdAt: pr.createdAt,
28
- mergedAt: pr.mergedAt,
29
- }));
30
- };
31
- //# sourceMappingURL=fetch-pull-requests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-pull-requests.js","sourceRoot":"","sources":["../../src/collector/fetch-pull-requests.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAmB5C,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAwB,EAAE,CAChE,KAAK,CAAC,WAAW,EAA0B,CAAC;AAE9C,MAAM,cAAc,GAAG,KAAK,EAC1B,GAAmB,EACnB,KAAa,EACM,EAAE;IACrB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAA0B,CAAC;IAC/B,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,OAAO,WAAW,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAmB,MAAM,GAAG,CACxC,gBAAgB,EAChB,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAmB,EACnB,QAAgB,EAChB,KAAgB,EACQ,EAAE;IAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,UAAU,QAAQ,kBAAkB,IAAI,KAAK,EAAE,EAAE,CAAC;IAEhE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACxB,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa;QACvC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;QACzB,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ;KACtB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { WeeklyReportData } from "../types.js";
2
- export declare const collectWeeklyData: (token: string, username: string) => Promise<WeeklyReportData>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collector/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EACb,UAAU,MAAM,KACf,OAAO,CAAC,gBAAgB,CA6C1B,CAAC"}
@@ -1,50 +0,0 @@
1
- // Main entry point for GitHub data collection
2
- import { graphql } from "@octokit/graphql";
3
- import { buildWeeklyRange, toISODate } from "./date-range.js";
4
- import { fetchContributions } from "./fetch-contributions.js";
5
- import { fetchPullRequests } from "./fetch-pull-requests.js";
6
- import { fetchIssues } from "./fetch-issues.js";
7
- import { fetchLanguages } from "./fetch-languages.js";
8
- import { aggregateRepositories } from "./aggregate.js";
9
- export const collectWeeklyData = async (token, username) => {
10
- const gql = graphql.defaults({
11
- headers: { authorization: `token ${token}` },
12
- });
13
- const range = buildWeeklyRange();
14
- const [contributions, pullRequests, issues] = await Promise.all([
15
- fetchContributions(gql, username, range),
16
- fetchPullRequests(gql, username, range),
17
- fetchIssues(gql, username, range),
18
- ]);
19
- const activeRepoNames = [
20
- ...pullRequests.map((pr) => pr.repository),
21
- ...issues.map((i) => i.repository),
22
- ];
23
- const [languages, repositories] = await Promise.all([
24
- fetchLanguages(gql, activeRepoNames),
25
- Promise.resolve(aggregateRepositories(pullRequests, issues)),
26
- ]);
27
- return {
28
- username: contributions.username,
29
- avatarUrl: contributions.avatarUrl,
30
- dateRange: {
31
- from: toISODate(range.from),
32
- to: toISODate(range.to),
33
- },
34
- stats: {
35
- totalCommits: contributions.totalCommits,
36
- prsOpened: pullRequests.length,
37
- prsMerged: pullRequests.filter((pr) => pr.state === "merged").length,
38
- prsReviewed: contributions.prsReviewed,
39
- issuesOpened: issues.length,
40
- issuesClosed: issues.filter((i) => i.state === "closed").length,
41
- },
42
- dailyCommits: contributions.dailyCommits,
43
- repositories,
44
- languages,
45
- pullRequests,
46
- issues,
47
- aiNarrative: null,
48
- };
49
- };
50
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collector/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,KAAa,EACb,QAAgB,EACW,EAAE;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,KAAK,EAAE,EAAE;KAC7C,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IAEjC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC;QACxC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC;QACvC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC;KAClC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG;QACtB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;QAC1C,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;KACnC,CAAC;IAEF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,cAAc,CAAC,GAAG,EAAE,eAAe,CAAC;QACpC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;KAC7D,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,SAAS,EAAE;YACT,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3B,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;SACxB;QACD,KAAK,EAAE;YACL,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,SAAS,EAAE,YAAY,CAAC,MAAM;YAC9B,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,MAAM;YACpE,WAAW,EAAE,aAAa,CAAC,WAAW;YACtC,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,MAAM;SAChE;QACD,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,MAAM;QACN,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index-page.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-page.test.d.ts","sourceRoot":"","sources":["../../src/deployer/index-page.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { renderIndexPage } from "./index-page.js";
3
- describe("renderIndexPage", () => {
4
- it("produces valid HTML with report links", () => {
5
- const html = renderIndexPage(["2026/W13", "2026/W14"]);
6
- expect(html).toContain("<!DOCTYPE html>");
7
- expect(html).toContain("2026/W14/");
8
- expect(html).toContain("2026/W13/");
9
- });
10
- it("lists reports in reverse chronological order", () => {
11
- const html = renderIndexPage(["2026/W12", "2026/W14", "2026/W13"]);
12
- const w14Pos = html.indexOf("2026/W14");
13
- const w13Pos = html.indexOf("2026/W13");
14
- const w12Pos = html.indexOf("2026/W12");
15
- expect(w14Pos).toBeLessThan(w13Pos);
16
- expect(w13Pos).toBeLessThan(w12Pos);
17
- });
18
- it("includes dofollow footer link", () => {
19
- const html = renderIndexPage(["2026/W14"]);
20
- expect(html).toContain("deariary.com?utm_source=github-weekly-reporter");
21
- expect(html).not.toContain('rel="nofollow"');
22
- });
23
- it("handles empty report list", () => {
24
- const html = renderIndexPage([]);
25
- expect(html).toContain("<!DOCTYPE html>");
26
- expect(html).toContain("Weekly Reports");
27
- });
28
- });
29
- //# sourceMappingURL=index-page.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-page.test.js","sourceRoot":"","sources":["../../src/deployer/index-page.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=week.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"week.test.d.ts","sourceRoot":"","sources":["../../src/deployer/week.test.ts"],"names":[],"mappings":""}
@@ -1,21 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { getWeekId } from "./week.js";
3
- describe("getWeekId", () => {
4
- it("returns correct ISO week for 2026-04-04 (W14)", () => {
5
- const result = getWeekId(new Date("2026-04-04T12:00:00Z"));
6
- expect(result.year).toBe(2026);
7
- expect(result.week).toBe(14);
8
- expect(result.path).toBe("2026/W14");
9
- });
10
- it("returns correct ISO week for 2026-01-01 (W01)", () => {
11
- const result = getWeekId(new Date("2026-01-01T12:00:00Z"));
12
- expect(result.year).toBe(2026);
13
- expect(result.week).toBe(1);
14
- expect(result.path).toBe("2026/W01");
15
- });
16
- it("pads single-digit week numbers", () => {
17
- const result = getWeekId(new Date("2026-02-01T12:00:00Z"));
18
- expect(result.path).toMatch(/^\d{4}\/W\d{2}$/);
19
- });
20
- });
21
- //# sourceMappingURL=week.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"week.test.js","sourceRoot":"","sources":["../../src/deployer/week.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=llm.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.test.d.ts","sourceRoot":"","sources":["../../src/llm/llm.test.ts"],"names":[],"mappings":""}
@@ -1,24 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { generateNarrative } from "./index.js";
3
- const MOCK_INPUT = {
4
- username: "testuser",
5
- avatarUrl: "https://example.com/avatar.png",
6
- dateRange: { from: "2026-03-28", to: "2026-04-03" },
7
- stats: { totalCommits: 10, prsOpened: 2, prsMerged: 1, prsReviewed: 3, issuesOpened: 1, issuesClosed: 0 },
8
- dailyCommits: [],
9
- repositories: [],
10
- languages: [],
11
- pullRequests: [],
12
- issues: [],
13
- };
14
- describe("generateNarrative", () => {
15
- it("returns null and logs warning when LLM call fails", async () => {
16
- const spy = vi.spyOn(console, "warn").mockImplementation(() => { });
17
- const config = { provider: "openai", apiKey: "invalid-key", model: "gpt-4o-mini" };
18
- const result = await generateNarrative(MOCK_INPUT, config);
19
- expect(result).toBeNull();
20
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("LLM narrative generation failed"));
21
- spy.mockRestore();
22
- });
23
- });
24
- //# sourceMappingURL=llm.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.test.js","sourceRoot":"","sources":["../../src/llm/llm.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,UAAU,GAAmB;IACjC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,gCAAgC;IAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE;IACnD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IACzG,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,EAAE;IAChB,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAC9F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,MAAM,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAC3D,CAAC;QAEF,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=prompt.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.test.d.ts","sourceRoot":"","sources":["../../src/llm/prompt.test.ts"],"names":[],"mappings":""}
@@ -1,48 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { buildPrompt } from "./prompt.js";
3
- const MOCK_INPUT = {
4
- username: "testuser",
5
- avatarUrl: "https://example.com/avatar.png",
6
- dateRange: { from: "2026-03-28", to: "2026-04-03" },
7
- stats: {
8
- totalCommits: 42,
9
- prsOpened: 5,
10
- prsMerged: 3,
11
- prsReviewed: 8,
12
- issuesOpened: 2,
13
- issuesClosed: 1,
14
- },
15
- dailyCommits: [],
16
- repositories: [
17
- { name: "org/repo-a", commits: 0, prsOpened: 3, prsMerged: 2, issuesOpened: 1, issuesClosed: 0, url: "" },
18
- ],
19
- languages: [
20
- { language: "TypeScript", bytes: 8000, percentage: 80, color: "#3178c6" },
21
- ],
22
- pullRequests: [],
23
- issues: [],
24
- };
25
- describe("buildPrompt", () => {
26
- it("includes username and date range", () => {
27
- const prompt = buildPrompt(MOCK_INPUT);
28
- expect(prompt).toContain("testuser");
29
- expect(prompt).toContain("2026-03-28");
30
- expect(prompt).toContain("2026-04-03");
31
- });
32
- it("includes stats", () => {
33
- const prompt = buildPrompt(MOCK_INPUT);
34
- expect(prompt).toContain("42 commits");
35
- expect(prompt).toContain("5 PRs opened");
36
- expect(prompt).toContain("3 merged");
37
- });
38
- it("includes repository summary", () => {
39
- const prompt = buildPrompt(MOCK_INPUT);
40
- expect(prompt).toContain("org/repo-a");
41
- });
42
- it("includes language breakdown", () => {
43
- const prompt = buildPrompt(MOCK_INPUT);
44
- expect(prompt).toContain("TypeScript");
45
- expect(prompt).toContain("80.0%");
46
- });
47
- });
48
- //# sourceMappingURL=prompt.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.test.js","sourceRoot":"","sources":["../../src/llm/prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,UAAU,GAAmB;IACjC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,gCAAgC;IAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE;IACnD,KAAK,EAAE;QACL,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;KAChB;IACD,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE;QACZ,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;KAC1G;IACD,SAAS,EAAE;QACT,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;KAC1E;IACD,YAAY,EAAE,EAAE;IAChB,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=renderer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer.test.d.ts","sourceRoot":"","sources":["../../src/renderer/renderer.test.ts"],"names":[],"mappings":""}