shiplisted
Install: claude install-skill firatcand/forge
# /ship
## Preflight: worktree guard
Task-scoped mutating skill — must run from a worktree, not the main checkout. Contract: `skills/_shared/worktree-guard.md`.
```bash
TOPLEVEL="$(git rev-parse --show-toplevel 2>/dev/null || echo '')"
if [ -z "$TOPLEVEL" ]; then
echo "✗ worktree-guard: not inside a git repository" >&2
exit 1
fi
BRANCH="$(git branch --show-current 2>/dev/null || echo '')"
DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's@^origin/@@' || echo 'main')"
if [ -f "$TOPLEVEL/.forge/worktree-task.json" ]; then
echo "✓ worktree-guard: $TOPLEVEL ($BRANCH)"
elif [ "$BRANCH" = "${DEFAULT_BRANCH:-main}" ]; then
echo "✗ worktree-guard: refusing to run on default branch '$BRANCH' from $TOPLEVEL" >&2
echo " Parallel Claude Code sessions on the main checkout clobber each other's HEAD." >&2
echo " → cd into an existing worktree, or run /pickup-task to create one." >&2
exit 1
else
echo "⚠ worktree-guard: no .forge/worktree-task.json at $TOPLEVEL (branch: $BRANCH)" >&2
echo " Proceeding, but this worktree may be manually-created or stale." >&2
fi
```
## Gates (all must pass)
1. **Tests**: `npm test` (or detected equivalent) passes
2. **Type check**: `npm run typecheck` (if applicable) passes
3. **Lint**: `npm run lint` (if applicable) passes
4. **Secrets scan**: `gitleaks detect` on the diff
5. **Conventional commit**: at least one commit on this branch follows `feat|fix|chore|docs(scope): message`
6. **Test-or-die