github-pulse 0.2.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4a836b363e6f499b12bc8db9798d6078bdfb0781630448bb8567caae68e74a6c
4
+ data.tar.gz: 99282f2274e362f811e2e326c5d275cd277135ba843c2386a0674cdeedb84c28
5
+ SHA512:
6
+ metadata.gz: b9d36bdc5f2219309e2a64a353abe142f0e14790ed8fab4575a2421f64af4747ed57126932113c929bbd8c642a31014c986e018e262e52acfe31819b687a3a4d
7
+ data.tar.gz: 0a2a8495c71ba1fe33327f6e53d8bbc8914725ca3d7ec1196f178ab84116012fe917bc8d4f0b604d4ff7a377166e9c56c6cb30b6d907c2978a32af9cfc58734e
data/AGENTS.md ADDED
@@ -0,0 +1,45 @@
1
+ # Repository Guidelines
2
+
3
+ ## Project Structure & Module Organization
4
+ - lib/github/pulse: Core library code (CLI, analyzers, clients, reporters). Example: `lib/github/pulse/cli.rb`.
5
+ - exe/: Executable entrypoint (`exe/github-pulse`).
6
+ - bin/: Dev helpers (`bin/setup`, `bin/console`).
7
+ - pkg/: Built gem artifacts (created by build tasks).
8
+ - Rakefile, Gemfile, *.gemspec: Build and dependency configuration.
9
+
10
+ ## Build, Test, and Development Commands
11
+ - Install deps: `bin/setup` (runs `bundle install`).
12
+ - Run CLI locally: `exe/github-pulse analyze [REPO_PATH] [--repo owner/name] [--format json|pretty|html] [--since YYYY-MM-DD] [--until YYYY-MM-DD]`.
13
+ - Build gem: `rake build` (outputs to `pkg/`).
14
+ - Install gem locally: `bundle exec rake install`.
15
+ - Release (maintainers): `rake release`.
16
+ - Console: `bin/console` to experiment with `Github::Pulse` APIs.
17
+
18
+ ## Coding Style & Naming Conventions
19
+ - Ruby 3.1+, 2-space indentation, frozen string literals (`# frozen_string_literal: true`).
20
+ - Namespace modules under `Github::Pulse`; place files at `lib/github/pulse/<name>.rb`.
21
+ - Method and file names: snake_case; classes/modules: CamelCase.
22
+ - No linter is enforced; follow existing style and keep methods small and composable.
23
+
24
+ ## Testing Guidelines
25
+ - This repository currently has no test suite. If adding tests, prefer RSpec:
26
+ - Directory: `spec/` mirroring `lib/` paths (e.g., `spec/github/pulse/analyzer_spec.rb`).
27
+ - Naming: `*_spec.rb`. Run with `bundle exec rspec`.
28
+ - For manual verification, run:
29
+ - Local git: `exe/github-pulse analyze . --format=pretty`.
30
+ - With GitHub data: set `GITHUB_TOKEN` or authenticate `gh`, then `--format=html` and open the generated report.
31
+
32
+ ## Commit & Pull Request Guidelines
33
+ - Commits: concise imperative subject (<= 72 chars), body with rationale and user-visible impact. Group related changes.
34
+ - Branches: use descriptive names like `feature/report-html`, `fix/commit-stats`.
35
+ - Pull Requests must include:
36
+ - Clear description, checklist of changes, and rationale.
37
+ - Linked issue (if applicable).
38
+ - Usage proof: sample command and excerpt of output (JSON/HTML path).
39
+ - Notes on backward compatibility and dependency changes.
40
+
41
+ ## Security & Configuration Tips
42
+ - GitHub access: provide `--token`, set `GITHUB_TOKEN`, or authenticate `gh`.
43
+ - Do not commit tokens or secrets. Prefer environment variables and `.gitignore`d files.
44
+ - Local analysis requires a valid `.git` repo; GitHub data requires network access and auth.
45
+
data/README.md ADDED
@@ -0,0 +1,186 @@
1
+ # GitHub Pulse
2
+
3
+ GitHub Pulse is a Ruby gem that analyzes GitHub repository activity to provide insights into team contributions, including pull requests, lines of code, and commit activity. It generates visualization-ready JSON output perfect for creating charts and dashboards.
4
+
5
+ ## Features
6
+
7
+ - **Pull Request Analysis**: Track PRs by teammate over time
8
+ - **Lines of Code Analysis**: See current code ownership by contributor
9
+ - **Commit Activity**: Monitor commit patterns and frequency
10
+ - **PR Cycle Time**: Weekly p50/p90/max merge times
11
+ - **PR Size Mix**: Small/medium/large PR composition over time
12
+ - **Open PR Aging**: Buckets of aging open PRs
13
+ - **Commit Heatmap**: Activity by weekday and hour
14
+ - **Local Git Support**: Analyze repositories directly from local git data
15
+ - **GitHub API Integration**: Enhanced data when GitHub token is provided
16
+ - **Visualization-Ready Output**: JSON formatted for easy chart generation
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ ```ruby
23
+ gem 'github-pulse'
24
+ ```
25
+
26
+ And then execute:
27
+
28
+ $ bundle install
29
+
30
+ Or install it yourself as:
31
+
32
+ $ gem install github-pulse
33
+
34
+ ## Usage
35
+
36
+ ### Basic Usage
37
+
38
+ Analyze the current directory (must be a git repository):
39
+
40
+ ```bash
41
+ github-pulse analyze
42
+ ```
43
+
44
+ ### With GitHub API Access
45
+
46
+ For enhanced data including pull requests and detailed statistics, you have three options:
47
+
48
+ #### Option 1: Use GitHub CLI (Recommended)
49
+ If you have the GitHub CLI installed and authenticated, the gem will automatically use it:
50
+
51
+ ```bash
52
+ # Install and authenticate gh CLI (one-time setup)
53
+ brew install gh # or your package manager
54
+ gh auth login
55
+
56
+ # Then just run the analyzer
57
+ github-pulse analyze
58
+ ```
59
+
60
+ #### Option 2: Use Environment Variable
61
+ ```bash
62
+ export GITHUB_TOKEN=your_github_token
63
+ github-pulse analyze
64
+ ```
65
+
66
+ #### Option 3: Pass Token Directly
67
+ ```bash
68
+ github-pulse analyze --token=your_github_token
69
+ ```
70
+
71
+ ### Analyze a Specific Repository
72
+
73
+ ```bash
74
+ # Local repository
75
+ github-pulse analyze /path/to/repo
76
+
77
+ # With GitHub repository specified
78
+ github-pulse analyze --repo=owner/repository --token=your_token
79
+ ```
80
+
81
+ ### Date Filtering
82
+
83
+ Analyze activity within a specific time period:
84
+
85
+ ```bash
86
+ github-pulse analyze --since=2024-01-01 --until=2024-12-31
87
+ ```
88
+
89
+ ### Output Options
90
+
91
+ ```bash
92
+ # Pretty-printed JSON (default: compact JSON)
93
+ github-pulse analyze --format=pretty
94
+
95
+ # Custom output file (default: github-pulse-report.json)
96
+ github-pulse analyze --output=my-report.json
97
+
98
+ # Interactive HTML report
99
+ github-pulse analyze --format=html
100
+
101
+ # Tune PR size buckets (total additions+deletions)
102
+ github-pulse analyze --format=html --small_threshold 50 --medium_threshold 250
103
+ ```
104
+
105
+ ## Output Format
106
+
107
+ The gem generates a comprehensive JSON report with the following structure:
108
+
109
+ ```json
110
+ {
111
+ "metadata": {
112
+ "analyzed_at": "2024-01-15T10:30:00Z",
113
+ "repository": { /* repository details */ },
114
+ "period": { "since": "2024-01-01", "until": "2024-12-31" }
115
+ },
116
+ "pull_requests": {
117
+ "username": {
118
+ "total_prs": 15,
119
+ "merged": 12,
120
+ "open": 2,
121
+ "closed": 1,
122
+ "total_additions": 500,
123
+ "total_deletions": 200,
124
+ "pull_requests": [ /* detailed PR list */ ]
125
+ }
126
+ },
127
+ "commits": {
128
+ "email@example.com": {
129
+ "total_commits": 50,
130
+ "total_additions": 1000,
131
+ "total_deletions": 300,
132
+ "commits": [ /* detailed commit list */ ]
133
+ }
134
+ },
135
+ "lines_of_code": {
136
+ "email@example.com": 5000
137
+ },
138
+ "commit_activity": {
139
+ "2024-01-01": 5,
140
+ "2024-01-02": 3
141
+ },
142
+ "visualization_data": {
143
+ "pull_requests_timeline": [ /* ready for stacked bar chart */ ],
144
+ "lines_of_code_chart": [ /* ready for bar chart */ ],
145
+ "commit_activity_chart": [ /* ready for line chart */ ],
146
+ "commits_timeline": [ /* ready for stacked area chart */ ],
147
+ "lines_changed_timeline": [ /* weekly additions/deletions by author */ ],
148
+ "pr_cycle_time_timeline": [ /* weekly p50/p90/max days */ ],
149
+ "pr_size_mix_timeline": [ /* weekly small/medium/large PR counts */ ],
150
+ "open_prs_aging": { /* aging buckets for open PRs */ },
151
+ "commit_activity_heatmap": [[ /* 7x24 grid of commit counts */ ]]
152
+ }
153
+ }
154
+ ```
155
+
156
+ ## Visualization Data
157
+
158
+ The `visualization_data` section contains pre-formatted data ready for charting libraries:
159
+
160
+ - **pull_requests_timeline**: Data for stacked bar charts showing PRs by author over time
161
+ - **lines_of_code_chart**: Bar chart data showing current code ownership
162
+ - **commit_activity_chart**: Line chart data for overall repository activity
163
+ - **commits_timeline**: Stacked area chart data for commits by author over time
164
+ - **lines_changed_timeline**: Weekly additions/deletions by author (GitHub stats)
165
+ - **pr_cycle_time_timeline**: Weekly median/percentile merge times (days)
166
+ - **pr_size_mix_timeline**: Weekly mix of small/medium/large PRs
167
+ - **open_prs_aging**: Counts of open PRs bucketed by age
168
+ - **commit_activity_heatmap**: 7 rows (Sun–Sat) x 24 columns (hours)
169
+
170
+ ## Requirements
171
+
172
+ - Ruby 3.1 or higher
173
+ - Git (for local repository analysis)
174
+ - GitHub personal access token (optional, for enhanced features)
175
+
176
+ ## Development
177
+
178
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
179
+
180
+ To install this gem onto your local machine, run `bundle exec rake install`.
181
+
182
+ Note: Some PR metrics (size, timestamps) are richer when authenticated via GitHub CLI (`gh auth login`) or with `GITHUB_TOKEN`. Octokit list endpoints may omit additions/deletions; the HTML report will gracefully degrade when fields are unavailable.
183
+
184
+ ## Contributing
185
+
186
+ Bug reports and pull requests are welcome on GitHub at https://github.com/usiegj00/github-pulse.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
data/exe/github-pulse ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "github/pulse"
5
+
6
+ Github::Pulse::CLI.start(ARGV)
@@ -0,0 +1,330 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>GitHub Pulse Report - usiegj00/github-pulse</title>
7
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/date-fns@2.29.3/index.min.js"></script>
9
+ <style>
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ }
15
+ body {
16
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
17
+ line-height: 1.6;
18
+ color: #333;
19
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
20
+ min-height: 100vh;
21
+ padding: 20px;
22
+ }
23
+ .container {
24
+ max-width: 1400px;
25
+ margin: 0 auto;
26
+ background: rgba(255, 255, 255, 0.95);
27
+ border-radius: 20px;
28
+ padding: 30px;
29
+ box-shadow: 0 20px 60px rgba(0,0,0,0.3);
30
+ }
31
+ h1 {
32
+ color: #2d3748;
33
+ margin-bottom: 10px;
34
+ font-size: 2.5em;
35
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
36
+ -webkit-background-clip: text;
37
+ -webkit-text-fill-color: transparent;
38
+ }
39
+ .subtitle {
40
+ color: #718096;
41
+ margin-bottom: 30px;
42
+ font-size: 1.1em;
43
+ }
44
+ .stats-grid {
45
+ display: grid;
46
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
47
+ gap: 20px;
48
+ margin-bottom: 40px;
49
+ }
50
+ .stat-card {
51
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
52
+ color: white;
53
+ padding: 20px;
54
+ border-radius: 15px;
55
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
56
+ }
57
+ .stat-value {
58
+ font-size: 2em;
59
+ font-weight: bold;
60
+ margin-bottom: 5px;
61
+ }
62
+ .stat-label {
63
+ opacity: 0.9;
64
+ font-size: 0.9em;
65
+ text-transform: uppercase;
66
+ letter-spacing: 1px;
67
+ }
68
+ .charts-grid {
69
+ display: grid;
70
+ grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
71
+ gap: 30px;
72
+ margin-bottom: 30px;
73
+ }
74
+ .chart-container {
75
+ background: white;
76
+ padding: 25px;
77
+ border-radius: 15px;
78
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
79
+ }
80
+ .chart-title {
81
+ font-size: 1.3em;
82
+ color: #2d3748;
83
+ margin-bottom: 20px;
84
+ font-weight: 600;
85
+ }
86
+ canvas {
87
+ max-height: 400px;
88
+ }
89
+ .contributors-table {
90
+ background: white;
91
+ border-radius: 15px;
92
+ padding: 25px;
93
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
94
+ margin-top: 30px;
95
+ }
96
+ table {
97
+ width: 100%;
98
+ border-collapse: collapse;
99
+ }
100
+ th {
101
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
102
+ color: white;
103
+ padding: 12px;
104
+ text-align: left;
105
+ font-weight: 600;
106
+ }
107
+ td {
108
+ padding: 12px;
109
+ border-bottom: 1px solid #e2e8f0;
110
+ }
111
+ tr:hover {
112
+ background-color: #f7fafc;
113
+ }
114
+ .progress-bar {
115
+ width: 100%;
116
+ height: 20px;
117
+ background: #e2e8f0;
118
+ border-radius: 10px;
119
+ overflow: hidden;
120
+ }
121
+ .progress-fill {
122
+ height: 100%;
123
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
124
+ border-radius: 10px;
125
+ transition: width 0.3s ease;
126
+ }
127
+ .metadata {
128
+ background: #f7fafc;
129
+ padding: 15px;
130
+ border-radius: 10px;
131
+ margin-bottom: 30px;
132
+ display: flex;
133
+ justify-content: space-between;
134
+ flex-wrap: wrap;
135
+ gap: 20px;
136
+ }
137
+ .metadata-item {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 10px;
141
+ }
142
+ .metadata-label {
143
+ font-weight: 600;
144
+ color: #4a5568;
145
+ }
146
+ .no-data {
147
+ text-align: center;
148
+ padding: 40px;
149
+ color: #718096;
150
+ font-style: italic;
151
+ }
152
+ </style>
153
+ </head>
154
+ <body>
155
+ <div class="container">
156
+ <h1>GitHub Pulse Report</h1>
157
+ <div class="subtitle">Repository Activity Analysis</div>
158
+
159
+ <div class="metadata"><div class="metadata-item"><span class="metadata-label">Repository:</span> usiegj00/github-pulse</div><div class="metadata-item"><span class="metadata-label">Analyzed:</span> August 08, 2025 at 06:39 PM</div></div>
160
+ <div class="stats-grid">
161
+ <div class="stat-card">
162
+ <div class="stat-value">1</div>
163
+ <div class="stat-label">Contributors</div>
164
+ </div>
165
+ <div class="stat-card">
166
+ <div class="stat-value">1</div>
167
+ <div class="stat-label">Total Commits</div>
168
+ </div>
169
+ <div class="stat-card">
170
+ <div class="stat-value">0</div>
171
+ <div class="stat-label">Pull Requests</div>
172
+ </div>
173
+ <div class="stat-card">
174
+ <div class="stat-value">301</div>
175
+ <div class="stat-label">Lines of Code</div>
176
+ </div>
177
+ <div class="stat-card">
178
+ <div class="stat-value">+2,039</div>
179
+ <div class="stat-label">Additions</div>
180
+ </div>
181
+ <div class="stat-card">
182
+ <div class="stat-value">-0</div>
183
+ <div class="stat-label">Deletions</div>
184
+ </div>
185
+ </div>
186
+
187
+
188
+ <div class="charts-grid">
189
+ <div class="chart-container">
190
+ <h3 class="chart-title">Daily Commit Activity</h3>
191
+ <canvas id="commitActivityChart"></canvas>
192
+ </div>
193
+
194
+ <div class="chart-container">
195
+ <h3 class="chart-title">Lines of Code by Contributor</h3>
196
+ <canvas id="linesOfCodeChart"></canvas>
197
+ </div>
198
+
199
+ <div class="chart-container">
200
+ <h3 class="chart-title">Commits Over Time</h3>
201
+ <canvas id="commitsTimelineChart"></canvas>
202
+ </div>
203
+
204
+
205
+ <div class="chart-container"><div class="no-data">No pull requests data available</div></div>
206
+ <div class="chart-container"><div class="no-data">No pull requests data available</div></div>
207
+ <div class="chart-container"><div class="no-data">No PR cycle time data available</div></div>
208
+ <div class="chart-container"><div class="no-data">No PR size data available</div></div>
209
+ <div class="chart-container"><div class="no-data">No open PRs</div></div>
210
+ </div>
211
+ <div class="chart-container">
212
+ <h3 class="chart-title">Commit Activity Heatmap</h3>
213
+ <div style="overflow:auto">
214
+ <table>
215
+ <thead>
216
+ <tr><th></th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>10</th><th>11</th><th>12</th><th>13</th><th>14</th><th>15</th><th>16</th><th>17</th><th>18</th><th>19</th><th>20</th><th>21</th><th>22</th><th>23</th></tr>
217
+ </thead>
218
+ <tbody>
219
+ <tr><th style="position:sticky;left:0;background:#fff;">Sun</th><td title="Sun 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sun 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Mon</th><td title="Mon 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Mon 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Tue</th><td title="Tue 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Tue 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Wed</th><td title="Wed 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 9:00 — 1" style="background: rgba(102,126,234,0.19); text-align:center; font-size: 12px;">1</td><td title="Wed 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Wed 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Thu</th><td title="Thu 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Thu 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Fri</th><td title="Fri 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Fri 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr><tr><th style="position:sticky;left:0;background:#fff;">Sat</th><td title="Sat 0:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 1:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 2:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 3:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 4:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 5:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 6:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 7:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 8:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 9:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 10:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 11:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 12:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 13:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 14:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 15:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 16:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 17:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 18:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 19:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 20:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 21:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 22:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td><td title="Sat 23:00 — 0" style="background: rgba(102,126,234,0.1); text-align:center; font-size: 12px;">0</td></tr>
220
+ </tbody>
221
+ </table>
222
+ </div>
223
+ </div>
224
+
225
+
226
+ <div class="contributors-table">
227
+ <h3 class="chart-title">Contributor Statistics</h3>
228
+ <table>
229
+ <thead>
230
+ <tr>
231
+ <th>Contributor</th>
232
+ <th>Commits</th>
233
+ <th>Activity</th>
234
+ <th>Additions</th>
235
+ <th>Deletions</th>
236
+ <th>Current Lines</th>
237
+ <th>Pull Requests</th>
238
+ </tr>
239
+ </thead>
240
+ <tbody>
241
+ <tr>
242
+ <td>248302+usiegj00@users.noreply.github.com</td>
243
+ <td>1</td>
244
+ <td>
245
+ <div class="progress-bar">
246
+ <div class="progress-fill" style="width: 100%"></div>
247
+ </div>
248
+ </td>
249
+ <td>+2,039</td>
250
+ <td>-0</td>
251
+ <td>301 lines</td>
252
+ <td>0 PRs</td>
253
+ </tr>
254
+
255
+ </tbody>
256
+ </table>
257
+ </div>
258
+
259
+ </div>
260
+
261
+ <script>
262
+ new Chart(document.getElementById('commitActivityChart'), {
263
+ type: 'line',
264
+ data: {
265
+ labels: ['2025-08-06'],
266
+ datasets: [{
267
+ label: 'Commits',
268
+ data: [1],
269
+ borderColor: '#667eea',
270
+ backgroundColor: 'rgba(102, 126, 234, 0.1)',
271
+ tension: 0.4,
272
+ fill: true
273
+ }]
274
+ },
275
+ options: {
276
+ responsive: true,
277
+ maintainAspectRatio: false,
278
+ plugins: {
279
+ legend: { display: false }
280
+ },
281
+ scales: {
282
+ y: { beginAtZero: true }
283
+ }
284
+ }
285
+ });
286
+
287
+ new Chart(document.getElementById('linesOfCodeChart'), {
288
+ type: 'bar',
289
+ data: {
290
+ labels: ['248302+usiegj00@users.noreply.github.com'],
291
+ datasets: [{
292
+ label: 'Lines of Code',
293
+ data: [301],
294
+ backgroundColor: [
295
+ '#667eea', '#764ba2', '#f093fb', '#f5576c',
296
+ '#4facfe', '#00f2fe', '#43e97b', '#fa709a'
297
+ ]
298
+ }]
299
+ },
300
+ options: {
301
+ responsive: true,
302
+ maintainAspectRatio: false,
303
+ plugins: {
304
+ legend: { display: false }
305
+ },
306
+ scales: {
307
+ y: { beginAtZero: true }
308
+ }
309
+ }
310
+ });
311
+
312
+ new Chart(document.getElementById('commitsTimelineChart'), {
313
+ type: 'bar',
314
+ data: {
315
+ labels: ['2025-08-04'],
316
+ datasets: [{"label":"248302+usiegj00@users.noreply.github.com","data":[1],"backgroundColor":"#667eea","borderColor":"#667eea"}]
317
+ },
318
+ options: {
319
+ responsive: true,
320
+ maintainAspectRatio: false,
321
+ scales: {
322
+ x: { stacked: true },
323
+ y: { stacked: true, beginAtZero: true }
324
+ }
325
+ }
326
+ });
327
+
328
+ </script>
329
+ </body>
330
+ </html>