diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..ab1f4164 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/figma-cli-claude.iml b/.idea/figma-cli-claude.iml new file mode 100644 index 00000000..c956989b --- /dev/null +++ b/.idea/figma-cli-claude.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..4867eebc --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/bin/fig-start b/bin/fig-start index ebf871b9..659b0f7b 100755 --- a/bin/fig-start +++ b/bin/fig-start @@ -1,7 +1,7 @@ #!/bin/bash -# fig-start — Launch Figma CLI + Claude Code -# Connects to Figma, lets you pick an open file, then launches Claude Code. +# fig-start — Launch Figma CLI + Gemini CLI +# Connects to Figma, lets you pick an open file, then launches Gemini CLI. # # Usage: # fig-start → Yolo Mode (default) with file selector @@ -109,6 +109,124 @@ select_file() { done } +# ── AI CLI selector ── + +select_ai() { + local options=("Gemini CLI" "Claude Code" "Qwen CLI" "DeepSeek CLI" "Copilot CLI" "Auto (detect from context)") + local count=${#options[@]} + local selected=0 + + tput civis > /dev/tty 2>/dev/null + + draw_ai_menu() { + if [ "$1" = "redraw" ]; then + printf "\033[%dA" "$((count + 2))" > /dev/tty + fi + printf "${BOLD}Select AI assistant (↑↓ arrows, Enter to confirm):${NC}\n" > /dev/tty + printf "\n" > /dev/tty + for i in "${!options[@]}"; do + if [ "$i" -eq "$selected" ]; then + printf " ${GREEN}▸ %s${NC}\n" "${options[$i]}" > /dev/tty + else + printf " %s\n" "${options[$i]}" > /dev/tty + fi + done + } + + draw_ai_menu "first" + + while true; do + IFS= read -rsn1 key < /dev/tty + case "$key" in + $'\x1b') + read -rsn2 seq < /dev/tty + case "$seq" in + '[A') ((selected--)); [ "$selected" -lt 0 ] && selected=$((count - 1)) ;; + '[B') ((selected++)); [ "$selected" -ge "$count" ] && selected=0 ;; + esac + ;; + ''|$'\n'|$'\r') + tput cnorm > /dev/tty 2>/dev/null + printf "\n" > /dev/tty + printf '%s' "${options[$selected]}" + return + ;; + esac + draw_ai_menu "redraw" + done +} + +detect_auto_cli() { + local gemini_ok=false + local claude_ok=false + local qwen_ok=false + command -v gemini &>/dev/null && gemini_ok=true + command -v claude &>/dev/null && claude_ok=true + command -v qwen &>/dev/null && qwen_ok=true + local deepseek_ok=false + command -v deepseek &>/dev/null && deepseek_ok=true + local copilot_ok=false + command -v copilot &>/dev/null && copilot_ok=true + + # Context clues: CLAUDE.md present → prefer Claude + if [ -f "$REPO_PATH/CLAUDE.md" ] && [ "$claude_ok" = true ]; then + echo "claude" + elif [ "$gemini_ok" = true ]; then + echo "gemini" + elif [ "$claude_ok" = true ]; then + echo "claude" + elif [ "$qwen_ok" = true ]; then + echo "qwen" + elif [ "$deepseek_ok" = true ]; then + echo "deepseek" + elif [ "$copilot_ok" = true ]; then + echo "copilot" + else + echo "" + fi +} + +launch_ai() { + local choice="$1" + if [ "$STAY_HERE" = false ]; then + cd "$REPO_PATH" || exit 1 + fi + case "$choice" in + "Gemini CLI") + echo -e " ${GREEN}Launching Gemini CLI...${NC}"; echo "" + exec gemini + ;; + "Claude Code") + echo -e " ${GREEN}Launching Claude Code...${NC}"; echo "" + exec claude + ;; + "Qwen CLI") + echo -e " ${GREEN}Launching Qwen CLI...${NC}"; echo "" + exec qwen + ;; + "DeepSeek CLI") + echo -e " ${GREEN}Launching DeepSeek CLI...${NC}"; echo "" + exec deepseek + ;; + "Copilot CLI") + echo -e " ${GREEN}Launching Copilot CLI...${NC}"; echo "" + exec copilot + ;; + "Auto"*) + local cli + cli=$(detect_auto_cli) + case "$cli" in + gemini) echo -e " ${GREEN}Launching Gemini CLI...${NC} ${DIM}(auto)${NC}"; echo ""; exec gemini ;; + claude) echo -e " ${GREEN}Launching Claude Code...${NC} ${DIM}(auto)${NC}"; echo ""; exec claude ;; + qwen) echo -e " ${GREEN}Launching Qwen CLI...${NC} ${DIM}(auto)${NC}"; echo ""; exec qwen ;; + deepseek) echo -e " ${GREEN}Launching DeepSeek CLI...${NC} ${DIM}(auto)${NC}"; echo ""; exec deepseek ;; + copilot) echo -e " ${GREEN}Launching Copilot CLI...${NC} ${DIM}(auto)${NC}"; echo ""; exec copilot ;; + *) echo -e " ${RED}No AI CLI found. Install gemini, claude, qwen, deepseek, or copilot.${NC}"; exit 1 ;; + esac + ;; + esac +} + # ── Main ── # Handle flags @@ -188,12 +306,9 @@ if [ "$SAFE_MODE" = true ]; then echo "" # Skip file selector (Safe Mode only sees the active file via plugin) - echo -e " ${GREEN}Launching Claude Code...${NC}" echo "" - if [ "$STAY_HERE" = false ]; then - cd "$REPO_PATH" || exit 1 - fi - exec claude + AI_CHOICE=$(select_ai) + launch_ai "$AI_CHOICE" else # ── Yolo Mode: CDP-based connection ── # Check if CDP is already accessible (avoid killing/restarting Figma) @@ -259,12 +374,9 @@ for f in files: if [ ${#FILE_TITLES[@]} -eq 0 ]; then echo -e " ${YELLOW}No Figma files detected.${NC} Open a file in Figma first." echo "" - echo -e " Launching Claude Code anyway..." echo "" - if [ "$STAY_HERE" = false ]; then - cd "$REPO_PATH" || exit 1 - fi - exec claude + AI_CHOICE=$(select_ai) + launch_ai "$AI_CHOICE" fi SELECTED_TITLE="" @@ -279,11 +391,9 @@ for f in files: echo -e " ${GREEN}✓ File: ${BOLD}${SELECTED_TITLE}${NC}" echo "" - # Step 4: Launch Claude Code - echo -e " ${GREEN}Launching Claude Code...${NC}" + # Step 4: Select and launch AI assistant echo "" - if [ "$STAY_HERE" = false ]; then - cd "$REPO_PATH" || exit 1 - fi - exec claude + AI_CHOICE=$(select_ai) + launch_ai "$AI_CHOICE" fi +@ \ No newline at end of file