From hamster
Resumes interrupted /ship sessions by auto-detecting brief from git branch or in-progress tasks, reconstructing state from git history and task statuses, and continuing from the correct wave.
npx claudepluginhub gethamster/cli --plugin hamsterThis skill uses the workspace's default tool permissions.
Resumes an interrupted `/ship` session. Auto-detects the brief from git branch name or in-progress tasks, reconstructs execution state from task statuses, git log, and git status (no state file needed), then continues from the correct wave.
Resumes coding sessions by detecting blockers, reconciling STATE.md with filesystem, and suggesting next actions from checkpoints or plans.
Detects and resumes incomplete work after CLI crashes, network drops, or agent errors. Prioritizes TASKS.md tasks, progress logs, git worktree status, and conversation history.
Resumes parked coding sessions from handoff documents: locates in CLAUDE.md or .parkinglot/, summarizes next steps, validates git branches/files, offers update or fresh start options.
Share bugs, ideas, or general feedback.
Resumes an interrupted /ship session. Auto-detects the brief from git branch name or in-progress tasks, reconstructs execution state from task statuses, git log, and git status (no state file needed), then continues from the correct wave.
Argument: "$ARGUMENTS"
account=$(ls -d .hamster/*/ 2>/dev/null | head -1 | xargs basename)
echo "Account: $account"
Start live sync so task status updates are reflected in local .hamster/ files:
hamster sync --watch > /dev/null 2>&1 &
HAMSTER_SYNC_PID=$!
echo "Live sync started (PID: $HAMSTER_SYNC_PID)"
Try these methods in order:
Method A — Argument provided ("$ARGUMENTS" is not empty):
slug="$ARGUMENTS"
ls ".hamster/${account}/briefs/${slug}/brief.md" 2>/dev/null && echo "Found: $slug"
Method B — Git branch name:
branch=$(git branch --show-current 2>/dev/null)
if echo "$branch" | grep -qE '^feature/ham-[0-9]+-'; then
slug=$(echo "$branch" | sed -E 's/^feature\/ham-[0-9]+-//')
echo "Detected from branch: $slug"
fi
Method C — In-progress tasks (scan all briefs for tasks with in_progress status):
for tasks_dir in .hamster/${account}/briefs/*/tasks; do
[ ! -d "$tasks_dir" ] && continue
matches=$(grep -l '^status: "in_progress"' "$tasks_dir"/*.md 2>/dev/null)
if [ -n "$matches" ]; then
brief_slug=$(basename "$(dirname "$tasks_dir")")
in_progress_tasks=$(echo "$matches" | xargs -I{} basename {} .md | grep -oE 'ham-[0-9]+' | tr '[:lower:]' '[:upper:]' | tr '\n' ', ' | sed 's/,$//')
echo "${brief_slug}: ${in_progress_tasks}"
fi
done
If multiple briefs have in-progress tasks, use AskUserQuestion to let the user choose.
Method D — None found:
/plan to pick a brief, or /ship to start freshLaunch the brief-planner agent to produce a fresh execution plan:
The planner returns:
Reconstruct execution state from three sources — no state file needed:
The planner's execution plan includes current status for every task (done/in_progress/todo).
git log --oneline | grep 'feat(ham-' | sed -E 's/.*feat\(ham-([0-9]+)\).*/HAM-\1/' | sort -u
This extracts HAM-IDs from commit messages to identify which parent tasks have been committed.
git status --porcelain
Shows any in-flight changes from an interrupted executor.
Using the parallel waves from the brief-planner output, walk waves in order:
For each wave, check every parent task in that wave against the git log:
feat(ham-{id}) commits in git log → wave is complete, skip itFor a partial wave: filter out already-committed parents. The remaining parents in that wave become the resume targets.
For in_progress tasks: if git status --porcelain shows uncommitted changes and a task is in_progress, that task was interrupted mid-execution.
Report the resume point to the user:
Resuming brief: {title}
Completed waves:
Wave 1: HAM-100, HAM-300 (all committed)
Resuming from Wave 2, Parent HAM-200:
HAM-200: Parent Task B (todo)
HAM-201: Subtask 3 (todo) <-- starting here
HAM-202: Subtask 4 (todo)
HAM-400: Parent Task D (todo)
HAM-401: Subtask 5 (todo)
Remaining: {n} parent tasks across {m} waves
Use AskUserQuestion:
If "Start from a different task": ask which task display ID to start from.
Once confirmed, continue the execution loop from /ship, starting from the determined resume wave and position.
Verify we're on the correct feature branch:
feature/ham-{id}-{slug} branch: continueContinue the wave-based execution loop exactly as in /ship Steps 1-7, starting from the resume wave:
For each remaining wave (starting from the resume wave):
Launch ALL task-executor agents for this wave simultaneously (parallel Agent calls). For partial waves, launch only the uncommitted parents.
Each executor receives:
Wait for ALL executors to complete. Collect file lists from each.
Run project validation once after all executors complete:
[ -f "package.json" ] && command -v pnpm >/dev/null && { pnpm typecheck 2>/dev/null; pnpm lint 2>/dev/null; }
[ -f "package.json" ] && command -v npm >/dev/null && ! command -v pnpm >/dev/null && { npm run typecheck 2>/dev/null; npm run lint 2>/dev/null; }
[ -f "package.json" ] && command -v yarn >/dev/null && ! command -v pnpm >/dev/null && { yarn typecheck 2>/dev/null; yarn lint 2>/dev/null; }
[ -f "Makefile" ] && make check 2>/dev/null
[ -f "Cargo.toml" ] && cargo check && cargo clippy 2>/dev/null
[ -f "go.mod" ] && go build ./... && go vet ./... 2>/dev/null
If validation fails: fix errors before proceeding.
Launch ALL quality-gate agents for this wave simultaneously (parallel Agent calls).
Each quality-gate receives:
Wait for ALL quality-gates to complete.
For each quality-gate result:
For each parent in this wave (sequentially — commits are serial for git safety):
git add {file1} {file2} {file3}
git diff --cached --name-only
git commit -m "feat(ham-{id}): {concise description of parent task}
- {bullet: key change 1}
- {bullet: key change 2}
Task: HAM-{id}
Brief: {brief-slug}"
NEVER use git add . or git add -A — always stage specific files.
Wave {n} complete:
HAM-{id}: {title} — {n} subtasks, PASS, {n} commits
HAM-{id}: {title} — {n} subtasks, PASS, {n} commits
Remaining: {n} waves, {n} parent tasks
Stop live sync, then same as /ship:
[ -n "$HAMSTER_SYNC_PID" ] && kill "$HAMSTER_SYNC_PID" 2>/dev/null && echo "Live sync stopped"
If a task was in_progress when execution was interrupted:
git diff to see if partial work existsIf a PR already exists for this branch:
If there are uncommitted changes when resuming:
If a wave was partially completed (some parents committed, others not):
git log --oneline | grep 'feat(ham-'