Claude-skill-registry board-manager

Manage GitHub Project board items - add issues, update status, move between columns. Use when user asks to add issues to board, change status, or organize the project.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/board-manager" ~/.claude/skills/majiayu000-claude-skill-registry-board-manager && rm -rf "$T"
manifest: skills/data/board-manager/SKILL.md
source content

Board Manager Skill

Purpose

Add issues to the project board and update their status. This skill has write permissions for board operations.

When to Use This

  • User asks "add this issue to the board"
  • User asks "move #X to In Progress"
  • User asks "update status of issue"
  • After creating a new issue (auto-add to board)
  • After completing work (move to Done)

Project Board Configuration

Project: code-graph-mcp Development (#8) URL: https://github.com/users/joeczar/projects/8

IDs Reference

ResourceID
Project ID
PVT_kwHOAbYJAM4BM5GY
Status Field ID
PVTSSF_lAHOAbYJAM4BM5GYzg8C2zk

Status Option IDs

StatusOption IDDescription
Todo
f75ad846
Not started
In Progress
47fc9ee4
Currently working
Done
98236657
Completed

Commands

Add Issue to Project Board

gh project item-add 8 --owner joeczar --url https://github.com/joeczar/code-graph-mcp/issues/<number>

Get Item ID for an Issue

gh project item-list 8 --owner joeczar --format json | \
  jq -r '.items[] | select(.content.number == <issue-number>) | .id'

Or via GraphQL:

gh api graphql -f query='
  query {
    user(login: "joeczar") {
      projectV2(number: 8) {
        items(first: 100) {
          nodes {
            id
            content { ... on Issue { number } }
          }
        }
      }
    }
  }' | jq -r '.data.user.projectV2.items.nodes[] | select(.content.number == <issue-number>) | .id'

Update Issue Status

gh api graphql \
  -f projectId="PVT_kwHOAbYJAM4BM5GY" \
  -f itemId="<item-id>" \
  -f fieldId="PVTSSF_lAHOAbYJAM4BM5GYzg8C2zk" \
  -f optionId="<option-id>" \
  -f query='mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId
      itemId: $itemId
      fieldId: $fieldId
      value: { singleSelectOptionId: $optionId }
    }) {
      projectV2Item { id }
    }
  }'

Remove Issue from Project

gh project item-delete 8 --owner joeczar --id <item-id>

Helper Functions

Move Issue to Status

move_issue_status() {
  local issue_number=$1
  local option_id=$2  # f75ad846=Todo, 47fc9ee4=InProgress, 98236657=Done
  local status_name=$3

  # Get item ID
  local item_id=$(gh project item-list 8 --owner joeczar --format json | \
    jq -r '.items[] | select(.content.number == '$issue_number') | .id')

  if [ -z "$item_id" ]; then
    echo "Issue #$issue_number not found on project board"
    return 1
  fi

  # Update status
  gh api graphql \
    -f projectId="PVT_kwHOAbYJAM4BM5GY" \
    -f itemId="$item_id" \
    -f fieldId="PVTSSF_lAHOAbYJAM4BM5GYzg8C2zk" \
    -f optionId="$option_id" \
    -f query='mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
      updateProjectV2ItemFieldValue(input: {
        projectId: $projectId
        itemId: $itemId
        fieldId: $fieldId
        value: { singleSelectOptionId: $optionId }
      }) { projectV2Item { id } }
    }'

  echo "Moved #$issue_number to $status_name"
}

# Usage:
# move_issue_status 12 "47fc9ee4" "In Progress"
# move_issue_status 12 "98236657" "Done"

Workflow Integration

Start Working on Issue

  1. Add issue to project (if not already)
  2. Set status to "In Progress"
# Add to project
gh project item-add 8 --owner joeczar --url "https://github.com/joeczar/code-graph-mcp/issues/<number>"

# Get item ID and move to In Progress
ITEM_ID=$(gh project item-list 8 --owner joeczar --format json | \
  jq -r '.items[] | select(.content.number == <number>) | .id')

gh api graphql \
  -f projectId="PVT_kwHOAbYJAM4BM5GY" \
  -f itemId="$ITEM_ID" \
  -f fieldId="PVTSSF_lAHOAbYJAM4BM5GYzg8C2zk" \
  -f optionId="47fc9ee4" \
  -f query='mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId
      itemId: $itemId
      fieldId: $fieldId
      value: { singleSelectOptionId: $optionId }
    }) { projectV2Item { id } }
  }'

Complete Issue

Set status to "Done" (PR merge will auto-close issue).

Status Mapping

ActionStatusOption ID
New issue, not startedTodo
f75ad846
Started workIn Progress
47fc9ee4
PR mergedDone
98236657

Query Current IDs (if they change)

gh api graphql -f query='
query {
  user(login: "joeczar") {
    projectV2(number: 8) {
      id
      field(name: "Status") {
        ... on ProjectV2SingleSelectField {
          id
          options { id name }
        }
      }
    }
  }
}'

Output Format

After operations, confirm:

**Board Update:** Issue #X moved to [Status]
**URL:** https://github.com/users/joeczar/projects/8