Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -199,16 +199,13 @@ RUN set -eux; \
~/.local/share/pnpm \
~/.claude.json.backup*

# AI CLI の起動定義。~/.bashrc へ直接書かずファイルにしているのは、Docker を
# 起動せずに tests/containers/test_ai_cli_aliases.py で振る舞いを固定するため。
COPY --chmod=0644 ai-cli-aliases.sh /etc/devbase/ai-cli-aliases.sh

RUN set -eux; \
# AI CLI aliases
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc; \
echo 'alias claude='\''claude --dangerously-skip-permissions "$@"'\''' >> ~/.bashrc; \
echo 'alias claudb='\''CLAUDE_CODE_USE_BEDROCK=1 AWS_REGION=us-west-2 claude --dangerously-skip-permissions "$@"'\''' >> ~/.bashrc; \
echo 'alias gemini='\''GOOGLE_GENAI_USE_VERTEXAI=true gemini --yolo "$@"'\''' >> ~/.bashrc; \
echo 'alias codex='\''codex --dangerously-bypass-approvals-and-sandbox "$@"'\''' >> ~/.bashrc; \
echo 'alias kiro='\''kiro-cli chat --trust-all-tools "$@"'\''' >> ~/.bashrc; \
echo 'alias agy='\''agy --dangerously-skip-permissions "$@"'\''' >> ~/.bashrc; \
echo 'complete -o default claudb kiro' >> ~/.bashrc; \
echo '. /etc/devbase/ai-cli-aliases.sh' >> ~/.bashrc; \
git config --global credential.helper store; \
# Configure Claude Code hooks
mkdir -p ~/.claude; \
Expand Down
27 changes: 27 additions & 0 deletions containers/base/ai-cli-aliases.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# AI CLI の起動定義。対話シェルの ~/.bashrc から読み込まれる。
#
# ここに置くのは alias と補完の登録だけで、副作用を持つ処理は書かない。
# ~/.bashrc へ直接書き出すのをやめてファイルにしているのは、Docker を起動せずに
# tests/containers/test_ai_cli_aliases.py で振る舞いを固定するためである。
#
# 定義に "$@" は書かない。alias の "$@" は alias の引数ではなくシェルの位置
# パラメータへ展開されるため、引数を渡す働きをしない。引数は alias の展開で
# 末尾へ付く。
#
# 認証方式を決める環境変数もここでは設定しない。プロジェクトが env で選んだ値を
# 起動定義が上書きしてしまうため (PLAN50)。gemini の Vertex AI / OAuth の
# 切り替えは GOOGLE_GENAI_USE_VERTEXAI で行う。

# 各 CLI は開発コンテナの中でだけ使う前提のため、確認プロンプトを省くオプションを
# 既定で付ける。コンテナの外へ影響しない。
alias claude='claude --dangerously-skip-permissions'
# `command` を挟むのは claude の alias を展開させないため。挟まないと
# --dangerously-skip-permissions が 2 度渡り、claude 側の定義を変えたときに
# claudb まで一緒に変わる。
alias claudb='CLAUDE_CODE_USE_BEDROCK=1 AWS_REGION=us-west-2 command claude --dangerously-skip-permissions'
alias gemini='gemini --yolo'
alias codex='codex --dangerously-bypass-approvals-and-sandbox'
alias kiro='kiro-cli chat --trust-all-tools'
alias agy='agy --dangerously-skip-permissions'

complete -o default claudb kiro
46 changes: 46 additions & 0 deletions docs/user/container-operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,52 @@ gemini "テストを書いて"
codex "リファクタリングして"
```

## AI CLI の起動定義

コンテナの対話シェルでは、各 AI CLI が確認プロンプトを省くオプション付きで起動します。
定義は `/etc/devbase/ai-cli-aliases.sh` にあり、`~/.bashrc` から読み込まれます。

| コマンド | 起動するもの |
|---------|-------------|
| `claude` | `claude --dangerously-skip-permissions` |
| `claudb` | `claude --dangerously-skip-permissions`(Amazon Bedrock 経由。`CLAUDE_CODE_USE_BEDROCK=1` / `AWS_REGION=us-west-2` を前置) |
| `gemini` | `gemini --yolo` |
| `codex` | `codex --dangerously-bypass-approvals-and-sandbox` |
| `kiro` | `kiro-cli chat --trust-all-tools` |
| `agy` | `agy --dangerously-skip-permissions` |

引数はそのまま後ろへ渡ります(`gemini "テストを書いて"` は `gemini --yolo "テストを書いて"`)。
素の CLI を使いたいときは `command gemini ...` のように `command` を前置します。

### gemini の認証方式

**起動定義は認証方式を決めません。** 環境変数 `GOOGLE_GENAI_USE_VERTEXAI` で選びます。

| 設定 | 経路 |
|------|------|
| `GOOGLE_GENAI_USE_VERTEXAI=true` | Vertex AI(`GOOGLE_CLOUD_PROJECT` と ADC が要る) |
| 未設定・空 | `~/.gemini/settings.json` の `selectedType` に従う(`oauth-personal` など) |

Vertex AI を既定にするなら共通の設定へ入れます。

```bash
devbase env set GOOGLE_GENAI_USE_VERTEXAI=true
```

Vertex AI を使わないプロジェクト(別会社のアカウントで OAuth ログインするなど)は、
`projects/<name>/env` で空にして共通の値を打ち消します。`GOOGLE_CLOUD_PROJECT` と同じやり方です。

```
GOOGLE_GENAI_USE_VERTEXAI=
GOOGLE_CLOUD_PROJECT=
```

> **`GOOGLE_CLOUD_PROJECT` は認証方式を選ぶ変数ではありません。** gcloud や BigQuery でも使う
> プロジェクト指定なので、OAuth を使いながら別の用途で設定していても Vertex へは切り替わりません。

`~/.gemini` はアカウントグループのボリューム(`/persistent/group/.gemini`)にあるため、
OAuth のログインはコンテナを作り直しても残ります。

## tmux(ターミナル)の既定設定

コンテナ内の tmux には、devbase 共通の既定設定 `/etc/tmux.conf` が入っています
Expand Down
107 changes: 107 additions & 0 deletions issues/PLAN50_gemini-vertex-alias.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,3 +261,110 @@ BigQuery などの目的で同じ変数を設定した瞬間、意図せず Vert
設定した瞬間に Vertex へ倒れるため。移行の節を追加した)
- 追加: **AC5 / AC7 — すべての起動定義から `"$@"` を落とす**
(2026-09-03、利用者の指示による。alias では意図した働きをしていないため)

---

# 実装計画

## 関連リンク

- 設計 PR [#148](https://github.com/devbasex/devbase/pull/148)(マージ済み。本ファイルの前半 2 節)

## モード

`standard`。全コンテナの `gemini` の振る舞いが変わる。触るのは `containers/base` の 1 領域。

## 目的と非目的

達成したい状態:

- 起動定義が認証方式を決めない。`GOOGLE_GENAI_USE_VERTEXAI` を設定する記述がどこにも無い
- 全 6 定義から `"$@"` が消える
- 起動定義が Docker 抜きでテストできる場所にある

やらないこと:

- `GOOGLE_CLOUD_PROJECT` がプロジェクトの空上書きを無視してコンテナへ漏れる件の調査
- `~/.gemini/settings.json` の管理
- 他の AI CLI の起動オプションの変更(`"$@"` の除去を除く)

## 受け入れ条件

本ファイル前半の AC1〜AC12 をそのまま使う。

## 修正対象

| ファイル | 変更 |
| --- | --- |
| `containers/base/ai-cli-aliases.sh` | 新規。起動定義の唯一の置き場 |
| `containers/base/Dockerfile` | 上記を `COPY` し `.bashrc` から読み込ませる。インラインの `echo` 群(202-209 行)を落とす |
| `tests/containers/test_ai_cli_aliases.py` | 新規 |
| `docs/user/container-operations.md` | AI CLI の起動定義と、gemini の認証方式の選び方を書く |

## タスク分解

### Task 1: 起動定義をファイルへ出す(振る舞いを変えない)

- **対象ファイル:** `containers/base/ai-cli-aliases.sh`、`containers/base/Dockerfile`、`tests/containers/test_ai_cli_aliases.py`
- **変更内容:** インラインの `echo ... >> ~/.bashrc` 群と同じ内容を `ai-cli-aliases.sh` へ移す。**この段階では `GOOGLE_GENAI_USE_VERTEXAI=true` も `"$@"` もそのまま残す。** Dockerfile は `COPY --chmod=0644 ai-cli-aliases.sh /etc/devbase/ai-cli-aliases.sh` と、`.bashrc` へ読み込み行を 1 行足す形にする。
- **満たす受け入れ条件:** AC9 の土台(テストできる場所へ移す)
- **進め方:** 移した内容が現行と一致することを固定するテストを先に書く。振る舞いを変えないため、テストは移行前後で同じ結果になる。

### Task 2: `GOOGLE_GENAI_USE_VERTEXAI` の強制をやめる

- **対象ファイル:** `containers/base/ai-cli-aliases.sh`、`tests/containers/test_ai_cli_aliases.py`
- **変更内容:** `gemini` の定義から `GOOGLE_GENAI_USE_VERTEXAI=true` の前置を落とす。
- **満たす受け入れ条件:** AC1、AC2、AC3
- **進め方:** 環境の `GOOGLE_GENAI_USE_VERTEXAI` がそのまま子プロセスへ届くこと(設定時/未設定時)を固定する失敗するテストを先に書く。

### Task 3: 全定義から `"$@"` を落とす

- **対象ファイル:** `containers/base/ai-cli-aliases.sh`、`tests/containers/test_ai_cli_aliases.py`
- **変更内容:** 6 定義すべての `"$@"` を削除する。
- **満たす受け入れ条件:** AC4、AC5、AC6、AC7
- **進め方:** 引数がそのままの順序で実体へ届くことを 6 定義分 parametrize で固定し、定義文字列に `$@` が無いことも確認する。

### Task 4: ドキュメント

- **対象ファイル:** `docs/user/container-operations.md`
- **変更内容:** AI CLI の起動定義の一覧と、gemini の認証方式を `GOOGLE_GENAI_USE_VERTEXAI` で選ぶこと、プロジェクト単位で打ち消せることを書く。
- **満たす受け入れ条件:** AC11
- **進め方:** ドキュメントのみ。

### Task 5: 移行

- **対象:** 利用者の環境(リポジトリの差分ではない)
- **変更内容:** `devbase env set GOOGLE_GENAI_USE_VERTEXAI=true` と、`with-ai-dev` / `project-trygroup-prd` の `env` への空上書き。
- **満たす受け入れ条件:** AC12
- **進め方:** 実施の可否を利用者に確認し、結果を完了報告に残す。

## 影響範囲

- 全コンテナの対話シェル。ベースイメージの再ビルドとコンテナ再作成で初めて反映される
- `containers/general` `go` `php` `php85` `latex` `bi-tools` `trygroup` は `FROM devbase-base` のため、base の再ビルド後に各イメージも焼き直しが要る

## リスクと対処

| リスク | 対処 |
| --- | --- |
| 移行を忘れて既存の Vertex 利用者が OAuth へ倒れる | AC12 で完了報告に実施状況を残す。CHANGELOG にも移行手順を書く |
| `.bashrc` からの読み込み行が対話シェル以外で悪さをする | 読み込むファイルは alias 定義と `complete` のみで、副作用を持たない |
| `"$@"` の除去で引数が欠ける | AC7 で 6 定義すべての引数の届き方をテストで固定する |

## 切り戻し手順

コード変更のみ。PR の revert で戻る。移行で共通機密へ入れた `GOOGLE_GENAI_USE_VERTEXAI` は、
revert 後も残るが害はない(旧定義が同じ値を前置していたため)。

## 完了の定義

- [ ] AC1〜AC12 をすべて満たし、条件ごとに検証手段と結果が対応している
- [ ] `uv run pytest tests/ -q` が通る
- [ ] `shellcheck --severity=error containers/base/ai-cli-aliases.sh` が通る
- [ ] `python -m compileall -q lib bin` が通る

## 範囲を広げた判断

- `claudb` が `claude` の alias まで展開し `--dangerously-skip-permissions` を 2 度渡していた
(実コンテナで再現を確認)。書き換えている行そのものが原因で、放置するとテストが重複を
「正」として固定するため範囲に入れ、`command claude` を挟んで解消した(2026-09-03)
Loading
Loading