From gh-projects
Route one GitHub issue onto the org board and create its authoritative linked branch — project the item, populate its intake-time fields, optionally self-assign, advance Status monotonically. Use when the user says "route this issue", "put
How this skill is triggered — by the user, by Claude, or both
Slash command
/gh-projects:route-issue --owner <org> --number <project#> --repo owner/name --issue <n> [--assignee <login>] (add --force after the dry run)--owner <org> --number <project#> --repo owner/name --issue <n> [--assignee <login>] (add --force after the dry run)claude-opus-4-8This skill is limited to the following tools:
Bash${CLAUDE_PLUGIN_ROOT}/hooks/guard.shThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Project **one** issue onto the org board and create its **authoritative linked
Project one issue onto the org board and create its authoritative linked
branch. This is a thin orchestrator over the deterministic engine — every
load-bearing operation is a checked-in lib/gh.py verb run behind
${CLAUDE_PLUGIN_ROOT}/lib/engine.sh's dry-by-default / --force rail. Leave
no decision logic in this prose.
Let ENGINE=${CLAUDE_PLUGIN_ROOT}/lib/engine.sh and
GH=${CLAUDE_PLUGIN_ROOT}/lib/gh.py. Read verbs (resolve, capabilities) run
even in dry mode; write verbs mutate nothing without --force.
--force, the engine previews the projection +
branch plan and mutates nothing (AC-11). Only --force after the user
confirms.GH_APP_TOKEN, or APP_ID+APP_PRIVATE_KEY), never
GITHUB_TOKEN — it cannot write org Projects v2 (AC-28). The token is never
printed.Type / Size / Tier / PM-ID / Spec / Priority / Status. It does not touch
Sprint / Milestone / Start / Target (that is plan-sprint).Backlog < Ready < In Progress < In Review < On Staging < Done; a re-route
never regresses an item already at/past the target (AC-10).Closes/Fixes/Resolves
— closure stays the prod-time board-status job (AC-30).hooks/guard.sh, scoped to this skill) hard-blocks a --squash merge
and a prod deploy without provably-green checks (AC-25).You need the org --owner, the board --number, the --repo owner/name, and the --issue <n>; --assignee <login> is optional (the
actor's self-assign for the "Ready → In Progress = dev self-assign + status"
flow). If any required input is missing, ask with AskUserQuestion. Confirm the
App token is available (GH_APP_TOKEN, or APP_ID+APP_PRIVATE_KEY).
Resolve the board (read-only, runs in dry mode):
bash "$ENGINE" resolve --owner <org> --number <project#>
This caches the project + every field/option id route-issue will write to.
Preview the full projection + branch plan without --force. Show the user:
Type / Size / Tier / PM-ID / Spec / Priority / Status — each read back identical by the engine (AC-8),gh issue develop when the installed gh
supports it, else the createLinkedBranch GraphQL fallback (probed via
bash "$ENGINE" capabilities); a re-run on an existing linked branch is a
no-op (AC-9),--assignee is given (AC-8).Every write verb run without --force prints its resolved command to stderr and
mutates nothing. Show the user this plan verbatim.
Use AskUserQuestion to confirm (this mutates the board + repo). Every step
below is a concrete engine verb: run it without --force first (dry preview),
then re-run the identical command with --force appended to execute. A
re-run with the same inputs is a clean no-op (AC-33).
(a) Project the issue onto the board (add-item — a re-add returns the same
item id, AC-8):
bash "$ENGINE" add-item --owner <org> --number <project#> --repo owner/name --issue <n> --force
(b) Write each intake-time field (write-field — the engine reads each value
back identical; an unchanged value is a no-op). One command per field — set
only the fields you have values for:
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field Type --value <Feature|Bug|Chore|Infra> --force
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field Size --value <S|M|L> --force
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field Tier --value <T1|T2|T3> --force
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field PM-ID --value <PM-XXXX> --force
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field Spec --value <specs/...md> --force
bash "$ENGINE" write-field --owner <org> --number <project#> --repo owner/name --issue <n> --field Priority --value <P0|P1|P2|P3> --force
(For single-select fields --value is the OPTION NAME; the engine resolves it.)
(c) Advance Status monotonically (advance-status — reads the current Status
and writes only a forward move; an item already at/past the target is a no-op, no
write — AC-10):
bash "$ENGINE" advance-status --owner <org> --number <project#> --repo owner/name --issue <n> --to "<Status>" --force
(d) Create the authoritative linked branch (create-linked-branch — native
gh issue develop when supported, else GraphQL; an existing linked branch is
detected and is a no-op, exit 0 — AC-9). --name is optional:
bash "$ENGINE" create-linked-branch --repo owner/name --issue <n> [--name <branch>] --force
(e) Self-assign the actor (optional, only when --assignee was given —
set-assignee; adding an already-present assignee is a no-op, AC-33):
bash "$ENGINE" set-assignee --repo owner/name --number <n> --login <login> --force
State: the board item id (and whether it was reused vs newly added), the intake-time fields set (with the read-back confirmation), the Status transition (or "already at/past target — no write"), the linked branch name (created vs already-linked no-op), and the self-assign if requested. If you re-ran on an already-routed issue, confirm it was a clean no-op (same item id, branch detected, no field/assignee/Status write).
--force only after the user confirms.gh to mutate the board directly — go through engine.sh (the
gh.py verbs ride its --force rail).Sprint/Milestone/Start/ Target (that is plan-sprint), never the PR (that is promote-pr).Closes/Fixes/Resolves (AC-30); closure is
the prod-time board-status job's responsibility.hooks/guard.sh) hard-blocks a --squash merge and a
prod deploy without provably-green checks while this skill runs (AC-25).0 ok · 2 usage / no App token · 3 project/field/issue not
found · 1 unexpected.npx claudepluginhub zakattack9/agentic-coding --plugin gh-projectsCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.