mirror of
https://github.com/LukeHagar/stats-action.git
synced 2025-12-06 04:21:26 +00:00
227 lines
5.8 KiB
Markdown
227 lines
5.8 KiB
Markdown
# GitHub Stats Action
|
|
|
|
A GitHub Action that collects comprehensive statistics for a user's GitHub profile and outputs them to a JSON file. Perfect for building profile READMEs, dashboards, or personal analytics.
|
|
|
|
## Features
|
|
|
|
- **Profile Data**: Name, bio, company, location, social links
|
|
- **Contribution Stats**: Total contributions, streaks, most active day, monthly breakdown
|
|
- **Repository Metrics**: Stars, forks, views, top repositories
|
|
- **Code Statistics**: Lines added/deleted, commit counts, languages with percentages
|
|
- **Social Stats**: Followers, following, stars given
|
|
- **Activity Data**: Pull requests, issues, PR reviews, discussions
|
|
|
|
## Requirements
|
|
|
|
### Personal Access Token (PAT)
|
|
|
|
This action **requires a Personal Access Token** - the default `GITHUB_TOKEN` will not work because:
|
|
|
|
- Contribution calendar data requires authentication as the actual user
|
|
- Repository view counts require push access across all repositories
|
|
- The `viewer` GraphQL query returns data for the token owner
|
|
|
|
#### Required PAT Scopes
|
|
|
|
| Scope | Purpose |
|
|
|-------|---------|
|
|
| `read:user` | Access user profile data |
|
|
| `repo` | Access repository statistics, views, and private repos |
|
|
|
|
#### Creating a PAT
|
|
|
|
1. Go to [GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens](https://github.com/settings/tokens?type=beta)
|
|
2. Click "Generate new token"
|
|
3. Select the scopes listed above
|
|
4. Copy the token and add it as a repository secret (e.g., `USER_PAT`)
|
|
|
|
## Usage
|
|
|
|
### Basic Workflow
|
|
|
|
Create `.github/workflows/stats.yaml`:
|
|
|
|
```yaml
|
|
name: Collect GitHub Stats
|
|
|
|
on:
|
|
schedule:
|
|
- cron: '0 0 * * *' # Run daily at midnight
|
|
workflow_dispatch: # Allow manual trigger
|
|
|
|
jobs:
|
|
collect-stats:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Collect GitHub Stats
|
|
uses: LukeHagar/stats-action@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.USER_PAT }}
|
|
|
|
- name: Commit stats
|
|
uses: stefanzweifel/git-auto-commit-action@v5
|
|
with:
|
|
commit_message: "chore: update github stats"
|
|
file_pattern: github-user-stats.json
|
|
```
|
|
|
|
### Template Repository
|
|
|
|
For a complete setup with visualization, use the [stats template repository](https://github.com/LukeHagar/stats/).
|
|
|
|
## Output
|
|
|
|
The action creates a `github-user-stats.json` file with the following structure:
|
|
|
|
### Profile Information
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `name` | string | Display name |
|
|
| `username` | string | GitHub username |
|
|
| `avatarUrl` | string | Profile picture URL |
|
|
| `bio` | string \| null | Profile bio |
|
|
| `company` | string \| null | Company name |
|
|
| `location` | string \| null | Location |
|
|
| `email` | string \| null | Public email |
|
|
| `twitterUsername` | string \| null | Twitter/X handle |
|
|
| `websiteUrl` | string \| null | Website URL |
|
|
| `createdAt` | string | Account creation date (ISO 8601) |
|
|
|
|
### Statistics
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `totalCommits` | number | Total commits (from GitHub search) |
|
|
| `commitCount` | number | Commits from contributor stats |
|
|
| `totalPullRequests` | number | Total PRs created |
|
|
| `totalPullRequestReviews` | number | Total PR reviews |
|
|
| `totalContributions` | number | All-time contributions |
|
|
| `openIssues` | number | Open issues created |
|
|
| `closedIssues` | number | Closed issues created |
|
|
| `discussionsStarted` | number | Discussions started |
|
|
| `discussionsAnswered` | number | Discussion answers marked as correct |
|
|
| `repositoriesContributedTo` | number | Repos contributed to |
|
|
|
|
### Repository Metrics
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `starCount` | number | Total stars received |
|
|
| `forkCount` | number | Total forks of your repos |
|
|
| `starsGiven` | number | Repos you've starred |
|
|
| `repoViews` | number | Total repo views (last 14 days) |
|
|
|
|
### Code Statistics
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `linesAdded` | number | Total lines added |
|
|
| `linesDeleted` | number | Total lines deleted |
|
|
| `linesOfCodeChanged` | number | Total lines changed (added + deleted) |
|
|
| `codeByteTotal` | number | Total bytes of code |
|
|
|
|
### Social
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `followers` | number | Follower count |
|
|
| `following` | number | Following count |
|
|
|
|
### Languages
|
|
|
|
```json
|
|
{
|
|
"topLanguages": [
|
|
{
|
|
"languageName": "TypeScript",
|
|
"color": "#3178c6",
|
|
"value": 1234567,
|
|
"percentage": 45.5
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Contribution Stats
|
|
|
|
```json
|
|
{
|
|
"contributionStats": {
|
|
"longestStreak": 42,
|
|
"currentStreak": 7,
|
|
"mostActiveDay": "Tuesday",
|
|
"averagePerDay": 3.5,
|
|
"averagePerWeek": 24.5,
|
|
"averagePerMonth": 105.0,
|
|
"monthlyBreakdown": [
|
|
{ "month": "2024-01", "contributions": 120 }
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Top Repositories
|
|
|
|
```json
|
|
{
|
|
"topRepos": [
|
|
{
|
|
"name": "repo-name",
|
|
"description": "Repo description",
|
|
"stars": 100,
|
|
"forks": 25,
|
|
"isArchived": false,
|
|
"primaryLanguage": "TypeScript",
|
|
"updatedAt": "2024-01-15T10:30:00Z",
|
|
"createdAt": "2023-06-01T08:00:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Full Contribution Calendar
|
|
|
|
The `contributionsCollection` field contains the complete contribution calendar with daily data for building heatmaps.
|
|
|
|
## Development
|
|
|
|
### Prerequisites
|
|
|
|
- [Bun](https://bun.sh) v1.0+
|
|
|
|
### Setup
|
|
|
|
```bash
|
|
# Install dependencies
|
|
bun install
|
|
|
|
# Run locally (requires GITHUB_TOKEN env var)
|
|
export GITHUB_TOKEN=your_pat_here
|
|
bun run start
|
|
|
|
# Run tests
|
|
bun test
|
|
|
|
# Type check
|
|
bun run typecheck
|
|
```
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
├── src/
|
|
│ ├── index.ts # Main action logic
|
|
│ ├── index.test.ts # Tests
|
|
│ └── Types.ts # TypeScript type definitions
|
|
├── action.yml # GitHub Action definition
|
|
├── package.json
|
|
└── tsconfig.json
|
|
```
|
|
|
|
## License
|
|
|
|
MIT - see [LICENSE.md](LICENSE.md)
|