github-weekly-reporter 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.
Files changed (147) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +163 -0
  3. package/dist/cli/commands/deploy.d.ts +3 -0
  4. package/dist/cli/commands/deploy.d.ts.map +1 -0
  5. package/dist/cli/commands/deploy.js +55 -0
  6. package/dist/cli/commands/deploy.js.map +1 -0
  7. package/dist/cli/commands/generate.d.ts +3 -0
  8. package/dist/cli/commands/generate.d.ts.map +1 -0
  9. package/dist/cli/commands/generate.js +106 -0
  10. package/dist/cli/commands/generate.js.map +1 -0
  11. package/dist/cli/config.d.ts +11 -0
  12. package/dist/cli/config.d.ts.map +1 -0
  13. package/dist/cli/config.js +16 -0
  14. package/dist/cli/config.js.map +1 -0
  15. package/dist/cli/config.test.d.ts +2 -0
  16. package/dist/cli/config.test.d.ts.map +1 -0
  17. package/dist/cli/config.test.js +32 -0
  18. package/dist/cli/config.test.js.map +1 -0
  19. package/dist/cli/index.d.ts +3 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +13 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/collector/aggregate.d.ts +3 -0
  24. package/dist/collector/aggregate.d.ts.map +1 -0
  25. package/dist/collector/aggregate.js +34 -0
  26. package/dist/collector/aggregate.js.map +1 -0
  27. package/dist/collector/aggregate.test.d.ts +2 -0
  28. package/dist/collector/aggregate.test.d.ts.map +1 -0
  29. package/dist/collector/aggregate.test.js +88 -0
  30. package/dist/collector/aggregate.test.js.map +1 -0
  31. package/dist/collector/date-range.d.ts +7 -0
  32. package/dist/collector/date-range.d.ts.map +1 -0
  33. package/dist/collector/date-range.js +8 -0
  34. package/dist/collector/date-range.js.map +1 -0
  35. package/dist/collector/date-range.test.d.ts +2 -0
  36. package/dist/collector/date-range.test.d.ts.map +1 -0
  37. package/dist/collector/date-range.test.js +25 -0
  38. package/dist/collector/date-range.test.js.map +1 -0
  39. package/dist/collector/fetch-contributions.d.ts +12 -0
  40. package/dist/collector/fetch-contributions.d.ts.map +1 -0
  41. package/dist/collector/fetch-contributions.js +24 -0
  42. package/dist/collector/fetch-contributions.js.map +1 -0
  43. package/dist/collector/fetch-issues.d.ts +5 -0
  44. package/dist/collector/fetch-issues.d.ts.map +1 -0
  45. package/dist/collector/fetch-issues.js +31 -0
  46. package/dist/collector/fetch-issues.js.map +1 -0
  47. package/dist/collector/fetch-languages.d.ts +4 -0
  48. package/dist/collector/fetch-languages.d.ts.map +1 -0
  49. package/dist/collector/fetch-languages.js +42 -0
  50. package/dist/collector/fetch-languages.js.map +1 -0
  51. package/dist/collector/fetch-pull-requests.d.ts +5 -0
  52. package/dist/collector/fetch-pull-requests.d.ts.map +1 -0
  53. package/dist/collector/fetch-pull-requests.js +31 -0
  54. package/dist/collector/fetch-pull-requests.js.map +1 -0
  55. package/dist/collector/index.d.ts +3 -0
  56. package/dist/collector/index.d.ts.map +1 -0
  57. package/dist/collector/index.js +50 -0
  58. package/dist/collector/index.js.map +1 -0
  59. package/dist/collector/queries.d.ts +5 -0
  60. package/dist/collector/queries.d.ts.map +1 -0
  61. package/dist/collector/queries.js +81 -0
  62. package/dist/collector/queries.js.map +1 -0
  63. package/dist/deployer/index-page.d.ts +3 -0
  64. package/dist/deployer/index-page.d.ts.map +1 -0
  65. package/dist/deployer/index-page.js +51 -0
  66. package/dist/deployer/index-page.js.map +1 -0
  67. package/dist/deployer/index-page.test.d.ts +2 -0
  68. package/dist/deployer/index-page.test.d.ts.map +1 -0
  69. package/dist/deployer/index-page.test.js +29 -0
  70. package/dist/deployer/index-page.test.js.map +1 -0
  71. package/dist/deployer/index.d.ts +7 -0
  72. package/dist/deployer/index.d.ts.map +1 -0
  73. package/dist/deployer/index.js +16 -0
  74. package/dist/deployer/index.js.map +1 -0
  75. package/dist/deployer/week.d.ts +7 -0
  76. package/dist/deployer/week.d.ts.map +1 -0
  77. package/dist/deployer/week.js +14 -0
  78. package/dist/deployer/week.js.map +1 -0
  79. package/dist/deployer/week.test.d.ts +2 -0
  80. package/dist/deployer/week.test.d.ts.map +1 -0
  81. package/dist/deployer/week.test.js +21 -0
  82. package/dist/deployer/week.test.js.map +1 -0
  83. package/dist/index.d.ts +8 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +5 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/llm/index.d.ts +4 -0
  88. package/dist/llm/index.d.ts.map +1 -0
  89. package/dist/llm/index.js +25 -0
  90. package/dist/llm/index.js.map +1 -0
  91. package/dist/llm/llm.test.d.ts +2 -0
  92. package/dist/llm/llm.test.d.ts.map +1 -0
  93. package/dist/llm/llm.test.js +24 -0
  94. package/dist/llm/llm.test.js.map +1 -0
  95. package/dist/llm/prompt.d.ts +3 -0
  96. package/dist/llm/prompt.d.ts.map +1 -0
  97. package/dist/llm/prompt.js +31 -0
  98. package/dist/llm/prompt.js.map +1 -0
  99. package/dist/llm/prompt.test.d.ts +2 -0
  100. package/dist/llm/prompt.test.d.ts.map +1 -0
  101. package/dist/llm/prompt.test.js +48 -0
  102. package/dist/llm/prompt.test.js.map +1 -0
  103. package/dist/llm/providers/anthropic.d.ts +3 -0
  104. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  105. package/dist/llm/providers/anthropic.js +17 -0
  106. package/dist/llm/providers/anthropic.js.map +1 -0
  107. package/dist/llm/providers/gemini.d.ts +3 -0
  108. package/dist/llm/providers/gemini.d.ts.map +1 -0
  109. package/dist/llm/providers/gemini.js +13 -0
  110. package/dist/llm/providers/gemini.js.map +1 -0
  111. package/dist/llm/providers/openai.d.ts +3 -0
  112. package/dist/llm/providers/openai.d.ts.map +1 -0
  113. package/dist/llm/providers/openai.js +17 -0
  114. package/dist/llm/providers/openai.js.map +1 -0
  115. package/dist/llm/types.d.ts +11 -0
  116. package/dist/llm/types.d.ts.map +1 -0
  117. package/dist/llm/types.js +3 -0
  118. package/dist/llm/types.js.map +1 -0
  119. package/dist/renderer/helpers.d.ts +3 -0
  120. package/dist/renderer/helpers.d.ts.map +1 -0
  121. package/dist/renderer/helpers.js +22 -0
  122. package/dist/renderer/helpers.js.map +1 -0
  123. package/dist/renderer/index.d.ts +3 -0
  124. package/dist/renderer/index.d.ts.map +1 -0
  125. package/dist/renderer/index.js +45 -0
  126. package/dist/renderer/index.js.map +1 -0
  127. package/dist/renderer/renderer.test.d.ts +2 -0
  128. package/dist/renderer/renderer.test.d.ts.map +1 -0
  129. package/dist/renderer/renderer.test.js +111 -0
  130. package/dist/renderer/renderer.test.js.map +1 -0
  131. package/dist/renderer/themes.d.ts +18 -0
  132. package/dist/renderer/themes.d.ts.map +1 -0
  133. package/dist/renderer/themes.js +180 -0
  134. package/dist/renderer/themes.js.map +1 -0
  135. package/dist/types.d.ts +68 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +3 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +56 -0
  140. package/src/renderer/templates/partials/footer.hbs +3 -0
  141. package/src/renderer/templates/partials/header.hbs +7 -0
  142. package/src/renderer/templates/partials/heatmap.hbs +11 -0
  143. package/src/renderer/templates/partials/languages.hbs +19 -0
  144. package/src/renderer/templates/partials/narrative.hbs +10 -0
  145. package/src/renderer/templates/partials/repositories.hbs +25 -0
  146. package/src/renderer/templates/partials/stats.hbs +8 -0
  147. package/src/renderer/templates/report.hbs +27 -0
@@ -0,0 +1,180 @@
1
+ // Theme CSS definitions for report rendering
2
+ const THEMES = {
3
+ default: {
4
+ bg: "#ffffff",
5
+ bgCard: "#f6f8fa",
6
+ text: "#1f2328",
7
+ textSecondary: "#656d76",
8
+ border: "#d0d7de",
9
+ accent: "#0969da",
10
+ heatmapEmpty: "#ebedf0",
11
+ heatmapL1: "#9be9a8",
12
+ heatmapL2: "#40c463",
13
+ heatmapL3: "#30a14e",
14
+ heatmapL4: "#216e39",
15
+ },
16
+ dark: {
17
+ bg: "#0d1117",
18
+ bgCard: "#161b22",
19
+ text: "#e6edf3",
20
+ textSecondary: "#8b949e",
21
+ border: "#30363d",
22
+ accent: "#58a6ff",
23
+ heatmapEmpty: "#161b22",
24
+ heatmapL1: "#0e4429",
25
+ heatmapL2: "#006d32",
26
+ heatmapL3: "#26a641",
27
+ heatmapL4: "#39d353",
28
+ },
29
+ };
30
+ export const getThemeColors = (theme) => THEMES[theme] ?? THEMES.default;
31
+ export const buildCSS = (theme) => {
32
+ const c = getThemeColors(theme);
33
+ return `
34
+ * { margin: 0; padding: 0; box-sizing: border-box; }
35
+ body {
36
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
37
+ background: ${c.bg};
38
+ color: ${c.text};
39
+ line-height: 1.6;
40
+ padding: 2rem 1rem;
41
+ }
42
+ .container { max-width: 860px; margin: 0 auto; }
43
+
44
+ /* Header */
45
+ .header {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 1rem;
49
+ margin-bottom: 2rem;
50
+ padding-bottom: 1.5rem;
51
+ border-bottom: 1px solid ${c.border};
52
+ }
53
+ .avatar {
54
+ width: 64px;
55
+ height: 64px;
56
+ border-radius: 50%;
57
+ border: 2px solid ${c.border};
58
+ }
59
+ .header-text h1 { font-size: 1.5rem; font-weight: 600; }
60
+ .header-text .date-range { color: ${c.textSecondary}; font-size: 0.875rem; }
61
+
62
+ /* Stats cards */
63
+ .stats {
64
+ display: grid;
65
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
66
+ gap: 0.75rem;
67
+ margin-bottom: 2rem;
68
+ }
69
+ .stat-card {
70
+ background: ${c.bgCard};
71
+ border: 1px solid ${c.border};
72
+ border-radius: 8px;
73
+ padding: 1rem;
74
+ text-align: center;
75
+ }
76
+ .stat-card .value { font-size: 1.75rem; font-weight: 700; color: ${c.accent}; }
77
+ .stat-card .label { font-size: 0.75rem; color: ${c.textSecondary}; text-transform: uppercase; letter-spacing: 0.05em; }
78
+
79
+ /* Section */
80
+ .section { margin-bottom: 2rem; }
81
+ .section h2 {
82
+ font-size: 1.125rem;
83
+ font-weight: 600;
84
+ margin-bottom: 0.75rem;
85
+ padding-bottom: 0.5rem;
86
+ border-bottom: 1px solid ${c.border};
87
+ }
88
+
89
+ /* Heatmap */
90
+ .heatmap {
91
+ display: flex;
92
+ gap: 4px;
93
+ justify-content: center;
94
+ }
95
+ .heatmap-day {
96
+ width: 36px;
97
+ height: 36px;
98
+ border-radius: 4px;
99
+ display: flex;
100
+ flex-direction: column;
101
+ align-items: center;
102
+ justify-content: center;
103
+ font-size: 0.625rem;
104
+ color: ${c.textSecondary};
105
+ }
106
+ .heatmap-day .count { font-weight: 700; font-size: 0.75rem; color: ${c.text}; }
107
+ .heatmap-level-0 { background: ${c.heatmapEmpty}; }
108
+ .heatmap-level-1 { background: ${c.heatmapL1}; }
109
+ .heatmap-level-2 { background: ${c.heatmapL2}; }
110
+ .heatmap-level-3 { background: ${c.heatmapL3}; }
111
+ .heatmap-level-4 { background: ${c.heatmapL4}; }
112
+
113
+ /* Language bar */
114
+ .lang-bar {
115
+ display: flex;
116
+ height: 10px;
117
+ border-radius: 5px;
118
+ overflow: hidden;
119
+ margin-bottom: 0.75rem;
120
+ }
121
+ .lang-bar-segment { height: 100%; }
122
+ .lang-list {
123
+ display: flex;
124
+ flex-wrap: wrap;
125
+ gap: 0.75rem;
126
+ list-style: none;
127
+ font-size: 0.8125rem;
128
+ }
129
+ .lang-list li { display: flex; align-items: center; gap: 0.35rem; }
130
+ .lang-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
131
+ .lang-pct { color: ${c.textSecondary}; }
132
+
133
+ /* Repos table */
134
+ .repo-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
135
+ .repo-table th, .repo-table td {
136
+ padding: 0.5rem 0.75rem;
137
+ text-align: left;
138
+ border-bottom: 1px solid ${c.border};
139
+ }
140
+ .repo-table th {
141
+ font-weight: 600;
142
+ color: ${c.textSecondary};
143
+ font-size: 0.75rem;
144
+ text-transform: uppercase;
145
+ letter-spacing: 0.05em;
146
+ }
147
+ .repo-table a { color: ${c.accent}; text-decoration: none; }
148
+ .repo-table a:hover { text-decoration: underline; }
149
+
150
+ /* AI narrative */
151
+ .narrative {
152
+ background: ${c.bgCard};
153
+ border: 1px solid ${c.border};
154
+ border-radius: 8px;
155
+ padding: 1.25rem;
156
+ font-size: 0.9375rem;
157
+ line-height: 1.75;
158
+ }
159
+
160
+ /* Footer */
161
+ .footer {
162
+ margin-top: 3rem;
163
+ padding-top: 1.5rem;
164
+ border-top: 1px solid ${c.border};
165
+ text-align: center;
166
+ font-size: 0.8125rem;
167
+ color: ${c.textSecondary};
168
+ }
169
+ .footer a { color: ${c.accent}; text-decoration: none; }
170
+ .footer a:hover { text-decoration: underline; }
171
+
172
+ /* Responsive */
173
+ @media (max-width: 600px) {
174
+ .stats { grid-template-columns: repeat(2, 1fr); }
175
+ .header { flex-direction: column; text-align: center; }
176
+ .heatmap-day { width: 28px; height: 28px; }
177
+ }
178
+ `;
179
+ };
180
+ //# sourceMappingURL=themes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/renderer/themes.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAkB7C,MAAM,MAAM,GAA+B;IACzC,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;KACrB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAY,EAAe,EAAE,CAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAU,EAAE;IAC/C,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO;;;;oBAIW,CAAC,CAAC,EAAE;eACT,CAAC,CAAC,IAAI;;;;;;;;;;;;;iCAaY,CAAC,CAAC,MAAM;;;;;;0BAMf,CAAC,CAAC,MAAM;;;wCAGM,CAAC,CAAC,aAAa;;;;;;;;;;oBAUnC,CAAC,CAAC,MAAM;0BACF,CAAC,CAAC,MAAM;;;;;uEAKqC,CAAC,CAAC,MAAM;qDAC1B,CAAC,CAAC,aAAa;;;;;;;;;iCASnC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;eAkB1B,CAAC,CAAC,aAAa;;yEAE2C,CAAC,CAAC,IAAI;qCAC1C,CAAC,CAAC,YAAY;qCACd,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;yBAoBvB,CAAC,CAAC,aAAa;;;;;;;iCAOP,CAAC,CAAC,MAAM;;;;eAI1B,CAAC,CAAC,aAAa;;;;;6BAKD,CAAC,CAAC,MAAM;;;;;oBAKjB,CAAC,CAAC,MAAM;0BACF,CAAC,CAAC,MAAM;;;;;;;;;;;8BAWJ,CAAC,CAAC,MAAM;;;eAGvB,CAAC,CAAC,aAAa;;yBAEL,CAAC,CAAC,MAAM;;;;;;;;;GAS9B,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ export type DailyCommitCount = {
2
+ date: string;
3
+ count: number;
4
+ };
5
+ export type RepositoryActivity = {
6
+ name: string;
7
+ commits: number;
8
+ prsOpened: number;
9
+ prsMerged: number;
10
+ issuesOpened: number;
11
+ issuesClosed: number;
12
+ url: string;
13
+ };
14
+ export type LanguageBreakdown = {
15
+ language: string;
16
+ bytes: number;
17
+ percentage: number;
18
+ color: string;
19
+ };
20
+ export type PullRequest = {
21
+ title: string;
22
+ url: string;
23
+ repository: string;
24
+ state: "open" | "merged" | "closed";
25
+ createdAt: string;
26
+ mergedAt: string | null;
27
+ };
28
+ export type Issue = {
29
+ title: string;
30
+ url: string;
31
+ repository: string;
32
+ state: "open" | "closed";
33
+ createdAt: string;
34
+ closedAt: string | null;
35
+ };
36
+ export type WeeklyStats = {
37
+ totalCommits: number;
38
+ prsOpened: number;
39
+ prsMerged: number;
40
+ prsReviewed: number;
41
+ issuesOpened: number;
42
+ issuesClosed: number;
43
+ };
44
+ export type WeeklyReportData = {
45
+ username: string;
46
+ avatarUrl: string;
47
+ dateRange: {
48
+ from: string;
49
+ to: string;
50
+ };
51
+ stats: WeeklyStats;
52
+ dailyCommits: DailyCommitCount[];
53
+ repositories: RepositoryActivity[];
54
+ languages: LanguageBreakdown[];
55
+ pullRequests: PullRequest[];
56
+ issues: Issue[];
57
+ aiNarrative: string | null;
58
+ };
59
+ export type LLMProvider = "openai" | "anthropic" | "gemini";
60
+ export type Theme = "default" | "dark";
61
+ export type ReportConfig = {
62
+ githubToken: string;
63
+ llmProvider: LLMProvider | null;
64
+ llmApiKey: string | null;
65
+ llmModel: string | null;
66
+ theme: Theme;
67
+ };
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAIF,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5D,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC;CACd,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // Weekly report data types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2BAA2B"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "github-weekly-reporter",
3
+ "version": "0.1.0",
4
+ "description": "Generate beautiful weekly GitHub activity reports with optional AI narratives",
5
+ "type": "module",
6
+ "bin": {
7
+ "github-weekly-reporter": "./dist/cli/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist/",
13
+ "src/renderer/templates/"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "lint": "eslint src/",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "prepublishOnly": "npm run build && npm test"
22
+ },
23
+ "keywords": [
24
+ "github",
25
+ "weekly-report",
26
+ "activity",
27
+ "github-action",
28
+ "developer-tools"
29
+ ],
30
+ "author": "deariary",
31
+ "license": "SEE LICENSE IN LICENSE",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/deariary/github-weekly-reporter.git"
35
+ },
36
+ "engines": {
37
+ "node": ">=24"
38
+ },
39
+ "dependencies": {
40
+ "@anthropic-ai/sdk": "^0.82.0",
41
+ "@google/generative-ai": "^0.24.1",
42
+ "@octokit/graphql": "^8.2.1",
43
+ "commander": "^14.0.3",
44
+ "handlebars": "^4.7.9",
45
+ "openai": "^6.33.0",
46
+ "smol-toml": "^1.6.1"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^9.24.0",
50
+ "@types/node": "^22.14.1",
51
+ "eslint": "^9.24.0",
52
+ "typescript": "^5.8.3",
53
+ "typescript-eslint": "^8.29.1",
54
+ "vitest": "^3.1.1"
55
+ }
56
+ }
@@ -0,0 +1,3 @@
1
+ <footer class="footer">
2
+ <p>Generated by <a href="https://deariary.com?utm_source=github-weekly-reporter&utm_medium=footer">deariary</a></p>
3
+ </footer>
@@ -0,0 +1,7 @@
1
+ <header class="header">
2
+ <img class="avatar" src="{{avatarUrl}}" alt="{{username}}" />
3
+ <div class="header-text">
4
+ <h1>{{username}}'s Weekly Report</h1>
5
+ <p class="date-range">{{dateRange.from}} - {{dateRange.to}}</p>
6
+ </div>
7
+ </header>
@@ -0,0 +1,11 @@
1
+ <div class="section">
2
+ <h2>Contribution Graph</h2>
3
+ <div class="heatmap">
4
+ {{#each dailyCommits}}
5
+ <div class="heatmap-day heatmap-level-{{heatmapLevel this.count}}">
6
+ <span class="count">{{this.count}}</span>
7
+ <span>{{weekday this.date}}</span>
8
+ </div>
9
+ {{/each}}
10
+ </div>
11
+ </div>
@@ -0,0 +1,19 @@
1
+ {{#if languages.length}}
2
+ <div class="section">
3
+ <h2>Languages</h2>
4
+ <div class="lang-bar">
5
+ {{#each languages}}
6
+ <div class="lang-bar-segment" style="width:{{this.percentage}}%;background:{{this.color}}"></div>
7
+ {{/each}}
8
+ </div>
9
+ <ul class="lang-list">
10
+ {{#each languages}}
11
+ <li>
12
+ <span class="lang-dot" style="background:{{this.color}}"></span>
13
+ <span>{{this.language}}</span>
14
+ <span class="lang-pct">{{fixed this.percentage 1}}%</span>
15
+ </li>
16
+ {{/each}}
17
+ </ul>
18
+ </div>
19
+ {{/if}}
@@ -0,0 +1,10 @@
1
+ {{#if aiNarrative}}
2
+ <div class="section">
3
+ <h2>AI Summary</h2>
4
+ <div class="narrative">
5
+ {{#each (paragraphs aiNarrative)}}
6
+ <p>{{this}}</p>
7
+ {{/each}}
8
+ </div>
9
+ </div>
10
+ {{/if}}
@@ -0,0 +1,25 @@
1
+ {{#if repositories.length}}
2
+ <div class="section">
3
+ <h2>Active Repositories</h2>
4
+ <table class="repo-table">
5
+ <thead>
6
+ <tr>
7
+ <th>Repository</th>
8
+ <th>PRs Opened</th>
9
+ <th>PRs Merged</th>
10
+ <th>Issues</th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ {{#each repositories}}
15
+ <tr>
16
+ <td><a href="{{this.url}}">{{this.name}}</a></td>
17
+ <td>{{this.prsOpened}}</td>
18
+ <td>{{this.prsMerged}}</td>
19
+ <td>{{this.issuesOpened}}</td>
20
+ </tr>
21
+ {{/each}}
22
+ </tbody>
23
+ </table>
24
+ </div>
25
+ {{/if}}
@@ -0,0 +1,8 @@
1
+ <div class="stats">
2
+ {{#each statCards}}
3
+ <div class="stat-card">
4
+ <div class="value">{{this.value}}</div>
5
+ <div class="label">{{this.label}}</div>
6
+ </div>
7
+ {{/each}}
8
+ </div>
@@ -0,0 +1,27 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>{{username}}'s Weekly Report ({{dateRange.from}} - {{dateRange.to}})</title>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <meta name="description" content="GitHub activity report: {{stats.totalCommits}} commits, {{stats.prsOpened}} PRs, {{stats.issuesOpened}} issues" />
8
+ <meta property="og:title" content="{{username}}'s Weekly Report ({{dateRange.from}} - {{dateRange.to}})" />
9
+ <meta property="og:description" content="GitHub activity report: {{stats.totalCommits}} commits, {{stats.prsOpened}} PRs, {{stats.issuesOpened}} issues" />
10
+ <meta property="og:image" content="{{avatarUrl}}" />
11
+ <meta property="og:type" content="website" />
12
+ <style>{{{css}}}</style>
13
+ </head>
14
+ <body>
15
+ <div class="container">
16
+
17
+ {{> header}}
18
+ {{> stats}}
19
+ {{> heatmap}}
20
+ {{> languages}}
21
+ {{> repositories}}
22
+ {{> narrative}}
23
+ {{> footer}}
24
+
25
+ </div>
26
+ </body>
27
+ </html>