Skip to main content

ge — GitHub Engineering for AI Agents

Tools and skills that let AI coding agents work on GitHub issues, PRs, and discussions intelligently.

Most GitHub engineering can be done from an AI agent console with gh and Python. But some tasks — fetching an issue with all its comments, downloading screenshots, extracting video frames, checking if the issue is stale or already fixed — burn tokens every time, with a different improvised solution each time. ge crystallizes these into deterministic tools with CLI and Python interfaces. More importantly, it wraps them into AI skills that agents can use directly, so you just say "work on issue #42" and the agent knows exactly what to do.

So that's the order here: skills first (the intended interface), then the tools underneath (for when you want direct control).

pip install ge
ge install-skills   # register skills with Claude Code

Skills — the main interface

ge ships Claude Code skills that teach the agent how to work on GitHub issues. After installing the package, register them globally:

ge install-skills

This creates symlinks in ~/.claude/skills/ pointing to the skills bundled with ge. From then on, tell your agent "work on THIS" — where THIS can be:

  • A GitHub URL: work on https://github.com/owner/repo/issues/42
  • A bare number: work on issue #42 (assumes the current repo)
  • A repo+number: work on owner/repo#42
  • A pre-prepared context folder: work on ~/.cache/ge/owner/repo/issue_42

The agent resolves whatever you give it, confirms what it understood before proceeding, then:

  1. Loads or prepares full context (body, comments, media, cross-references)
  2. Analyzes freshness — is it stale? already fixed? has related merged PRs?
  3. Describes images via the Claude API (or asks you to paste them as fallback)
  4. Asks you before working on ambiguous or likely-resolved issues
  5. Works on the issue — creates a branch, makes changes, submits a PR

Six skills are installed:

Skill Purpose
ge Full workflow — resolve target, confirm, prepare context, analyze, work
ge-analyze Quick triage — check if an issue is worth working on
ge-context Context preparation — fetch and assemble structured documents
ge-autonomous-execution Behaviour policy for unattended runs (decide-and-log, don't ask)
ge-roadmap-execution Drive a roadmap issue end-to-end, one task per iteration
ge-cross-repo-triage Classify & resolve issues across repos (failing test → fix → PR)
ge-write-issue Authoring issues/comments people read — layering, asking, assigning

To remove the skills: ge uninstall-skills

Installing skills with gh skill

The skills are also installable directly from GitHub with gh skill — no pip install required (you only need the GitHub CLI, gh). Install any single skill into Claude Code with:

gh skill install thorwhalen/ge <name> --agent claude-code

For example, gh skill install thorwhalen/ge ge --agent claude-code installs the main workflow skill.

Skill Description
ge Use when asked to work on a GitHub issue, PR, or discussion. Resolves flexible input (URL, folder, number), confirms with the user, prepares context, and guides the workflow.
ge-analyze Use when you need to check whether a GitHub issue or PR is still relevant, stale, or already resolved — without preparing full context or downloading media.
ge-context Use when you need to prepare, read, or refresh full context for a GitHub issue, PR, or discussion — fetching data, downloading media, and writing structured context documents.
ge-autonomous-execution Behavioural policy for running unattended. Use when launched in headless / auto-permission mode and there is no user available — converts every clarifying question into a logged decision so progress continues.
ge-roadmap-execution Execute a roadmap of tasks end-to-end using GitHub as durable memory. Take the next todo task, do it, verify it, mark it done, log decisions, and repeat.
ge-cross-repo-triage Triage and resolve a cross-repo issue backlog — Phase A classifies and orders issues; Phase B executes them one at a time (failing test → confirm red → fix → confirm green → open PR).
ge-write-issue Use when AUTHORING a GitHub issue, comment, or report that a human will read — especially a non-technical stakeholder or client. Covers layering detail with <details>, asking a question that gets answered, and assigning so someone is on the hook.

Autonomous execution

ge can drive Claude Code through a long body of work without interrupting you. State lives in GitHub (issues, comments) so each session can exit, the runner relaunches a fresh one, and progress resumes — context exhaustion is no longer a failure mode.

# Drive a roadmap issue to completion (one headless `claude -p` per task).
ge run-roadmap owner/repo <ROADMAP_ISSUE>

# Triage and resolve issues across several repos.
ge run-triage <TRACKING_REPO> <TRACKING_ISSUE> "owner/a,owner/b" --phase analyze
ge run-triage <TRACKING_REPO> <TRACKING_ISSUE> "owner/a,owner/b" --phase execute

The runner launches claude with --permission-mode auto by default; pass --mode bypass if you have explicitly authorised --dangerously-skip-permissions. Between iterations the session is gone — the next one rehydrates state from GitHub.

The memory model

Store Backing Use for
RoadmapStore A roadmap issue whose body holds a markdown task list between <!-- ge:roadmap:begin --> / end. Checkboxes render as GitHub's task-list progress bar. Roadmap of tasks; agent-modifiable.
DecisionLog Tagged comments (<!-- ge:decision -->) on an issue or PR. Significant decisions and course-corrections.
TriageBacklog A tracking issue whose body holds a JSON block keyed by owner/repo#N. Cross-repo triage with explicit resolution order.

GitHub is the single source of truth; the .ge/cache/ snapshot is hydrate-only (gitignored).

import ge

mall = ge.github_memory(
    "owner/repo",
    roadmap_issue=1,
    decisions_target=1,
    triage_issue=9,
)
roadmap = mall["roadmap"]
roadmap.next_todo()  # next "- [ ]" task
roadmap.append("New task")  # adds "- [ ] New task"

mall["decisions"].append("Used X over Y", rationale="cheaper")
mall["triage"]["owner/repoA#42"] = ge.TriageEntry(
    ref="owner/repoA#42",
    verdict=ge.TriageVerdict.fixable,
    order=1,
)

CLI equivalents: ge roadmap-show, ge roadmap-next, ge roadmap-set, ge roadmap-append, ge decision-log, ge decisions-show, ge triage-set, ge triage-show, ge check-requirements.

Tools — what the skills use under the hood

Everything below is what the skills orchestrate automatically. You can use any of it directly via CLI or Python.

What ge prepare does

Fetches an issue or PR and assembles everything an agent needs:

  • Issue/PR body and all comments — with media URLs rewritten to local paths
  • Images downloaded — screenshots, mockups, error captures (auto-detected from content)
  • Video frames extracted — via ffmpeg scene detection
  • AI image descriptions — images described via Claude API, embedded in the context document
  • Freshness analysis — staleness, related merged PRs, resolution signals
  • Cross-references — commits and PRs that mention this issue

All via gh CLI, so private repos just work.

Quick start

ge prepare owner/repo --number 42
ge prepare https://github.com/owner/repo/pull/7
ge analyze-issue owner/repo 42

Requirements

  • gh CLI — installed and authenticated (gh auth login)
  • Python 3.10+
  • ffmpeg — optional, for video frame extraction
  • anthropic — optional, for AI-powered image descriptions (pip install anthropic + set ANTHROPIC_API_KEY)
  • ImageMagick — optional, for clipboard montage (brew install imagemagick on macOS)

CLI commands

ge prepare <repo> --number <N>              Full context (auto-detects issue/PR/discussion)
ge prepare <url>                           Full context from a GitHub URL
ge prepare-discussion <repo> --number <N>  Full context for a GitHub Discussion
ge analyze-issue <repo> <N>                Freshness analysis (JSON, no download)
ge analyze-pr <repo> <N>                   PR review analysis with CI status (JSON)
ge fetch-issue <repo> <N>                  Raw issue JSON
ge fetch-pr <repo> <N>                     Raw PR JSON
ge fetch-discussion <repo> <N>             GitHub Discussion JSON
ge media <file.md>                 Download media from markdown
ge video-frames <video>            Extract frames (scene detection by default)
ge describe-images <img>...        Describe images via Claude API (vision)
ge copy-images <img>...            Create montage + copy to clipboard (macOS)
ge resolve <target>                Resolve a URL, folder, or number to structured target
ge install-skills                  Register skills with Claude Code (~/.claude/skills/)
ge uninstall-skills                Remove ge skill symlinks

Python API

import ge

# Prepare full context
ctx = ge.prepare("https://github.com/owner/repo/issues/42")
ctx = ge.prepare_issue("owner/repo", 42)
ctx = ge.prepare_pr("owner/repo", 7)
ctx = ge.prepare_discussion("owner/repo", 5)

# Just analysis (no download)
analysis = ge.analyze_issue("owner/repo", 42)

# Resolve flexible input
target = ge.resolve_target("#42", current_repo="owner/repo")

# Image tools
from ge.media import describe_images, copy_images_to_clipboard

text = describe_images("screenshot.png", "error.jpg")
path = copy_images_to_clipboard("img1.png", "img2.png")

Image analysis

When ge prepare runs, it downloads images and — if anthropic is installed — automatically sends them to the Claude API for visual analysis. The descriptions are embedded in the context document under "Image Descriptions (AI-generated)".

pip install anthropic
export ANTHROPIC_API_KEY=sk-ant-...

To disable: ge prepare owner/repo --number 42 -d

Standalone:

ge describe-images screenshot.png error.jpg
ge describe-images frame1.jpg frame2.jpg --prompt "What changed between these frames?"
ge copy-images screenshot1.png screenshot2.png   # montage + clipboard (macOS)

Project structure

ge/
├── __init__.py      # Facade: prepare(), resolve_target(), install_skills(), etc.
├── __main__.py      # CLI via cw (SSOT: _cli_commands list)
├── github.py        # GitHub API via `gh` CLI subprocess
├── media.py         # Image download, video frames, describe_images, clipboard montage
├── analysis.py      # Staleness/freshness/relevance analysis
├── context.py       # Assembles everything into context docs
├── util.py          # Internal helpers: gh wrapper, URL parsing, resolve_target
├── memory.py        # GitHub-backed memory: RoadmapStore, DecisionLog, TriageBacklog
├── run.py           # Autonomous runner: launches `claude` in a loop
└── data/skills/     # Claude Code skills (symlinked by install-skills)
    ├── ge/                     # Full workflow skill
    ├── ge-analyze/             # Triage/staleness skill
    ├── ge-context/             # Context preparation skill
    ├── ge-autonomous-execution/  # Unattended-mode behaviour policy
    ├── ge-roadmap-execution/     # Drive a roadmap issue end-to-end
    ├── ge-cross-repo-triage/     # Multi-repo triage and resolution
    └── ge-write-issue/           # Authoring issues for human readers

Metadata

Release files for ge 0.1.17

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ge 0.1.17
File Size Uploaded
ge-0.1.17.tar.gz 120.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ge 0.1.17
File Interpreter ABI Platform
ge-0.1.17-py3-none-any.whl Python 3 none any Details

Total release size: 165.8 kB

Release files / ge-0.1.17.tar.gz

Download URL ge-0.1.17.tar.gz
Size 120.6 kB
Tags Source
SHA-256 checksum
How to use checksums
753ecfc606c3e7d4b124ee88bed05f5e0e2dd597991dee59961c9c324231e954
BLAKE2b-256 checksum
How to use checksums
9b19f34c5bb83d8f22a0bbfab68a01f6c17bee5aa38f70c81f7e5f87de38ea7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / ge-0.1.17-py3-none-any.whl

Download URL ge-0.1.17-py3-none-any.whl
Size 45.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
614c6f530b0367d3e75527b56c9355507eb675bc3c3f93dbbec702c95b0c047f
BLAKE2b-256 checksum
How to use checksums
c22ad02c155b892e94b16c9c91fb06a91eade2cba4de45a318f4bb53717ab461
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.1.18

2 release files

This release

0.1.17 This release

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page