From just-ship
Recovers stuck pipeline tickets: resumes worktrees with existing git changes, restarts empty ones. Checks board API status and concurrency.
npx claudepluginhub yves-s/just-ship --plugin just-shipThis skill uses the workspace's default tool permissions.
Erkennt ob ein Pipeline-Ticket steckengeblieben ist und recovered es automatisch: Resume bei vorhandenem Code, Restart bei leerem Worktree.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Erkennt ob ein Pipeline-Ticket steckengeblieben ist und recovered es automatisch: Resume bei vorhandenem Code, Restart bei leerem Worktree.
Lies project.json. Bestimme den Pipeline-Modus:
pipeline.workspace_id gesetzt -> board-api.sh verwenden:
bash .claude/scripts/board-api.sh get "tickets/{N}"
bash .claude/scripts/board-api.sh patch "tickets/{N}" '{"status": "ready_to_develop"}'
Credentials werden intern aufgelöst. pipeline.project_id aus project.json.pipeline.workspace_id NICHT gesetzt -> Nur lokales Recovery, keine Board-Updates.KEINE RUECKFRAGEN. Entscheide selbst ob Resume oder Restart. Fuehre alle Schritte autonom aus.
Aus $ARGUMENTS:
T-501 -> 501501 -> 501Falls kein Argument uebergeben:
ACTIVE=$(cat .claude/.active-ticket 2>/dev/null || echo "")
Falls $ACTIVE nicht leer: verwende $ACTIVE als Ticket-Nummer.
Falls leer: Fehlermeldung "Keine Ticket-Nummer angegeben. Nutzung: /recover T-{N}" und stoppen.
ACTIVE=$(cat .claude/.active-ticket 2>/dev/null || echo "")
Falls $ACTIVE == {N}: Abbruch mit Meldung "T-{N} wird gerade aktiv bearbeitet." und stoppen.
Ticket vom Board holen:
bash .claude/scripts/board-api.sh get "tickets/{N}"
status und pipeline_status aus der Response auslesen.
Entscheidungslogik:
pipeline_status == paused -> Meldung "T-{N} wartet auf Input." -> Stop. Das ist human-in-the-loop, NICHT stuck.status != in_progress UND pipeline_status ist NICHT running/crashed -> Meldung "T-{N} ist nicht blockiert (status={status}, pipeline_status={pipeline_status})." -> Stop.Falls die Bedingungen erfuellt sind: weiter zu Schritt 3.
Bevor Cleanup passiert — Evidenz erhalten:
bash .claude/scripts/send-event.sh {N} orchestrator agent_failed '{"reason": "manual_stop"}'
Pruefe ob .worktrees/T-{N} existiert:
ls -d .worktrees/T-{N} 2>/dev/null
Falls Worktree existiert:
Aenderungen pruefen:
cd .worktrees/T-{N}
MERGE_BASE=$(git merge-base main HEAD 2>/dev/null || echo "")
DIFF_STAT=""
if [ -n "$MERGE_BASE" ]; then
DIFF_STAT=$(git diff --stat "$MERGE_BASE"..HEAD)
fi
UNCOMMITTED=$(git status --porcelain)
$DIFF_STAT nicht leer ODER $UNCOMMITTED nicht leer -> RESUME (Schritt 5a)Falls kein Worktree existiert:
Pruefe ob ein Branch fuer das Ticket existiert:
git branch --list "feature/T-{N}-*" "fix/T-{N}-*" "chore/T-{N}-*" "docs/T-{N}-*" | head -1
Ausgabe: Resume — T-{N} hat vorhandene Arbeit, setze fort
1. Infrastruktur re-etablieren:
Note:
.active-ticketwird automatisch vom PostToolUse-Hook (detect-ticket-post.sh) gesetzt, sobald der erste Bash-Befehl im Worktree läuft. Kein manuelles Schreiben nötig.
Orchestrator-Event senden:
bash .claude/scripts/send-event.sh {N} orchestrator agent_started
2. Vorhandene Arbeit analysieren:
cd .worktrees/T-{N}
git diff --stat $(git merge-base main HEAD)..HEAD
git status --porcelain
git log --oneline $(git merge-base main HEAD)..HEAD
3. Phase bestimmen:
Pruefe ob ein Checkpoint existiert (z.B. .claude/.checkpoint-T-{N} oder aehnliche Marker). Falls ja, verwende den Checkpoint.
Falls kein Checkpoint — Heuristik:
| Zustand | Einstiegspunkt |
|---|---|
| Uncommitted Aenderungen vorhanden | Ab Schritt 6 (Build-Check) aus /develop |
| Commits vorhanden, kein PR existiert | Ab Schritt 9 (Commit/Push/PR) aus /develop |
| PR existiert bereits | Ab Schritt 10 (Automated QA) aus /develop |
PR-Existenz pruefen:
cd .worktrees/T-{N}
gh pr view 2>/dev/null && echo "PR_EXISTS=true" || echo "PR_EXISTS=false"
4. /develop-Schritte fortsetzen:
Lies commands/develop.md und fuehre die Schritte ab dem bestimmten Schritt aus. Alle Schritte im Worktree .worktrees/T-{N}/ ausfuehren. Ticket-Daten aus dem Board-Response (Schritt 2) verwenden.
5. WICHTIG: Triage und Planung werden NICHT wiederholt. Der Code im Worktree IST das Ergebnis der Planung.
Ausgabe: Restart — T-{N} hat keine verwertbare Arbeit, starte neu
1. Event wurde bereits in Schritt 3 gesendet (Evidenz erhalten bevor Cleanup).
2. Aufraeumen:
Worktree entfernen (falls vorhanden):
git worktree remove .worktrees/T-{N} --force 2>/dev/null || true
Branch loeschen — alle moeglichen Prefixe pruefen:
for PREFIX in feature fix chore docs; do
BRANCH=$(git branch --list "${PREFIX}/T-{N}-*" | head -1 | xargs)
if [ -n "$BRANCH" ]; then
git branch -D "$BRANCH" 2>/dev/null || true
fi
done
Active-Ticket aufraeumen:
rm -f .claude/.active-ticket
3. Ticket zuruecksetzen (falls Pipeline konfiguriert):
bash .claude/scripts/board-api.sh patch "tickets/{N}" '{"status": "ready_to_develop", "pipeline_status": null}'
Beide Felder muessen zurueckgesetzt werden: status auf ready_to_develop UND pipeline_status auf null.
4. /develop aufrufen:
Rufe /develop T-{N} auf — der vollstaendige Entwicklungsflow startet von vorne.
Resume:
recover -- T-{N} fortgesetzt ab Schritt {X}
Restart:
recover -- T-{N} neu gestartet via /develop
git worktree remove --force, dann RESTART/develop