Skip to main content
skill CX Codex

carbon-pr — Claude Code skill: what it does, how to install

Tallies Claude Code sessions for your active git branch and posts the footprint as a sticky PR comment.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gwittebolle/claude-carbon --skill carbon-pr -a claude-code
Open on GitHub

What carbon-pr does

The skill triggers the local generate-pr-report.sh script from claude-carbon. It resolves the installation path by inspecting Claude Code status line settings, environment variables, or plugin cache folders. It relies on bash, jq, and an authenticated gh CLI.

It aggregates recorded local sessions for the active branch and creates or edits a sticky comment on the open GitHub pull request. Passing --pr <number> targets an explicit PR, but the script refuses this flag for pull requests originating from forks.

Without gh authentication, the script cannot query or update pull requests. Sessions belong to the branch where they ended. Older session databases lacking the git_branch column can be repaired with scripts/backfill.sh as long as transcripts exist.

What it helps with

  • post Claude Code session metrics to an active pull request
  • update sticky development footprint comments on GitHub
  • summarize token usage and sessions for a specific branch
  • backfill branch metadata for older session logs

Example prompts for the agent

  • Post our branch session report to the open pull request
  • Update the sticky footprint comment on PR #15
  • Check recorded Claude Code sessions for this branch

How to install carbon-pr

1Skills CLI (Vercel)

npx skills add gwittebolle/claude-carbon --skill carbon-pr -a claude-code

2Manually: put the files in place

~/.claude/skills/carbon-pr/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/carbon-pr/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about carbon-pr

How to install carbon-pr in Claude Code?

Run npx skills add gwittebolle/claude-carbon --skill carbon-pr -a claude-code.

What does carbon-pr do?

It calculates recorded Claude Code development sessions for the current git branch and posts a sticky summary comment directly to the pull request via GitHub CLI.

Why does carbon-pr reject PRs opened from a fork?

The script disallows --pr on fork pull requests. To report footprint on a fork, switch to the fork clone and run the skill without the --pr option.

Source text

SKILL.md · MIT
---
name: carbon-pr
description: Post the development footprint of the current branch as a sticky PR comment
---

Run the following bash script from the repository the PR belongs to, and present the output to the user.

```bash
#!/usr/bin/env bash
# Locate the install wired into the status line (honours CLAUDE_CONFIG_DIR),
# then fall back to CLAUDE_PLUGIN_ROOT / CLAUDE_CARBON_DIR / the default path.
# Windows (Git Bash): CLAUDE_* variables and the paths stored in settings.json can
# arrive in the native "C:\Users\..." spelling, which bash cannot open. cygpath
# ships with Git for Windows; everywhere else this is the identity function.
ccp() {
  case "${OSTYPE:-}" in msys*|cygwin*) ;; *) printf '%s' "$1"; return 0 ;; esac
  case "$1" in
    [A-Za-z]:[\\/]*|*\\*) cygpath -u "$1" 2>/dev/null || printf '%s' "$1" ;;
    *) printf '%s' "$1" ;;
  esac
}
CFG="$(ccp "${CLAUDE_CONFIG_DIR:-$HOME/.claude}")"
# A jq the installer fetched into the data folder (a Mac older than macOS 15 has none)
if ! command -v jq >/dev/null 2>&1 && [ -x "$CFG/claude-carbon/bin/jq" ]; then PATH="$CFG/claude-carbon/bin:$PATH"; fi
REPO_DIR=""
if command -v jq >/dev/null 2>&1 && [ -f "$CFG/settings.json" ]; then
  SL_CMD="$(jq -r '.statusLine.command // empty' "$CFG/settings.json" 2>/dev/null)"
  # statusLine.command stores a path, shell-escaped, or in double quotes on Windows:
  # unquote, expand ~ and unescape spaces
  SL_CMD="${SL_CMD#\"}"; SL_CMD="${SL_CMD%\"}"
  SL_CMD="${SL_CMD//\\ / }"; SL_CMD="${SL_CMD/#\~/$HOME}"; SL_CMD="$(ccp "$SL_CMD")"
  [ -n "$SL_CMD" ] && [ -f "$SL_CMD" ] && REPO_DIR="$(cd "$(dirname "$SL_CMD")/.." 2>/dev/null && pwd)"
fi
[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && REPO_DIR="$(ccp "$CLAUDE_PLUGIN_ROOT")"
[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_CARBON_DIR:-}" ] && REPO_DIR="$(ccp "$CLAUDE_CARBON_DIR")"
if [ -z "$REPO_DIR" ]; then
  # Pure marketplace installs reach here: no statusLine.command in settings.json and
  # no CLAUDE_PLUGIN_ROOT in a skill's bash env. Pick the newest cached plugin copy,
  # keeping only candidates that ship the PR report script.
  CACHE_LATEST=""
  for D in "$CFG/plugins/cache"/*/claude-carbon/*/; do
    [ -f "${D}scripts/generate-pr-report.sh" ] || continue
    if [ -z "$CACHE_LATEST" ] || [ "$(printf '%s\n%s\n' "$CACHE_LATEST" "$D" | sort -V | tail -1)" = "$D" ]; then
      CACHE_LATEST="$D"
    fi
  done
  [ -n "$CACHE_LATEST" ] && REPO_DIR="${CACHE_LATEST%/}"
fi
[ -z "$REPO_DIR" ] && REPO_DIR="$HOME/code/claude-carbon"

bash "$REPO_DIR/scripts/generate-pr-report.sh"
```

The script sums the local Claude Code sessions recorded for the current branch of the current project and posts (or updates in place) one sticky comment on the branch's open PR, through the user's own `gh` auth. Report its final line to the user as printed; never recompute or reformat the numbers.

With `--pr <number>` the script reports that PR's own branch (read through `gh`, so even `--dry-run` needs it), wherever it runs; never pass a PR number to report the current branch's sessions on another PR. It refuses a PR opened from a fork: tell the user to run it without `--pr` from the fork's clone, on the PR's branch. It also refuses a branch checked out in no worktree whose name sessions of other folders carry: say that nothing was posted and pass on its suggestion (run it from the branch's worktree, or switch to the branch in the folder its sessions ran in and run it there without `--pr`). If it reports no sessions for the branch, say that nothing was posted, that a session counts for the branch it ended on and so do its agents, except an agent that worked in a worktree of another branch and ended with this version installed (it counts there), that only sessions recorded since the `git_branch` column exists carry a branch, and that `scripts/backfill.sh` repairs older rows while their transcripts are still on disk. If it reports no open PR, suggest pushing the branch and opening one first, or passing `--pr <number>`. If the script itself is missing (an install that predates it), suggest `/carbon-update`.

© gwittebolle · MIT · gwittebolle/claude-carbon

Similar skills

All skills for Git and GitHub →

From the same set6

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor