Generate comprehensive status reports for git repositories. Analyzes commits, codebase structure, type errors, branch health, dependency status, GitHub PRs/issues/CI, working tree changes, and optionally integrates with `td` (task management CLI) if a `.todos` folder is present.
**TRIGGERS - Use this skill when:**
- User asks for the status of a git project or repo
- User asks "what's going on in [project]" or "give me an overview of [repo]"
- User wants a project summary, progress report, o...
Installs into .claude/skills of the current project.
Are you the author of Git Project Status?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/espennilsen-git-project-status)
---
name: git-project-status
description: |
Generate comprehensive status reports for git repositories. Analyzes commits, codebase structure, type errors, branch health, dependency status, GitHub PRs/issues/CI, working tree changes, and optionally integrates with `td` (task management CLI) if a `.todos` folder is present.
**TRIGGERS - Use this skill when:**
- User asks for the status of a git project or repo
- User asks "what's going on in [project]" or "give me an overview of [repo]"
- User wants a project summary, progress report, or codebase overview
- User asks about recent commits, code structure, or project health
- User says "check my project" or "project status"
**Output:** A rich, structured text report covering overview, branches, commit history, codebase breakdown, GitHub activity, dependency health, issues/errors, working tree changes, task management, and summary.
---
# Git Project Status Skill
Generate a comprehensive status report for one or more git repositories.
## Usage
**Path resolution (in priority order):**
1. **Full path provided** — use it directly
2. **Only a project name mentioned** (e.g. "check pi-crm-personal") — look in `/Users/espen/Dev/<project-name>`
3. **No path or name specified** — use the current working directory (`.`)
Never ask the user for a path — resolve it using the rules above and run the report. The skill produces a structured report for each repo.
## Report Structure
Each report MUST include these sections in order. Sections marked **(Conditional)** are only included when the relevant tool/data is available.
---
### 1. Overview
- Project name (from directory name or package.json/Cargo.toml/pyproject.toml)
- Version (from package manifest if available)
- Brief description (from README.md first paragraph, or package manifest description)
- When the project was started (first commit date)
- Current branch and whether working tree is clean/dirty
- Repo visibility (public/private) — if GitHub origin is detected
### 2. Branches
- Current branch name (highlighted with `*`)
- List all local branches with:
- How far ahead/behind the default branch (main/master) each branch is
- Last commit date on each branch
- Flag stale branches (no commits in >30 days) with ⚠
- Show total branch count
Format example:
Branches (4 total)
* feature/typescript-refactor +12 ahead, 3 behind main (last: 2h ago)
main up to date (last: 3d ago)
fix/webhook-retry +2 ahead (last: 5d ago)
old/experiment +1 ahead (last: 45d ago) ⚠ stale
### 3. Progress (Commit History)
- Total commit count
- Date range of commits
- A table of recent commits (up to 5) showing:
- Short hash (6 chars)
- Commit message (first line, truncated to fit column)
Format as a simple two-column list — hash followed by message. Truncate long messages with "…".
d7bd8b feat: Integrate pi-crm-personal extension
e0469f deps: Add pi-crm-personal as file: dependency
6638a4 fix(heartbeat): normalize db health-check path in checklist
8770c4 chore: update agent name note and add start:tui script
bedca7 Merge 'hannah/td-2f5211-workon' — workon tool, cross-proj…
### 4. Codebase Overview
- Total lines of code and total number of source files
- Language breakdown by percentage of lines (show as a compact bar or list)
Format example:
Codebase (3,420 lines across 18 files)
TypeScript 82% ████████████████░░░░ 2,804 lines
HTML 9% ██░░░░░░░░░░░░░░░░░░ 308 lines
SQL 5% █░░░░░░░░░░░░░░░░░░░ 171 lines
Shell 4% █░░░░░░░░░░░░░░░░░░░ 137 lines
**Counting rules:**
- Group by language, not file extension (e.g. .ts and .tsx both count as TypeScript, .js and .jsx as JavaScript)
- Always exclude: node_modules, .git, vendor, dist, build, target, __pycache__, .next, .nuxt, coverage, lock files
- Also exclude generated files (*.min.js, *.map, *.d.ts)
- Use a simple bar visualization (█ and ░) — 20 chars wide, proportional to percentage
### 5. GitHub Activity (Conditional)
**Only include this section if the git remote origin points to GitHub (github.com) AND the `gh` CLI is available and authenticated.**
Detect GitHub origin:
```bash
git remote get-url origin 2>/dev/null | grep -q "github.com"
```
Check `gh` is available and authenticated:
```bash
gh auth status 2>/dev/null
```
If both conditions are met, include:
#### Open Pull Requests
```bash
gh pr list --state open --json number,title,headRefName,author,reviewDecision,statusCheckRollup,updatedAt --limit 20
```
Show for each PR:
- PR number and title
- Branch name
- Author
- Review status (APPROVED, CHANGES_REQUESTED, REVIEW_REQUIRED, or pending)
- CI check status (passing ✅, failing ❌, pending ⏳)
#### Open Issues
```bash
gh issue list --state open --json number,title,labels,assignees,createdAt --limit 20
```
Show for each issue:
- Issue number and title
- Labels
- Assignee (if any)
#### Recent Merged PRs
```bash
gh pr list --state merged --json number,title,mergedAt,author --limit 5
```
Show the 5 most recently merged PRs with merge date.
#### CI/CD Status
```bash
gh run list --limit 5 --json databaseId,displayTitle,status,conclusion,headBranch,createdAt
```
Show the 5 most recent workflow runs with:
- Workflow name
- Branch
- Status/conclusion (success ✅, failure ❌, in_progress ⏳, cancelled ⊘)
- When it ran
If `gh` is not available or not authenticated, skip this entire section silently (do not show an error or placeholder).
### 6. Dependencies Health (Conditional)
**Only include if the project has a dependency manifest.**
Check for outdated packages based on project type:
- **Node.js** (package.json exists):
```bash
npm outdated --json 2>/dev/null
```
Show: package name, current version, wanted version, latest version. Highlight major version bumps.
- **Rust** (Cargo.toml exists):
```bash
cargo outdated 2>/dev/null
```
- **Python** (requirements.txt or pyproject.toml exists):
```bash
pip list --outdated --format=json 2>/dev/null
```
- **Go** (go.mod exists):
```bash
go list -u -m all 2>/dev/null
```
Format as a compact table if there are outdated deps:
Dependencies (3 outdated of 24 total)
typescript 5.3.3 → 5.6.2 (major)
eslint 8.56.0 → 8.57.0 (minor)
@types/node 20.11 → 20.14 (minor)
If all dependencies are up to date, say "All N dependencies are up to date."
If the outdated check tool is not available, skip gracefully.
### 7. Issues / Errors
Run appropriate type-checking or linting commands based on the project type:
- **TypeScript**: `npx tsc --noEmit 2>&1` (if tsconfig.json exists)
- **Python**: `python -m py_compile` on source files, or `mypy` if configured
- **Rust**: `cargo check 2>&1` (if Cargo.toml exists)
- **Go**: `go vet ./...` (if go.mod exists)
If no errors are found, say "No type errors or lint issues detected."
If errors are found:
- Count them
- List unique error types with file locations
- Provide a brief analysis of the root cause
**IMPORTANT**: Install dependencies first if needed (check for node_modules, etc.) but do so silently. If type-checking tools aren't available or fail to install, skip this section gracefully and note it.
### 8. TODO / FIXME / HACK Markers
Scan all source files for common debt markers:
```bash
grep -rn --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" \
--include="*.py" --include="*.rs" --include="*.go" \
-E "(TODO|FIXME|HACK|XXX|WORKAROUND|TEMP)(\(|:| )" . \
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=build
```
Format as a compact list grouped by marker type:
Code Markers (7 found)
TODO (4):
src/db.ts:42 — add migration rollback support
src/tool.ts:118 — handle edge case for empty contacts
src/web.ts:55 — add pagination
src/web.ts:201 — rate limiting
FIXME (2):
src/registry.ts:88 — race condition on concurrent register
src/tool.ts:340 — incorrect type cast
HACK (1):
src/db.ts:167 — temporary workaround for SQLite locking
If none found, say "No TODO/FIXME/HACK markers found."
### 9. Test Status (Conditional)
**Only include if a test runner is detected.**
Detect test configuration:
- **Node.js**: check for `jest`, `vitest`, `mocha` in package.json scripts or devDependencies
- **Rust**: `cargo test` (always available)
- **Python**: check for `pytest`, `unittest` config
- **Go**: `go test ./...` (always available)
Run the test suite and report:
```bash
# Node.js example:
npx vitest run --reporter=verbose 2>&1 # or npm test
```
Show:
- Total tests, passed ✅, failed ❌, skipped ⏭
- If coverage is available, show overall coverage percentage
- List any failing test names
Format example:
Tests (vitest)
32 passed ✅ 2 failed ❌ 1 skipped ⏭
Failures:
src/db.test.ts > migrations > should rollback on error
src/tool.test.ts > actions > should validate contact fields
Coverage: 74% lines (if available)
If no test runner is detected, skip this section silently.
**IMPORTANT**: Run tests with a timeout. If tests hang or take longer than 60 seconds, kill the process and note "Tests timed out after 60s."
### 10. Secrets Exposure Check
Quick scan for potentially leaked secrets in tracked files:
```bash
# Check for common secret patterns in tracked files
git grep -lnE "(PRIVATE_KEY|SECRET_KEY|API_KEY|PASSWORD|TOKEN|Bearer )['\"]?=" -- '*.ts' '*.js' '*.py' '*.env*' '*.json' '*.yaml' '*.yml' 2>/dev/null
# Check if .env files are tracked
git ls-files | grep -E "^\.env"
# Check if common sensitive files are in .gitignore
```
Report:
- Whether `.env` files are tracked (⚠ warning if they are)
- Any files containing patterns that look like hardcoded secrets
- Whether `.gitignore` covers common sensitive patterns (.env, *.pem, *.key)
Format example:
Secrets Check
⚠ .env is tracked in git — should be in .gitignore
⚠ src/config.ts:12 — contains hardcoded API_KEY pattern
✅ .gitignore covers: .env, *.pem, *.key
If everything looks clean: "✅ No secrets exposure detected."
### 11. Uncommitted Changes (Conditional)
**Only include this section if the working tree is dirty (has uncommitted changes).**
Show a breakdown of:
- **Staged changes** (ready to commit):
```bash
git diff --cached --stat
```
- **Unstaged changes** (modified but not staged):
```bash
git diff --stat
```
- **Untracked files**:
```bash
git ls-files --others --exclude-standard
```
Format example:
Uncommitted Changes
Staged (2 files):
M src/tool.ts (+15, -3)
A src/newfile.ts (+42)
Unstaged (1 file):
M src/db.ts (+8, -2)
Untracked (1 file):
src/experimental.ts
If the working tree is clean, skip this section entirely.
### 12. Task Management (Conditional)
**Only include this section if a `.todos` directory exists in the project root.**
Run `td usage` and include the output, covering:
- Current session info
- Work session details
- Focused issue
- In-progress issues
- Issues awaiting review
Format this under a "Task Management" heading.
### 13. Summary
A 2-3 sentence summary covering:
- Overall project maturity/stage
- Working tree status (clean/dirty, uncommitted changes count)
- Key action items (errors to fix, PRs awaiting review, outdated deps, stale branches, CI failures, etc.)
### 14. Recommended Next Steps
A prioritized, numbered list of 3–5 concrete actions derived from the report findings. Only include items backed by actual findings — do not invent generic advice.
Draw from these categories (in rough priority order):
- ❌ Fix failing CI / tests / type errors
- 🔍 Review pending PRs or td issues awaiting review
- 🔒 Fix secrets exposure or .gitignore gaps
- 📦 Update outdated dependencies (major bumps first)
- 🧹 Clean up stale/merged branches
- 📝 Address TODO/FIXME/HACK markers
- 🚀 Start next high-priority task (from td or GitHub issues)
Format example:
Recommended Next Steps
1. 🔍 Review P0 issue td-31b69b "CRM plugin architecture"
2. 🔒 Add *.pem and *.key to .gitignore
3. 📦 Evaluate better-sqlite3 major upgrade (11 → 12)
4. 🧹 Delete 8 merged branches
5. 🚀 Start td-b02d69 "pi-crm-personal extension"
---
## Implementation Steps
When executing this skill, follow these steps:
```bash
# 1. Navigate to project (default: current working directory)
cd <project_path_or_.>
# 2. Verify it's a git repo
git rev-parse --is-inside-work-tree
# 3. Get project metadata
# - Read package.json / Cargo.toml / pyproject.toml for name, version, description
# - Read first paragraph of README.md for description fallback
# - Get current branch: git branch --show-current
# - Get working tree status: git status --porcelain
# 4. Get branch info
git branch --format='%(refname:short) %(committerdate:relative)'
# For each branch, get ahead/behind vs default branch:
git rev-list --left-right --count main...branch-name
# Identify default branch:
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@'
# 5. Get commit history
git log --oneline --no-decorate -n 5
git rev-list --count HEAD
git log --reverse --format="%ai" | head -1 # first commit date
git log -1 --format="%ai" # latest commit date
# 6. Analyze codebase — language breakdown
# Count lines per file extension, excluding generated/vendor dirs
# Group by language (e.g. .ts + .tsx = TypeScript)
find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \
-o -name "*.py" -o -name "*.rs" -o -name "*.go" -o -name "*.rb" \
-o -name "*.java" -o -name "*.c" -o -name "*.cpp" -o -name "*.h" \
-o -name "*.sh" -o -name "*.sql" -o -name "*.html" -o -name "*.css" \) \
-not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/dist/*" \
-not -path "*/build/*" -not -path "*/target/*" -not -path "*/__pycache__/*" \
-not -path "*/.next/*" -not -path "*/coverage/*" \
-not -name "*.min.*" -not -name "*.map" -not -name "*.d.ts" \
-exec wc -l {} + | sort -rn
# 7. Check for GitHub remote and gh CLI
GITHUB_ORIGIN=$(git remote get-url origin 2>/dev/null | grep "github.com")
GH_AVAILABLE=$(gh auth status 2>&1 && echo "yes" || echo "no")
if [ -n "$GITHUB_ORIGIN" ] && [ "$GH_AVAILABLE" = "yes" ]; then
gh pr list --state open --json number,title,headRefName,author,reviewDecision,statusCheckRollup,updatedAt --limit 20
gh issue list --state open --json number,title,labels,assignees,createdAt --limit 20
gh pr list --state merged --json number,title,mergedAt,author --limit 5
gh run list --limit 5 --json databaseId,displayTitle,status,conclusion,headBranch,createdAt
fi
# 8. Check dependencies
# Node.js: npm outdated --json 2>/dev/null
# Rust: cargo outdated 2>/dev/null
# Python: pip list --outdated --format=json 2>/dev/null
# Go: go list -u -m all 2>/dev/null
# 9. Check for errors (language-specific)
# TypeScript: npx tsc --noEmit 2>&1
# Python: mypy or py_compile
# Rust: cargo check
# Go: go vet ./...
# 10. Scan for TODO/FIXME/HACK markers
grep -rn --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" \
--include="*.py" --include="*.rs" --include="*.go" \
-E "(TODO|FIXME|HACK|XXX|WORKAROUND|TEMP)(\(|:| )" . \
--exclude-dir=node_modules --exclude-dir=.git --exclude-dir=dist --exclude-dir=build
# 11. Run tests (if test runner detected, with 60s timeout)
# Node.js: timeout 60 npx vitest run --reporter=verbose 2>&1 || timeout 60 npm test 2>&1
# Rust: timeout 60 cargo test 2>&1
# Python: timeout 60 pytest --tb=short 2>&1
# Go: timeout 60 go test ./... 2>&1
# 12. Check for secrets exposure
git grep -lnE "(PRIVATE_KEY|SECRET_KEY|API_KEY|PASSWORD|TOKEN|Bearer )['\"]?=" -- '*.ts' '*.js' '*.py' '*.env*' '*.json' '*.yaml' '*.yml' 2>/dev/null
git ls-files | grep -E "^\.env"
# 13. Get uncommitted changes detail (if dirty)
if [ -n "$(git status --porcelain)" ]; then
git diff --cached --stat # staged
git diff --stat # unstaged
git ls-files --others --exclude-standard # untracked
fi
# 14. Check for .todos directory and run td usage if present
if [ -d ".todos" ]; then
td usage 2>&1
fi
# 15. Compile and format report
```
## Formatting Guidelines
- **NEVER** wrap section output in triple-backtick (```) code fences. All report sections must be plain text with Unicode formatting only.
- Use Unicode box-drawing characters for tables (┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘ │ ─)
- Use em-dash (—) for inline descriptions
- Keep the report compact but comprehensive
- Use relative time descriptions ("started yesterday", "2 weeks ago") alongside dates
- Indent sub-items with 2 spaces and a dash prefix
- All section headers use single space + bold or clear labels
- Use status icons consistently: ✅ passing/success, ❌ failing/error, ⏳ pending/in-progress, ⊘ cancelled, ⚠ warning/stale
## Multiple Projects
If the user provides multiple paths, generate a separate report for each project with a clear separator between them. Optionally provide a summary table at the end comparing projects.
## Example Output
See the user's example in the conversation for the target format and level of detail. Match that style closely:
- "Here's the status of [project-name]:" as the header
- Section labels in bold or clearly marked
- Commit table with box-drawing characters
- Codebase with line counts and descriptions
- Issues with specific error details
- GitHub PRs/issues with status icons
- Dependencies with version arrows
- Summary paragraph at the end