Tickets with no team assignment caused start-sprint.sh to create a spurious "sprint-N/None" worktree and Ptyxis tab. Filter at both the SQL level (AND team IS NOT NULL) and Python level (if r['team']). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
66 lines
2.7 KiB
Bash
Executable File
66 lines
2.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Opens Ptyxis tabs for the active sprint teams in the CURRENT window.
|
|
# Auto-starts Claude Code in each tab via tmux.
|
|
#
|
|
# Usage: start-sprint.sh [sprint-number]
|
|
# If omitted, auto-detects the active sprint from the database.
|
|
#
|
|
# Assumes the caller is already on main in the current terminal.
|
|
# Adds one tab per active team — no duplicate main tab.
|
|
#
|
|
# Worktrees are created under .sprint/ (ephemeral, cleaned after sprint close).
|
|
# Can be called from any directory — resolves paths from the script location.
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
# Script lives at .claude/skills/sprint-start/scripts/ — repo root is 4 levels up
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
|
|
# Parent of repo root is where .sprint/ and the DB live
|
|
PARENT="$(dirname "$REPO_ROOT")"
|
|
|
|
# Resolve sprint number — argument or active sprint from DB
|
|
if [ -n "${1:-}" ]; then
|
|
SPRINT="$1"
|
|
else
|
|
SPRINT=$(cd "$REPO_ROOT" && tooling/db/sqlite-query "SELECT id FROM sprints WHERE status='active'" 2>/dev/null | python3 -c "import sys,json; print(json.load(sys.stdin)['rows'][0]['id'])" 2>/dev/null || true)
|
|
if [ -z "$SPRINT" ]; then
|
|
echo "error: no active sprint found. Pass a sprint number or activate a sprint first." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Query teams with open tickets
|
|
TEAMS=$(cd "$REPO_ROOT" && tooling/db/sqlite-query "SELECT DISTINCT team FROM tickets WHERE sprint_id=$SPRINT AND status NOT IN ('done','cancelled') AND team IS NOT NULL" 2>/dev/null | python3 -c "import sys,json; [print(r['team']) for r in json.load(sys.stdin)['rows'] if r['team']]" 2>/dev/null || true)
|
|
|
|
if [ -z "$TEAMS" ]; then
|
|
echo "Sprint $SPRINT has no open tickets. Opening main only."
|
|
fi
|
|
|
|
echo "Sprint $SPRINT — teams: ${TEAMS:-none}"
|
|
|
|
# ── Open team tabs in the CURRENT window ────────────────────────────
|
|
# No separate main tab — the caller is already on main.
|
|
# All team tabs open as --tab in the active Ptyxis window.
|
|
for team in $TEAMS; do
|
|
BRANCH="sprint-${SPRINT}/${team}"
|
|
WDIR="$PARENT/.sprint/sprint-${SPRINT}/${team}"
|
|
|
|
# Create worktree if it doesn't exist
|
|
if [ ! -d "$WDIR" ]; then
|
|
echo "Creating worktree: $WDIR (branch: $BRANCH)"
|
|
mkdir -p "$(dirname "$WDIR")"
|
|
# Create branch from main if it doesn't exist remotely
|
|
if git -C "$REPO_ROOT" rev-parse --verify "origin/$BRANCH" >/dev/null 2>&1; then
|
|
git -C "$REPO_ROOT" worktree add "$WDIR" "$BRANCH"
|
|
else
|
|
git -C "$REPO_ROOT" worktree add -b "$BRANCH" "$WDIR" HEAD
|
|
fi
|
|
fi
|
|
|
|
ptyxis --tab -d "$WDIR" -x 'tmux new-session \; send-keys "claude /sprint-start" Enter'
|
|
sleep 0.3
|
|
done
|
|
|
|
echo "Session ready. Main + ${TEAMS:-(no teams)}"
|