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...
Scanned 9/12/2026
Install to Claude Code
npx -y skills add espennilsen/pi --skill git-project-status --agent claude-codeInstalls 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 automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/espennilsen-git-project-status)More formats (shields.io, HTML) on the badges page.
---
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
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!