DEV Community

miyamoto ryosuke
miyamoto ryosuke

Posted on

Built gh-pm: A GitHub CLI Extension to Manage GitHub Projects with LLMs

In the age of AI, even ticket management by PdMs and project managers should be designed around collaboration between humans and LLMs.

We’re heading toward a world where you just describe your intent in natural language, and everything—creating, updating, moving, summarizing—gets automated.

GitHub Projects (v2), with its flexible fields and powerful queries/automations, is a perfect foundation for this.

That’s why I created gh-pm: a GitHub CLI extension that brings this combination into practical, everyday workflows.


Why I Built It

GitHub Projects (v2) is powerful, but in practice you’ll quickly run into problems:

  • Assigning issues to projects is tedious
  • Frequent updates and status changes add overhead
  • Writing raw GraphQL queries is too complex for daily use

gh-pm solves these by extending the GitHub CLI, and when combined with an LLM, it enables natural language-driven project management.


Features & Examples

0. Installation

gh extension install yahsan2/gh-pm
Enter fullscreen mode Exit fullscreen mode

1. Init with .gh-pm.yml

Start by generating a config file:

gh pm init
Enter fullscreen mode Exit fullscreen mode

This detects your project and creates a .gh-pm.yml.

The file caches field names like Status and Priority, so you can use intuitive shorthand in commands.

Example:

fields:
  status:
    backlog: "Backlog"
    in_progress: "In Progress"
    done: "Done"
  priority:
    high: "P0"
    medium: "P1"
    low: "P2"
  deadline:
    due_date: "Due Date"
Enter fullscreen mode Exit fullscreen mode

2. Create & Update Issues in Projects

# Create new issue in project with P1 priority and backend label
gh pm create --title "Implement authentication" --priority p1 --label backend
Enter fullscreen mode Exit fullscreen mode

Move existing issues across columns:

# Move issue #123 to in_progress
gh pm move 123 --status in_progress
Enter fullscreen mode Exit fullscreen mode

3. Intake Untracked Issues

# Add all bug-labeled issues into backlog with p2 priority
gh pm intake --label bug --apply "status:backlog,priority:p2"
Enter fullscreen mode Exit fullscreen mode

With defaults in .gh-pm.yml, you can even make this interactive.

Example .gh-pm.yml snippet:

intake:
  bug:
    query: "is:issue is:open -label:pm-tracked"
    instruction: "Starting intake for untracked issues. This will add the pm-tracked label and set default project fields."
    apply:
      labels:
        - pm-tracked
    interactive:
      status: true  # Show choices interactively to set status per issue
Enter fullscreen mode Exit fullscreen mode

4. Split Issues into Sub-Issues

# Split sub-issues from checklists in issue body
gh pm split 123 --from=body

# Or from a markdown file generated by an LLM
gh pm split 123 --from=./tasks.md

# Or directly from a list
gh pm split 123 '["Task 1", "Task 2", "Task 3"]'
Enter fullscreen mode Exit fullscreen mode

This depends on my other extension gh-sub-issue.

gh extension install yahsan2/gh-sub-issue
Enter fullscreen mode Exit fullscreen mode

5. Triage at Scale

Define triage rules in .gh-pm.yml and process issues in batch:

# Example: mark all stale issues
gh pm triage stale
Enter fullscreen mode Exit fullscreen mode
triage:
  stale:
    query: "is:issue is:open updated:<@today-7d"
    apply:
      labels:
        - stale
Enter fullscreen mode Exit fullscreen mode

Note: @today-7d is implemented internally for CLI compatibility where native support is missing.


6. Flexible Output for Automation

Output to JSON or CSV for easy integration with LLMs or scripts:

gh pm list --format json
Enter fullscreen mode Exit fullscreen mode

Example Triage Use Cases

  • Auto-label stale tasks: mark issues inactive for 7+ days
  • Force-set missing priorities: interactively assign priorities to all issues missing the field

Example for missing priorities:

triage:
  priority:
    query: "is:issue is:open -field:priority"
    interactive:
      priority: true  # Prompt interactively to set priority per issue
Enter fullscreen mode Exit fullscreen mode

Run with:

gh pm triage priority
Enter fullscreen mode Exit fullscreen mode

Using with LLMs

This is where gh-pm shines.

LLMs like Claude or Codex CLI can generate the right commands from natural language:

  • “Assign all untracked issues to me” → gh pm triage tracked --apply @me
  • “Move all P1 tasks to in_progress” → gh pm move --query "is:issue is:open -priority:high" --status in_progress

With .gh-pm.yml, these commands become even shorter.


What’s Next

The dream is to have an LLM “remember” these commands (via something like CLAUDE.md) and execute them reliably.

Right now, I sometimes still have to explicitly say things like:

“Run gh pm split 123 --from=body\ on the issue I just created.”

But when it works, GitHub Projects + LLMs = super powerful project automation.

I’ll keep improving the prompts, instructions, and hooks—so stay tuned.


Try It Out

Repo here 👉 yahsan2/gh-pm

Feedback, ideas, and ⭐️ are super welcome.


TL;DR

gh-pm is:

  • A GitHub CLI extension that simplifies day-to-day GitHub Project ops
  • Hides GraphQL complexity behind intuitive commands
  • Uses .gh-pm.yml for flexible field mapping
  • Designed to pair naturally with LLMs for natural language operations

A practical partner for managing projects “fast, safe, and clear.”

Top comments (0)