2025/07/15

テクノロジー

「qq」コマンドでQ Developerの -r 忘れを防止

この記事の目次

    Q Developer 会話履歴継続を完全自動化

    「また-rオプション忘れた...」と思った経験ありませんか?
    組織のSSO設定で認証情報が永続化できない環境では、毎回ログインが必要な上に、会話履歴の継続も忘れがちです。

    そこで、チャットやログインの処理をexpectで自動化、qqコマンドを作成してみました。

    • -r オプションを自動で付与、会話履歴の継続忘れを防止
    • ログイン時のエンター連打も完全自動化
    • デバイス認証URLを自動でブラウザオープン

    ※Ubuntuでのインストールが前提です。
    ※組織固有のパラメータは<HOGEHOGE> でマスクしています。

    #!/bin/bash
    
    # =============================================================================
    # Q Developer CLI 自動セットアップスクリプト
    # 
    # 目的: Q Developer CLIのログインとチャット起動を完全自動化
    # 課題: 組織の制約により認証情報の永続化が不可能なため、毎回ログインが必要
    # 解決: expectコマンドによる対話自動化とブラウザ自動オープン
    #
    # 使用方法:
    # 1. このスクリプトを任意のディレクトリに配置
    # 2. 実行権限を付与: chmod +x qq
    # 3. PATHに追加してどこからでも実行可能にする:
    #    echo 'export PATH="$PATH:/path/to/script/directory"' >> ~/.bashrc
    #    source ~/.bashrc
    # 4. qqコマンドで実行
    # =============================================================================
    
    echo "🚀 Q Developer セットアップ中..."
    echo "📋 スクリプトバージョン: v5.3-dependency-check ($(date '+%Y-%m-%d %H:%M:%S'))"
    
    # 依存関係チェック
    echo "🔍 依存関係を確認中..."
    missing_commands=()
    
    # Amazon Q Developer CLI の確認
    if ! command -v q >/dev/null 2>&1; then
        missing_commands+=("Amazon Q Developer CLI (q)")
    fi
    
    # expect コマンドの確認
    if ! command -v expect >/dev/null 2>&1; then
        missing_commands+=("expect")
    fi
    
    # xdg-open コマンドの確認
    if ! command -v xdg-open >/dev/null 2>&1; then
        missing_commands+=("xdg-utils")
    fi
    
    # 不足しているコマンドがある場合は警告して終了
    if [ ${#missing_commands[@]} -gt 0 ]; then
        echo "❌ 以下のコマンドがインストールされていません:"
        for cmd in "${missing_commands[@]}"; do
            echo "  - $cmd"
        done
        echo ""
        echo "📦 以下の方法でインストールしてください:"
        echo ""
        
        for cmd in "${missing_commands[@]}"; do
            case $cmd in
                "Amazon Q Developer CLI (q)")
                    echo "• Amazon Q Developer CLI (q):"
                    echo "  公式サイトでインストール方法を確認してください"
                    echo "  https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing.html"
                    echo ""
                    ;;
                "expect")
                    echo "• expect:"
                    echo "  sudo apt install expect"
                    echo ""
                    ;;
                "xdg-utils")
                    echo "• xdg-utils:"
                    echo "  sudo apt install xdg-utils"
                    echo ""
                    ;;
            esac
        done
        
        echo "インストール完了後、再度このスクリプトを実行してください。"
        exit 1
    fi
    
    echo "✅ 依存関係チェック完了"
    
    # エディタ設定
    # Q Developer CLIがファイル編集時に使用するエディタを指定
    # VS Codeの--waitオプションでCLIがエディタ終了まで待機するため
    export EDITOR="code --wait"
    echo "✅ エディタ設定完了: $EDITOR"
    
    # ログイン状態を確認
    # 既にログイン済みの場合は不要な処理をスキップして効率化
    echo "🔍 ログイン状態を確認中..."
    if q whoami >/dev/null 2>&1; then
        echo "✅ 既にログイン済みです"
    else
        echo "🔑 ログインが必要です。Proライセンスでログインします..."
        
        # expectを使用して自動ログイン(最長URL選択でブラウザ自動オープン)
        # Q Developer CLIのログインは対話型で手動エンター入力が必要
        # 組織制約により認証の永続化ができないため、毎回の自動化が必須
        expect -c "
            # タイムアウト設定
            # ネットワーク遅延やブラウザ認証待ちを考慮した十分な時間を確保
            set timeout 120
            
            # URL重複オープン防止フラグ
            # 複数のURLが出力されるため、デバイス認証URLを1回のみ開くため
            set url_opened 0
            
            # Q loginコマンドを起動
            spawn q login --license pro --identity-provider https://<HOGEHOGE>.awsapps.com/start --region ap-northeast-1 --use-device-flow
            
            expect {
                # エンター入力待ちパターンの自動処理
                # ログイン過程で複数回のエンター入力確認があるため
                \"Press Enter\" {
                    send \"\r\"
                    exp_continue
                }
                \"continue\" {
                    send \"\r\"
                    exp_continue
                }
                \"Enter\" {
                    send \"\r\"
                    exp_continue
                }
                
                # URL検出とブラウザ自動オープン
                # デバイス認証URLを手動でコピペする手間を省くため
                -re \"(https://\\\\S*)\" {
                    # 重複防止チェック
                    # 複数のURL(ベースURLと完全なデバイスURL)が出力されるため
                    if {\$url_opened == 0} {
                        set current_url \$expect_out(1,string)
                        
                        # 最長かつデバイス認証URLのみを対象とする条件判定
                        # 不完全なベースURLではなく、完全なデバイス認証URLのみを開くため
                        # URL形式の変化に対応するため、複数の判定条件を設定
                        if {[string length \$current_url] > 50 && ([string match \"*device*\" \$current_url] || [string match \"*user_code*\" \$current_url] || [string match \"*#/*\" \$current_url])} {
                            puts \"🌐 ブラウザでURLを自動オープン: \$current_url\"
                            
                            # バックグラウンドでブラウザ起動
                            # ブラウザ起動でスクリプトがブロックされないようにするため
                            exec xdg-open \$current_url &
                            
                            # フラグを立てて以降のURL処理をスキップ
                            # 同じURLや他のURLの重複オープンを防ぐため
                            set url_opened 1
                        }
                    }
                    exp_continue
                }
                
                # 正常終了処理
                eof {
                    puts \"ログイン処理が完了しました\"
                }
                
                # タイムアウト処理
                # ネットワーク問題や認証遅延時の無限待機を防ぐため
                timeout {
                    puts \"タイムアウトしました\"
                    exit 1
                }
            }
        "
        
        # ログイン成功確認
        # expectスクリプトが正常終了してもログインが失敗している可能性があるため
        if q whoami >/dev/null 2>&1; then
            echo "✅ ログイン完了"
        else
            echo "❌ ログインに失敗しました"
            exit 1
        fi
    fi
    
    # Q Chat を再開モードで起動
    # 前回の会話履歴を継続して効率的な対話を実現するため
    # Claude 4 Sonnetモデルを明示的に指定して一貫した応答品質を確保するため
    echo "✅ Q Chat をClade4で起動します..."
    q chat -r --model claude-4-sonnet
    
    

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

    もう「あ、また-rオプション忘れた」「エンター何回押すんだっけ」と悩む必要はありません。

    qqと打つだけで、すべてが自動で完了します。

    小さな自動化が、毎日の開発体験を大きく変えてくれるはずです。

    ※本記事は2025年07月時点の情報です。

    著者:マイナビエンジニアブログ編集部