Help us improve
Share bugs, ideas, or general feedback.
From go-workflow
Automates end-to-end GitHub issue completion: parses issue #N, chains /start-issue implementation, codex review, /e2e-verify, fixes, and merges PR. Invoke via /complete-issue.
npx claudepluginhub gopherguides/gopher-ai --plugin go-workflowHow this skill is triggered — by the user, by Claude, or both
Slash command
/go-workflow:complete-issueThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Autonomous end-to-end pipeline: **issue number in → merged PR out.**
Starts GitHub issue work: fetches details via gh CLI, creates worktree/branch, detects bug/feature, explores codebase, proposes design before implementing.
Creates a branch and draft PR before implementing, enabling a PR-first workflow. Supports issue-linked development, review loops, and nested PR-on-PR scenarios.
Orchestrates end-to-end coding tasks from issue intake through implementation, PR review, dev deployment, and acceptance verification using a state machine and sub-skills. Use for minimal human re-intervention.
Share bugs, ideas, or general feedback.
Autonomous end-to-end pipeline: issue number in → merged PR out.
Chains: /start-issue → codex review → /e2e-verify fix-and-ship
ISSUE_NUM=""
FLAGS=""
SKIP_NEXT=false
for arg in $ARGUMENTS; do
if [ "$SKIP_NEXT" = "true" ]; then
FLAGS="$FLAGS $arg"
SKIP_NEXT=false
elif [ "$arg" = "--coverage-threshold" ]; then
FLAGS="$FLAGS $arg"
SKIP_NEXT=true
elif echo "$arg" | grep -qE '^--'; then
FLAGS="$FLAGS $arg"
elif [ -z "$ISSUE_NUM" ] && echo "$arg" | grep -qE '^[0-9]+$'; then
ISSUE_NUM="$arg"
else
FLAGS="$FLAGS $arg"
fi
done
if [ -z "$ISSUE_NUM" ]; then
echo "Error: Issue number is required."
echo "Usage: /complete-issue <issue-number> [--skip-coverage] [--coverage-threshold <n>] [--no-agents]"
exit 1
fi
echo "Issue: $ISSUE_NUM | Flags: $FLAGS"
STATE_FILE=".claude/complete-issue-${ISSUE_NUM}.loop.local.json"
if [ -f "$STATE_FILE" ] && [ -n "$(jq -r '.phase // empty' "$STATE_FILE" 2>/dev/null)" ]; then
echo "Re-entry detected — skipping setup-loop."
else
"${CLAUDE_PLUGIN_ROOT}/scripts/setup-loop.sh" "complete-issue-${ISSUE_NUM}" "COMPLETE" 100 "" \
'{"implementing":"Resume start-issue implementation.","reviewing":"Resume codex review.","verifying":"Resume E2E verification and shipping."}'
fi
TMP="$STATE_FILE.tmp"
jq --arg issue_num "$ISSUE_NUM" --arg flags "$FLAGS" --arg pr_number "" \
'. + {issue_num: $issue_num, flags: $flags, pr_number: $pr_number}' \
"$STATE_FILE" > "$TMP" && mv "$TMP" "$STATE_FILE"
source "${CLAUDE_PLUGIN_ROOT}/lib/loop-state.sh"
if [ -f "$STATE_FILE" ]; then
read_loop_state "$STATE_FILE"
fi
If PHASE is set, recover state and skip to the corresponding phase:
implementing → go to Phase 1reviewing → go to Phase 2verifying → go to Phase 3/start-issue)set_loop_phase "$STATE_FILE" "implementing"
Invoke /go-workflow:start-issue $ISSUE_NUM $FLAGS.
This runs the full start-issue workflow:
After /start-issue completes, detect the PR number and worktree context:
PR_NUM=$(gh pr view --json number --jq '.number' 2>/dev/null)
# Detect if start-issue created a worktree (CWD may have changed)
GIT_DIR_ABS=$(cd "$(git rev-parse --git-dir 2>/dev/null)" && pwd)
GIT_COMMON_ABS=$(cd "$(git rev-parse --git-common-dir 2>/dev/null)" && pwd)
if [ "$GIT_DIR_ABS" != "$GIT_COMMON_ABS" ]; then
WORKTREE_PATH=$(pwd)
echo "Running in worktree: $WORKTREE_PATH"
fi
# Reassign STATE_FILE to absolute path so it resolves correctly after CWD changes
STATE_FILE="$(pwd)/.claude/complete-issue-${ISSUE_NUM}.loop.local.json"
TMP="$STATE_FILE.tmp"
jq --arg pr_number "$PR_NUM" --arg worktree_path "${WORKTREE_PATH:-}" \
'.pr_number = $pr_number | .worktree_path = $worktree_path' \
"$STATE_FILE" > "$TMP" && mv "$TMP" "$STATE_FILE"
echo "PR #$PR_NUM created"
If a worktree was created: All subsequent phases MUST operate from $WORKTREE_PATH. Prefix every Bash command with cd "$WORKTREE_PATH" && and use $WORKTREE_PATH as the base for all Read/Edit/Write file paths. The pre-tool-use hook will block tool calls targeting the wrong directory. The STATE_FILE variable has been reassigned to an absolute path so set_loop_phase calls resolve correctly regardless of CWD.
set_loop_phase "$STATE_FILE" "reviewing"
Run an LLM review to catch issues before E2E verification:
Check codex availability:
if command -v codex >/dev/null 2>&1; then
echo "Using codex for review"
else
echo "Codex not available — using agent-based review"
fi
If codex available: Run codex review on the PR diff:
DEFAULT_BRANCH=$(git remote show origin 2>/dev/null | grep 'HEAD branch' | sed 's/.*: //' || echo "main")
DIFF=$(git diff "origin/${DEFAULT_BRANCH}...HEAD")
Use codex exec with structured output to get all findings at once (avoids the 2-3 finding per-pass limit of interactive mode).
If codex NOT available: Use an Agent subagent to review the diff for correctness, security, and Go idioms.
Address findings: For each valid finding, make the fix. Skip findings that are false positives or cosmetic-only.
Commit fixes (if any changes were made):
git add -A
git commit -m "fix: address codex review findings"
git push
set_loop_phase "$STATE_FILE" "verifying"
Invoke /go-workflow:e2e-verify $PR_NUM fix-and-ship.
This runs the full e2e-verify workflow in fix-and-ship mode:
run-full-ci label/go-workflow:ship to mergeOutput <done>COMPLETE</done> when ALL of these are true:
/ship)When ALL criteria are met, output exactly: <done>COMPLETE</done>
Safety: If 15+ iterations without success, document blockers and ask user.