#!/bin/bash set -euo pipefail # Script to create a GitHub issue and initialize a task directory # Can also convert an existing task directory to a GitHub issue # Usage: ./create-issue.sh [description] [existing-task-dir] [labels] # If existing-task-dir is provided, converts that directory to a GitHub issue # Labels should be comma-separated (e.g., "UI,bug" or "CLI,feature") if [ $# -lt 1 ]; then echo "Usage: $0 <title> [description] [existing-task-dir] [labels]" echo "" echo "Arguments:" echo " title Issue title" echo " description Issue description (optional)" echo " existing-task-dir Path to existing task directory to convert (optional)" echo " labels Comma-separated labels to apply (optional)" echo "" echo "Available labels: UI, CLI, bug, feature" echo "" echo "Examples:" echo " $0 'Add dark mode toggle'" echo " $0 'Add dark mode toggle' 'Implement dark/light theme switcher' '' 'UI,feature'" echo " $0 'Fix authentication bug' '' ./tasks/existing-task 'bug'" exit 1 fi TITLE="$1" DESCRIPTION="${2:-}" EXISTING_TASK_DIR="${3:-}" LABELS="${4:-}" # Detect GitHub repository from git remote or environment SCRIPT_DIR="$(dirname "$0")" # shellcheck source=lib-repo-detect.sh source "$SCRIPT_DIR/lib-repo-detect.sh" if ! detect_github_repo; then exit 1 fi OWNER="$REPO_OWNER" REPO="$REPO_NAME" REPO_FULL="$OWNER/$REPO" echo "Creating GitHub issue..." [ -n "$LABELS" ] && echo "Applying labels: $LABELS" # Build gh issue create command with optional labels GH_ARGS=("issue" "create" "--repo" "$REPO_FULL" "--title" "$TITLE") if [ -n "$DESCRIPTION" ]; then GH_ARGS+=("--body" "$DESCRIPTION") fi if [ -n "$LABELS" ]; then GH_ARGS+=("--label" "$LABELS") fi ISSUE_URL=$(gh "${GH_ARGS[@]}" 2>/dev/null) if [ -z "$ISSUE_URL" ]; then echo "Error: Failed to create GitHub issue" exit 1 fi echo "✓ GitHub issue created: $ISSUE_URL" # Extract issue number from URL if [[ $ISSUE_URL =~ /issues/([0-9]+)$ ]]; then ISSUE_NUM="${BASH_REMATCH[1]}" else echo "Error: Could not extract issue number from URL: $ISSUE_URL" exit 1 fi # Determine task directory name TASK_NAME=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/-$//') TASK_DIR="tasks/${ISSUE_NUM}-${TASK_NAME}" # Handle existing task directory conversion if [ -n "$EXISTING_TASK_DIR" ]; then if [ ! -d "$EXISTING_TASK_DIR" ]; then echo "Error: Existing task directory not found: $EXISTING_TASK_DIR" exit 1 fi echo "Converting existing task directory..." # Check if task directory already exists with the new name if [ -d "$TASK_DIR" ]; then echo "Error: Task directory already exists: $TASK_DIR" exit 1 fi # Move existing directory to new location mv "$EXISTING_TASK_DIR" "$TASK_DIR" echo "✓ Renamed $EXISTING_TASK_DIR to $TASK_DIR" else # Create new task directory mkdir -p "$TASK_DIR" echo "✓ Created task directory: $TASK_DIR" fi # Check if task files exist and push them echo "" echo "Checking for task files to sync..." HAS_FILES=0 if [ -f "$TASK_DIR/SPEC.md" ] || [ -f "$TASK_DIR/PLAN.md" ] || \ [ -f "$TASK_DIR/TEST_PLAN.md" ] || [ -f "$TASK_DIR/COMMIT_MESSAGE.md" ]; then HAS_FILES=1 fi if [ $HAS_FILES -eq 1 ]; then echo "Syncing task files to GitHub issue..." # Use the push.sh script to sync all files PUSH_SCRIPT="$(dirname "$0")/push.sh" if [ -x "$PUSH_SCRIPT" ]; then "$PUSH_SCRIPT" "$ISSUE_NUM" "$TASK_DIR" else echo "Warning: Could not find push.sh script to sync files" fi else echo "No task files found to sync (create SPEC.md, PLAN.md, etc. to sync them)" fi echo "" echo "=========================================" echo "✅ Task setup complete!" echo "=========================================" echo "Issue: $ISSUE_URL" echo "Task Directory: $TASK_DIR" echo "Task Number: $ISSUE_NUM" echo "" echo "Next steps:" echo "1. Create SPEC.md, PLAN.md, TEST_PLAN.md, COMMIT_MESSAGE.md in $TASK_DIR" echo "2. Run 'push.sh $ISSUE_NUM $TASK_DIR' to sync files to GitHub" echo "3. Run '/write-spec' or other commands to begin work"